簡體   English   中英

如何將命令行參數從 pytest 傳遞給代碼

[英]how to pass command line argument from pytest to code

我正在嘗試將參數從 pytest 測試用例傳遞給正在測試的模塊。 例如,使用Python 樣板中的 main.py ,我可以從命令行運行它:

$ python3 main.py
usage: main.py [-h] [-f] [-n NAME] [-v] [--version] arg
main.py: error: the following arguments are required: arg
$ python3 main.py xx
hello world
Namespace(arg='xx', flag=False, name=None, verbose=0)

現在我正在嘗試對 pytest 做同樣的事情,使用以下 test_sample.py

注意: main.py 需要命令行參數。但是這些參數需要在特定的測試中硬編碼,它們不應該是 pytest 的命令行參數。pytest 測試用例只需要將這些值作為命令行參數發送給 main。主要的()。)

import main
def test_case01():
    main.main()
    # I dont know how to pass 'xx' to main.py,
    # so for now I just have one test with no arguments

並按以下方式運行測試:

pytest -vs test_sample.py

這失敗並顯示錯誤消息。 我試圖查看其他答案以尋求解決方案,但無法使用它們。 例如, 42778124建議創建一個單獨的文件 run.py,這不是一個理想的做法。 4835995740880259似乎更多地處理pytest 的命令行參數,而不是將命令行參數傳遞給主代碼。

我不需要 pytest 來獲取命令行參數,這些參數可以在特定測試中進行硬編碼。 但是這些參數需要作為參數傳遞給主代碼。 你能給我一個 test_sample.py,它用一些參數調用 main.main() 嗎?

如果不能修改main方法的簽名,可以使用monkeypatching技術臨時用測試數據替換參數。 示例:想象為以下程序編寫測試:

import argparse


def main():
    parser = argparse.ArgumentParser(description='Greeter')
    parser.add_argument('name')
    args = parser.parse_args()
    return f'hello {args.name}'


if __name__ == '__main__':
    print(main())

從命令行運行時:

$ python greeter.py world
hello world

要使用一些自定義數據測試main函數,monkeypatch sys.argv

import sys
import greeter

def test_greeter(monkeypatch):
    with monkeypatch.context() as m:
        m.setattr(sys, 'argv', ['greeter', 'spam'])
        assert greeter.main() == 'hello spam'

當與參數化技術結合使用時,這允許在不修改測試函數的情況下輕松測試不同的參數:

import sys
import pytest
import greeter

@pytest.mark.parametrize('name', ['spam', 'eggs', 'bacon'])
def test_greeter(monkeypatch, name):
    with monkeypatch.context() as m:
        m.setattr(sys, 'argv', ['greeter', name])
        assert greeter.main() == 'hello ' + name

現在你得到三個測試,每個參數一個:

$ pytest -v test_greeter.py

...

test_greeter.py::test_greeter[spam] PASSED
test_greeter.py::test_greeter[eggs] PASSED
test_greeter.py::test_greeter[bacon] PASSED

一個好的做法可能是擁有這種代碼,而不是從 main 方法中讀取參數。

# main.py
def main(arg1):
    return arg1

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='My awesome script')
    parser.add_argument('word', help='a word')
    args = parser.parse_args()
    main(args.word)

這樣,您的主要方法可以輕松地在 pytest 中進行測試

import main
def test_case01():
    main.main(your_hardcoded_arg)

我不確定您是否可以調用 python 腳本進行測試,除非使用os模塊,這可能不是一個好習慣

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM