如果您无法修改签名main
方法,您可以使用猴子补丁 https://docs.pytest.org/en/latest/monkeypatch.html用测试数据暂时替换参数的技术。示例:想象一下为以下程序编写测试:
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
带有一些自定义数据的函数,monkeypatchsys.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'
当与参数化 https://docs.pytest.org/en/latest/parametrize.html技术,这允许轻松测试不同的参数而无需修改测试函数:
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