如何为pytest测试用例批量传入列表中的所有元素
嘿,这个问题我熟!要让pytest把列表里的每个整数都单独跑一次test_mt测试,有两种实用的方法,我给你详细唠唠:
方法1:用pytest-lazy-fixture结合参数化(直观好懂)
这种方法特别适合你已经用fixture生成参数列表的场景,操作起来很简单:
- 先装个小插件(它能帮我们在参数化里引用fixture的返回值):
pip install pytest-lazy-fixture
- 修改你的
conftest.py,把原来的fixture改成返回整数列表(记得去掉autouse=True,因为我们要主动用它):
# conftest.py import pytest @pytest.fixture(scope="session") def number_list(request): # 实际测试里换成从文件读取的逻辑就行,文件路径可以用request.config.getoption拿命令行参数 list_int = [1, 2, 3, 4] return list_int
- 在测试文件里给
test_mt加个参数化装饰器,用lazy_fixture引用刚才的fixture:
# my_test.py import pytest @pytest.mark.parametrize("some_number", pytest.lazy_fixture("number_list")) def test_mt(some_number): assert some_number == 4
跑测试的时候,pytest会自动把number_list里的每个元素挨个传给some_number,生成4个独立的测试用例——只有参数是4的时候断言能过,其他都会失败,完全符合你的需求。
方法2:用pytest_generate_tests钩子(不用装插件)
要是你不想装第三方插件,用pytest自带的钩子函数也能搞定:
- 修改
conftest.py,加个钩子函数来动态生成测试参数:
# conftest.py def pytest_generate_tests(metafunc): # 先看看测试函数有没有用到`some_number`这个参数 if "some_number" in metafunc.fixturenames: # 这里替换成从文件读取整数列表的逻辑 list_int = [1, 2, 3, 4] # 给测试函数动态参数化 metafunc.parametrize("some_number", list_int)
- 测试文件啥都不用改,保持你原来的代码就行:
# my_test.py import pytest def test_mt(some_number): assert some_number == 4
这种方式会自动识别所有带some_number参数的测试函数,用你的整数列表来生成测试用例,效果和方法1一模一样,还不用额外装东西。
对了,要是你需要从命令行传文件路径,还可以在conftest.py里加个命令行选项:
# conftest.py def pytest_addoption(parser): parser.addoption("--data-file", action="store", help="Path to the file with integers to test") # 然后在fixture或者钩子函数里拿这个路径: # 比如方法1的fixture里可以这么写: file_path = request.config.getoption("--data-file") # 接着就用file_path去读文件生成list_int就行
之后跑测试的时候就用pytest --data-file=你的文件路径.txt来传参数,完美适配你实际测试的场景~
内容的提问来源于stack exchange,提问作者Some Name




