You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为pytest测试用例批量传入列表中的所有元素

嘿,这个问题我熟!要让pytest把列表里的每个整数都单独跑一次test_mt测试,有两种实用的方法,我给你详细唠唠:

方法1:用pytest-lazy-fixture结合参数化(直观好懂)

这种方法特别适合你已经用fixture生成参数列表的场景,操作起来很简单:

  1. 先装个小插件(它能帮我们在参数化里引用fixture的返回值):
pip install pytest-lazy-fixture
  1. 修改你的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
  1. 在测试文件里给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自带的钩子函数也能搞定:

  1. 修改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)
  1. 测试文件啥都不用改,保持你原来的代码就行:
# 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

火山引擎 最新活动