1. 前言

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

2. 环境前提

  • Python 2.7、3.4+或PyPy
  • py.test 2.8或更高版本

3. 安装插件

  1. pip3 install pytest-repeat -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

4. 快速入门

结合之前讲到的失败重跑、输出 html 报告插件来敲命令行
两种方式皆可,等号或空格

  • count=2
  • count 2
    1. pytest --html=report.html --self-contained-html -s --reruns=5 --count=2 10fixture_request.py

5. 重复测试直到失败(重点!)

  • 如果需要验证偶现问题,可以一次又一次地运行相同的测试直到失败,这个插件将很有用
  • 可以将 pytest 的 -x 选项与 pytest-repeat 结合使用,以强制测试运行程序在第一次失败时停止
    1. pytest --count=1000 -x test_file.py

5.1 小栗子

  1. def test_example():
  2. import random
  3. flag = random.choice([True, False])
  4. print(flag)
  5. assert flag

5.2 执行命令

  1. pytest -s --count 5 -x 13repeat.py

5.3 执行结果

image.png

6. @pytest.mark.repeat(count)

如果要在代码中将某些测试用例标记为执行重复多次,可以使用装饰器@pytest.mark.repeat(count)

  1. @pytest.mark.repeat(5)
  2. def test_repeat():
  3. print("测试用例执行")

6.1 执行命令

  1. pytest -s 13repeat.py

6.2 执行结果

image.png

7. —repeat-scope

7.1 作用

  • 命令行参数
  • 可以覆盖默认的测试用例执行顺序,类似fixture的scope参数

7.2 可取值

  • function:默认,范围针对每个用例重复执行,再执行下一个用例
  • class:以class为用例集合单位,重复执行class里面的用例,再执行下一个
  • module:以模块为单位,重复执行模块里面的用例,再执行下一个
  • session:重复整个测试会话,即所有测试用例的执行一次,然后再执行第二次

7.3 案例一:class

  1. class Test_repeat:
  2. def test_repeat3(self):
  3. print("测试用例执行333")
  4. class Test_repeat2:
  5. def test_repeat3(self):
  6. print("测试用例执行444")

7.3.1 执行命令

  1. pytest -s --count=2 --repeat-scope=class 13repeat.py

7.3.2 执行结果

image.png

7.4 案例二:module

  1. def test_repeat1():
  2. print("测试用例执行111")
  3. def test_repeat2():
  4. print("测试用例执行222")
  5. class Test_repeat:
  6. def test_repeat3(self):
  7. print("测试用例执行333")

7.4.1 执行命令

  1. pytest -s --count=2 --repeat-scope=module 13repeat.py

7.4.2 执行结果

image.png

8. 兼容性问题

pytest-repeat 不能与 unittest.TestCase 测试类一起使用;无论 —count 设置多少,这些测试始终仅运行一次,并显示警告