Python 在pytest中参数化并运行单个测试

Python 在pytest中参数化并运行单个测试,python,python-2.7,testing,automated-tests,pytest,Python,Python 2.7,Testing,Automated Tests,Pytest,如何从配置了参数化的集合中运行单个测试? 假设我有以下测试方法: @pytest.mark.parametrize(PARAMETERS_LIST, PARAMETERS_VALUES) def test_my_feature(self, param1, param2, param3): """ test doc """ if param1 == 'value': assert True else: print 'not v

如何从配置了参数化的集合中运行单个测试? 假设我有以下测试方法:

@pytest.mark.parametrize(PARAMETERS_LIST, PARAMETERS_VALUES)
def test_my_feature(self, param1, param2, param3):
    """
    test doc
    """
    if param1 == 'value':
        assert True
    else:
        print 'not value'
        assert False
我有3个参数,我为它们生成了一个包含15个不同可能值的列表,用于测试函数

我怎么能只运行其中一个?除了一种明显的方法-给出一个值而不是15。

您可以使用
-k
标志来过滤匹配字符串表达式的测试。使用参数化时,pytest使用以下约定命名每个测试用例:

测试名称['-'分离的测试输入]

比如说

test_name[First_test_value-Second_test_value-N_test_value]
pytest -k 'my_test[value_1-value_2]'
例如,选择一个要运行的特定测试就是将上述所有测试放在一起的问题

test_name[First_test_value-Second_test_value-N_test_value]
pytest -k 'my_test[value_1-value_2]'


你需要避开方括号。

我可以想出两种可能的解决方案

  • 使用要运行的测试的名称并执行它
  • 使用
    -k
    参数运行与给定子字符串表达式匹配的测试
  • 解决方案1 使用以下命令查看测试的名称,而不运行它们:

    pytest --collect-only -q # use --co if pytest 5.3.0+ instead of --collect-only
    
    使用要运行的测试的名称,假设该测试名为
    test\u file\u name.py::test\u name[value1-value2-value3]
    ,因此使用以下命令运行它:

    pytest测试文件名称.py::测试名称[value1-value2-value3]
    
    注意:如果标识符中有空格,请务必使用引号

    解决方案2 该解决方案由Enrique Saez提供,基本上包括通过部分测试名称:

    pytest -k -value3]
    

    -k
    选项使用子字符串匹配,因此您还可以传入足够多的测试“name”,使其唯一。因此,类似于
    pytest-k mytest[value\u 1]
    甚至
    pytest-k value\u 2]
    的东西也可以工作。
    -k
    选项应该在
    的“mytest[value\u 1]”
    中给出。当我尝试在没有此选项的情况下运行时,PyTest抛出错误
    找不到模式