18

我有一个对象数组,需要为测试类中的每个测试运行这些对象。我想参数化TestClass中的每个测试函数。最终目标是拥有类似的东西:

@pytest.mark.parametrize(“测试输入”,[1,2,3,4])类测试类:定义test_something1(自我,测试输入):#这里的测试代码,每次为参数化运行

但根据我的理解,您不能传递输入参数,或者至少调用@pytest.mark.框架化在一个类中,这些标记的意思是定义

我现在拥有的:

类测试类:定义test_something1(自我):对于我来说:#在此处测试代码定义test_something2(自我):对于我来说:#在此处测试代码...

有没有一种方法可以将类本身或TestClass中的每个函数参数化?也许是一个@pytest.mark.参数化在内部@pytest.fixture。。。(自动使用=真)。

我想把我的测试组织成一个类,因为它反映了我正在测试的文件。因为我在至少十几个不同的测试中循环这些对象,所以调用类的循环比在每个测试中更容易定义.

4
  • 如果py.test测试不支持这一点(我不确定它是否支持),那么你可以使用元类很容易地实现它。
    – 维姆
    评论 2016年8月2日19:34
  • 你在顶部展示的例子很好。。。
    – 编译器
    评论 2016年8月3日9:15
  • 事实上不是这样。@pytests.mark.parametrize只适用于defs,不适用于class 评论 2016年8月3日17:46
  • @同志,我对你的问题补充了一个答案。 评论 2019年5月10日6:33

2个答案2

重置为默认值
45

你可以申请参数化到班级。发件人文档:

@pytest.mark.参数化允许在测试函数或.

相同的数据将发送到类中的所有测试方法。

@pytest.mark.parametrize(“测试输入”,[1,2,3,4])类测试类:定义test_something1(自我,测试输入):通过定义test_something2(自我,测试输入):通过

如果使用以下命令运行测试pytest-v型您将获得以下输出:

===============================================================================测试会话开始============================================================================================平台darwin--Python 3.7.3、pytest-4.4.2、py-1.8.0、pluggy-0.11.0--/Users/user/.local/share/virtualenvs/stack-overflow-pycharm-L-07rBZ9/bin/python3.7缓存目录:.pytest_cacherootdir:/Users/user/Documents/spikes/stack-overlfow-pycharm收集了8个项目test_class.py::TestClass::test_something1[1]通过[12%]test_class.py::TestClass::test_something1[2]通过[25%]test_class.py::TestClass::test_something1[3]通过[37%]test_class.py::TestClass::test_something1[4]通过[50%]test_class.py::TestClass::test_something2[1]通过[62%]test_class.py::TestClass::test_something2[2]通过[75%]test_class.py::TestClass::test_something2[3]通过[87%]test_class.py::TestClass::test_something2[4]通过[100%]====~========2===:===>===]===+===_====1===%====0.====3===<=======#===0===*===8秒通过0.03秒=========================================================================================

这正是你想要的。

4
  • 使用此语法,是否也可以参数化setup_method()?参数似乎不适用于setup_method。它可能会搜索带有test_前缀的方法。 评论 2020年10月14日10:04
  • 7
    不幸的是,如果测试类继承自单元测试。测试用例,在某些情况下可能需要。 评论 2021年5月24日9:04
  • 1
    我一直在寻找这个解决方案,但这里每个测试函数。运行提供的输入参数,然后执行到其他测试函数。是可能的for 1s迭代,所有函数。运行类的,然后开始第二次迭代,类似于:testsomething1[1]testsomesting2[1]testsmething1[2]testsomexing2[2]
    – D代码
    评论 2021年10月23日10:14
  • @延迟响应,但普遍认为测试对其执行顺序敏感,或者依赖于任何其他必须运行的测试函数或方法,这是一个非常糟糕的主意。如果一个测试设置了另一个测试需要的状态,请考虑将它们组合成一个长时间运行的序列“,然后用户执行THIS”测试,或者(从长远来看可能更好)创建setup_X()函数,每个测试都可以调用该函数来设置其需要独立运行的初始状态。 评论 2023年3月9日3:12
7

我已经解决了。我把它过于复杂了;我可以使用传递参数的fixture函数来代替标记。

在我找到答案之前(没有参数化):

类测试类:定义test_something(自我):对于example_params中的i:打印(i)

回答,使用pytest夹具。将执行相同的操作,但只需要输入,而不是for循环:

导入pytestexample_params=[1,2,3]@pytest.fixture(params=example_params)def param_loop(请求):返回请求.param类测试类:定义test_something(self,param_loop):打印(param_loop)

因此,要参数化所有定义秒:

  1. 使用@pytest.ffixture(参数=[])上的装饰器定义my_function(请求)
  2. 内部我的函数(_F),返回请求.param
  3. 添加我的函数(_F)要参数化的任何函数的输入
5
  • 我无意中听到了你的评论,因为我正在寻找答案,然而,如果我尝试按照你解释的方式执行测试,我会得到错误:失败:不允许访问数据库,请使用“django_db”标记或“db”或“transactional_db”装置来启用它。如果我把示例参数在课堂上我通过了这个错误,但随后我得到了这个错误参数_循环缺少。你也有同样的问题吗@科拉德斯基
    – dsax7型
    评论 2017年4月17日20:29
  • 另请参见在这里在这里 评论 2018年7月5日16:39
  • 可以使用参数化函数的特定方法类TestMyCustomTestCase避免这种变通方法。 评论 2020年1月8日8:50
  • 与.parametrize()一样,此解决方案在继承自单元测试。测试用例. 评论 2023年3月9日3:20
  • 请注意,将for-loop放在中间的解决方案并不理想,因为它没有在报告中将单个参数显示为单独的测试。在第一次失败后,它也无法继续测试其他参数。要解决此问题,请使用pytest测试。或使用参数化当它有意义的时候。 评论 2023年12月15日18:22

你的答案

点击“发布您的答案”,即表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.