ToB企服应用市场:ToB评测及商务社交产业平台

标题: Pytest框架 — 12、Pytest的标记(三)(重复执行) [打印本页]

作者: 大号在练葵花宝典    时间: 2022-9-16 17:20
标题: Pytest框架 — 12、Pytest的标记(三)(重复执行)
目录

1、前言

在自动化测试的时候我们可能会遇到某些原因,如模块不稳定等,出现一些测试失败,此时我们想要针对单个用例或者单个模块重复执行多次,以确定测试失败的真正原因。在Pytest中可以通过插件pytest-repeat来实现。
安装方式:pip install pytest-repeat
2、--count参数使用

(一)在命令行或者main函数使用

pytest -s -v ./xxx.py --count=3
pytest.main(["-vs","xxx.py","--count=3"])
示例:
  1. def test_1():
  2.     print("测试1")
  3.     assert True
  4. def test_2():
  5.     print("测试2")
  6.     assert False
  7. """
  8. 执行结果
  9. mark/repeat/repeat_count.py::test_1[1-3] 测试1
  10. PASSED
  11. mark/repeat/repeat_count.py::test_1[2-3] 测试1
  12. PASSED
  13. mark/repeat/repeat_count.py::test_1[3-3] 测试1
  14. PASSED
  15. mark/repeat/repeat_count.py::test_2[1-3] 测试2
  16. FAILED
  17. mark/repeat/repeat_count.py::test_2[2-3] 测试2
  18. FAILED
  19. mark/repeat/repeat_count.py::test_2[3-3] 测试2
  20. FAILED
  21. """
复制代码
(二)在全局配置文件中使用

在pytest.ini配置文件中addopts添加count参数
  1. [pytest]
  2. addopts = -s -v --count 2
  3. testpaths = scripts
  4. python_files = test_*.py
  5. python_classes = Test*
  6. python_functions = test*
复制代码
示例:
  1. def test_1():
  2.     print("测试1")
  3.     assert True
  4. def test_2():
  5.     print("测试2")
  6.     assert False
  7. """
  8. 执行结果
  9. mark/repeat/repeat_count.py::test_1[1-2] 测试1
  10. PASSED
  11. mark/repeat/repeat_count.py::test_1[2-2] 测试1
  12. PASSED
  13. mark/repeat/repeat_count.py::test_2[1-2] 测试2
  14. FAILED
  15. mark/repeat/repeat_count.py::test_2[2-2] 测试2
  16. FAILED
  17. """
复制代码
3、--repeat-scope参数使用

从上面的示例中可以看到测试1先执行了3次,然后测试2再执行3次,有些时候我们想整体执行3次,这就需要用到--repeat-scope参数。类似于fixture的scope也可以设置范围
  1. class TestClass_1:
  2.     def test_method_1(self):
  3.         print("类1测试方法1")
  4.     def test_method_2(self):
  5.         print("类1测试方法2")
  6. class TestClass_2:
  7.     def test_method_1(self):
  8.         print("类2测试方法1")
  9.     def test_method_2(self):
  10.         print("类2测试方法2")
复制代码
  1. """
  2. 执行结果
  3. mark/repeat/repeat_scope.py::TestClass_1::test_method_1[1-2] 类1测试方法1
  4. PASSED
  5. mark/repeat/repeat_scope.py::TestClass_1::test_method_2[1-2] 类1测试方法2
  6. PASSED
  7. mark/repeat/repeat_scope.py::TestClass_1::test_method_1[2-2] 类1测试方法1
  8. PASSED
  9. mark/repeat/repeat_scope.py::TestClass_1::test_method_2[2-2] 类1测试方法2
  10. PASSED
  11. mark/repeat/repeat_scope.py::TestClass_2::test_method_1[1-2] 类2测试方法1
  12. PASSED
  13. mark/repeat/repeat_scope.py::TestClass_2::test_method_2[1-2] 类2测试方法2
  14. PASSED
  15. mark/repeat/repeat_scope.py::TestClass_2::test_method_1[2-2] 类2测试方法1
  16. PASSED
  17. mark/repeat/repeat_scope.py::TestClass_2::test_method_2[2-2] 类2测试方法2
  18. PASSED
  19. """
复制代码
  1. """
  2. 执行结果
  3. mark/repeat/repeat_scope.py::TestClass_1::test_method_1[1-2] 类1测试方法1
  4. PASSED
  5. mark/repeat/repeat_scope.py::TestClass_1::test_method_2[1-2] 类1测试方法2
  6. PASSED
  7. mark/repeat/repeat_scope.py::TestClass_2::test_method_1[1-2] 类2测试方法1
  8. PASSED
  9. mark/repeat/repeat_scope.py::TestClass_2::test_method_2[1-2] 类2测试方法2
  10. PASSED
  11. mark/repeat/repeat_scope.py::TestClass_1::test_method_1[2-2] 类1测试方法1
  12. PASSED
  13. mark/repeat/repeat_scope.py::TestClass_1::test_method_2[2-2] 类1测试方法2
  14. PASSED
  15. mark/repeat/repeat_scope.py::TestClass_2::test_method_1[2-2] 类2测试方法1
  16. PASSED
  17. mark/repeat/repeat_scope.py::TestClass_2::test_method_2[2-2] 类2测试方法2
  18. PASSED
  19. """
复制代码
4、@pytest.mark.repeat(count)装饰器使用

还可以在测试代码中使用@pytest.mark.repeat(count)装饰器来标记需要重复执行的测试。
  1. import pytest
  2. @pytest.mark.repeat(2)
  3. def test_1():
  4.     print("测试函数1")
  5. def test_2():
  6.     print("测试函数2")
  7. class TestClass:
  8.     def test_1(self):
  9.         print("类中测试方法1")
  10.     @pytest.mark.repeat(3)
  11.     def test_2(self):
  12.         print("类中测试方法2")
  13. """
  14. 执行结果
  15. mark/repeat/repeat_mark.py::test_1[1-2] 测试函数1
  16. PASSED
  17. mark/repeat/repeat_mark.py::test_1[2-2] 测试函数1
  18. PASSED
  19. mark/repeat/repeat_mark.py::test_2 测试函数2
  20. PASSED
  21. mark/repeat/repeat_mark.py::TestClass::test_1 类中测试方法1
  22. PASSED
  23. mark/repeat/repeat_mark.py::TestClass::test_2[1-3] 类中测试方法2
  24. PASSED
  25. mark/repeat/repeat_mark.py::TestClass::test_2[2-3] 类中测试方法2
  26. PASSED
  27. mark/repeat/repeat_mark.py::TestClass::test_2[3-3] 类中测试方法2
  28. PASSED
  29. """
复制代码
注意:使用装饰器标记的重复执行用例不受参数执行的影响,即当上面例子在执行时使用--count=5,标记过的测试用例以装饰器标记次数为准,其他未标记的测试用例会执行5次。
5、结合参数x使重复执行在失败时停止

如果遇到间歇性bug,可以在命令中--count与-x结合使用,重复执行测试用例,直到测试失败停止。
pytest -vs -x xxx.py --count=100
这样将运行100次,一旦遇到失败就会停止。
参考:https://www.cnblogs.com/yoyoketang/p/9800961.html

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4