当前位置: 代码迷 >> 综合 >> 29.pytest_重复执行用例(pytest-repeat)
  详细解决方案

29.pytest_重复执行用例(pytest-repeat)

热度:74   发布时间:2023-09-19 01:29:20.0

平常在做功能测试的时候,经常会遇到某个模块不稳定,偶然会出现一些bug,对于这种问题我们会针对此用例反复执行多次,最终复现出问题来。
自动化运行用例时候,也会出现偶然的bug,可以针对单个用例,或者针对某个模块的用例重复执行多次。

pytest-repeat

pytest-repeat是pytest的一个插件,用于重复执行单个用例,或多个测试用例,并指定重复次数,pytest-repeat支持的版本:

  • 安装:
pip install pytest-repeat
  • 使用--count命令行选项指定要运行测试用例和测试次数
py.test --count=10 test_file.py
  • 案例:
import pytest@pytest.fixture()
def open():assert 2==3def test_01():print("测试用例test_01_suhu-----------")assert 2==2def test_02():print("测试用例test_02_suhu------------")assert 1==2def test_03(open):print("测试用例test_03_suhu---------------")assert 3==3if __name__ == "__main__":pytest.main(["-s", "test_suhu_01.py"])

执行命令如下:

pytest --count 3 test_suhu_02.py

运行结果如下:可见确实重复执行了三次:

========================= short test summary info ==========================
FAILED test_suhu_02.py::test_02[1-3] - assert 1 == 2
FAILED test_suhu_02.py::test_02[2-3] - assert 1 == 2
FAILED test_suhu_02.py::test_02[3-3] - assert 1 == 2
ERROR test_suhu_02.py::test_03[1-3] - assert 2 == 3
ERROR test_suhu_02.py::test_03[2-3] - assert 2 == 3
ERROR test_suhu_02.py::test_03[3-3] - assert 2 == 3
================== 3 failed, 3 passed, 3 errors in 0.13s ===================

从运行的用例结果看,是先重复3次test_01,再重复3次test_02…有时候我们希望执行的顺序是test_01,test_02.test_03按这样顺序重复3次,接下来就用到一个参数–repeat-scope

–repeat-scope

--repeat-scope类似于pytest fixture的scope参数,--repeat-scope也可以设置参数: session , module,class或者function(默认值)- function(默认)范围针对每个用例重复执行,再执行下一个用例
- classclass为用例集合单位,重复执行class里面的用例,再执行下一个
- module 以模块为单位,重复执行模块里面的用例,再执行下一个
- session 重复整个测试会话,即所有收集的测试执行一次,然后所有这些测试再次执行等等
使用--repeat-scope=session重复执行整个会话用例

案例:

import pytest@pytest.fixture()
def open():assert 2==3
class TestCase01():def test_01(self):print("测试用例test_01_suhu-----------")assert 2==2class TestCase02():def test_02(self):print("测试用例test_02_suhu------------")assert 1==2def test_03(self):print("测试用例test_03_suhu---------------")assert 3==3if __name__ == "__main__":pytest.main(["-s", "test_suhu_01.py"])

运行:

pytest -s --count=5 --repeat-scope=class

以class为用例集合单位,重复执行class里面的用例,再执行下一个

@pytest.mark.repeat(count)

如果要在代码中标记要重复多次的测试,可以使用@pytest.mark.repeat(count)装饰器

import pytest@pytest.fixture()
def open():assert 2==3class TestCase01():def test_01(self):print("测试用例test_01_suhu-----------")assert 2==2
@pytest.mark.repeat(3)
class TestCase02():def test_02(self):print("测试用例test_02_suhu------------")assert 1==2def test_03(self):print("测试用例test_03_suhu---------------")assert 3==3if __name__ == "__main__":pytest.main(["-s", "test_suhu_01.py"])

这样执行用例时候,就不用带上–count参数,只针对TestCase02类下的方法重复执行3次,当然也可以修饰方法;

重复测试直到失败

如果尝试诊断间歇性故障,那么一遍又一遍地运行相同的测试直到失败是有用的。您可以将pytest-x选项与pytest-repeat结合使用,以强制测试运行器在第一次失败时停止。例如:

py.test --count=1000 -x test_file.py

这将尝试运行test_file.py 1000次,但一旦发生故障就会停止

  相关解决方案