首页 > 解决方案 > pytest:从命令行传递列表作为参数不起作用

问题描述

当我使用 list 作为命令行参数运行 pytest 时,我面临以下错误。

pytest -vs test_sample.py --html=results.html --A_list=[A1, A2, A3]

错误:找不到文件:A2,

下面是我的test_sample.py代码

import pytest

def test_functionality(A_list):
    print("element in list: {}".format(A_list))

下面是我的conftest.py代码

def pytest_addoption(parser):
    parser.addoption("--A_list", action="store", default="default name")

def pytest_generate_tests(metafunc):
    option_value = metafunc.config.option.A_list
    if 'A_list' in metafunc.fixturenames and option_value is not None:
        metafunc.parametrize("A_list", [option_value])

如果我只传递一个如下所示的元素,这工作正常

pytest -vs test_sample.py --html=results.html --A_list=A1

但是,如果我使用 A_list 的元素列表运行 pytest,它会失败,如下所示

    pytest -vs test_sample.py --html=results.html --A_list=[A1, A2, A3]

谁能让我知道如何从命令行将列表作为 pytest 参数传递...

标签: python-3.xpytest

解决方案


问题是您尝试将 Python 列表作为命令行参数传递。这不起作用 - 命令行参数只是需要解析的字符串。特别是如果您不使用撇号将其括起来,则选项中不能有空格。

您可以做的是将列表作为字符串传递,例如通过逗号分隔条目:

pytest -vs test_sample.py --html=results.html --A_list="A1,A2,A3"

请注意,这里严格不需要撇号,因为您没有空格,但无论如何您都可以使用它们。然后您可以将字符串解析为列表:

def pytest_generate_tests(metafunc):
    option_value = metafunc.config.option.A_list
    if option_value:
        params = option_value.split(",")
        if 'A_list' in metafunc.fixturenames:
            metafunc.parametrize("A_list", params)

推荐阅读