![](/img/trans.png)
[英]'>' is not recognising as a command line Argument ? How to Pass this as a command Line Argument?
[英]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,這不是一個理想的做法。 而48359957和40880259似乎更多地處理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.