Если вы не можете изменить сигнатуру метода 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