当前位置: 首页 > 面试题库 >

如何在py.test运行中多次重复每个测试?

易星纬
2023-03-14
问题内容

我想依次运行每个选定的py.test项目任意次。
我没有看到任何标准的py.test机制来执行此操作。

我试图做到这一点pytest_collection_modifyitems()。我修改了传入的项目列表,以多次指定每个项目。测试项目的第一次执行可以按预期工作,但是这似乎对我的代码造成了一些问题。

此外,我希望每次运行都具有唯一的测试项目对象,因为我在各种报告代码中都使用id(项目)作为键。不幸的是,我找不到任何py.test代码来复制测试项目,copy.copy()无法正常工作,并copy.deepcopy()得到了异常。

有人可以建议多次执行测试的策略吗?


问题答案:

为了多次运行每个测试,我们将在生成测试时以编程方式对每个测试进行参数化。

首先,让我们添加解析器选项(在您的conftest.py中添加以下内容):

def pytest_addoption(parser):
    parser.addoption('--repeat', action='store',
        help='Number of times to repeat each test')

现在,我们添加一个“ pytest_generate_tests”挂钩。这就是魔术发生的地方。

def pytest_generate_tests(metafunc):
    if metafunc.config.option.repeat is not None:
        count = int(metafunc.config.option.repeat)

        # We're going to duplicate these tests by parametrizing them,
        # which requires that each test has a fixture to accept the parameter.
        # We can add a new fixture like so:
        metafunc.fixturenames.append('tmp_ct')

        # Now we parametrize. This is what happens when we do e.g.,
        # @pytest.mark.parametrize('tmp_ct', range(count))
        # def test_foo(): pass
        metafunc.parametrize('tmp_ct', range(count))

在没有重复标志的情况下运行:

(env) $ py.test test.py -vv
============================= test session starts ==============================
platform darwin -- Python 2.7.5 -- py-1.4.20 -- pytest-2.5.2 -- env/bin/python
collected 2 items

test.py:4: test_1 PASSED
test.py:8: test_2 PASSED

=========================== 2 passed in 0.01 seconds ===========================

使用重复标志运行:

(env) $ py.test test.py -vv --repeat 3
============================= test session starts ==============================
platform darwin -- Python 2.7.5 -- py-1.4.20 -- pytest-2.5.2 -- env/bin/python
collected 6 items

test.py:4: test_1[0] PASSED
test.py:4: test_1[1] PASSED
test.py:4: test_1[2] PASSED
test.py:8: test_2[0] PASSED
test.py:8: test_2[1] PASSED
test.py:8: test_2[2] PASSED

=========================== 6 passed in 0.01 seconds ===========================

进一步阅读:

  • https://pytest.org/latest/plugins.html#well-specified-hooks
  • https://pytest.org/latest/example/parametrize.html


 类似资料:
  • 这里我用java开发。 我有一个for循环中的线程,我想连续运行5次。不幸的是,循环在第二次运行时停止,出现了一个错误: 异常在线程"main"java.lang.IllegalThreadStateExctive在java.base/java.lang.Thread.start(Thread.java:793) 我知道这个错误是什么意思,但是我要求他在确定完成线程时恢复循环,这样就不会有任何错误

  • 我想在测试套件中的每个测试之前和之后运行其他设置和拆卸检查。我看过赛程,但不确定它们是否是正确的方法。我需要在每次测试之前运行设置代码,并且需要在每次测试后运行拆卸检查。 我的用例是检查没有正确清理的代码:它会留下临时文件。在我的设置中,我将检查文件,在拆解中我也会检查文件。如果有额外的文件,我希望测试失败。

  • 问题内容: 我想开始为我的Python代码编写单元测试,而py.test框架听起来比Python捆绑的unittest更好。因此,我在项目中添加了“ tests”目录,并在其中添加了test_sample.py。现在,我想配置PyCharm以运行“ tests”目录中的所有测试。 据称,PyCharm在其测试运行程序中支持py.test。您应该能够创建运行/调试配置来运行测试,并且PyCharm据

  • 问题内容: 我正在尝试测试tensorflow程序。我正在使用参数化的py.test夹具设置tensorflow会话: Tensorflow具有全局状态,因此一些测试启动会污染它。例如,启用急切执行后,无法禁用它。有没有一种方法可以指示py.test为每个测试创建一个新进程?还是使用参数化夹具来配置测试环境的另一种方法?用法示例: 问题答案: 如评论中所建议,使用将是解决方案。该插件设计用于并行或

  • 我正在php上研究多对多关系,我有3个表,包括电影名称和电影id的movie表genre表包括类型和类型id的movie_genre表包括电影id和类型id的movie_genre表 genre表有这些值 我使用下面的代码来获取数据 但结果将类似于 movie_id movie_name genre[1] movie_id movie_name genre[2] movie_id movie_na

  • 我目前有一个cucumber的考试数量,它们都在一个特定的标签下,以便这些特定的可以再次运行,一旦我对我的更改感到满意,它们就会被更改为更通用的,它们作为CI套件的一部分运行等。 我当前用于运行该组测试的命令是: 我可以在这个命令中添加什么,以使这些特定的测试在循环中运行?i、 e.我想在这个标签下运行这些特定的测试,比如20次(而不是每次都要等待完成并手动输入命令)。 我试着四处寻找一些例子,但