平常在做功能测试的时候,经常会遇到某个模块不稳定,偶然会出现一些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(默认)范围针对每个用例重复执行,再执行下一个用例
- class 以class为用例集合单位,重复执行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次,但一旦发生故障就会停止