文章目录
- 前言
- 应用场景
- 插件安装
- 参数分析
- 使用方式一:命令行
- 使用方式二:配置文件
- 使用方式三:装饰器
前言
pytest框架中的**重复测试(pytest-repeat)**插件的用途是允许在运行测试用例时进行多次循环,以更全面地评估代码的稳定性。
它可以帮助发现和解决潜在问题,特别是在某些场景下,自动化测试时某个用例时好时坏,为了排查这类问题,需要对用例进行重复执行。
应用场景
- 不稳定的测试:当测试用例由于某种原因(如外部资源的不稳定性、网络延迟等)而偶尔失败时,
pytest-repeat
可以帮助你通过多次运行这些用例来识别和隔离这些问题。- 概率性测试:对于测试那些依赖于概率或随机性的功能(如抽奖活动、随机排序等),
pytest-repeat
允许你运行测试用例多次,从而收集更准确的统计数据和结果。- 性能评估:虽然
pytest-repeat
的主要目标不是性能测试,但它也可以用于评估在重复执行测试时系统或应用的性能。
插件安装
安装命令:
pip install pytest-repeat
参数分析
–count
- 用途:指定整个测试套件应重复运行的次数。
- 含义:当你使用这个参数时,pytest 将运行整个测试套件指定的次数,而不是仅仅重复运行失败的测试用例。
- 源码解释:在
pytest_collection_modifyitems
钩子函数中,pytest-repeat
会根据--count
参数的值来复制整个测试项列表,从而增加测试套件的运行次数。–repeat-scope
- 用途:指定重复运行的范围,可以是
session
、function
或class
。- 含义:这个参数决定了重复运行是应用于整个测试会话(
session
),还是仅应用于单个函数或类级别的测试用例。- 源码解释:在
pytest_collection_modifyitems
钩子函数中,pytest-repeat
会根据--repeat-scope
参数的值来决定如何复制测试项。如果设置为session
,则整个测试套件会被复制;如果设置为function
,则只有函数级别的测试用例会被复制;如果设置为class
,则类级别的测试用例会被复制。吐槽一下:
--repeat-scope
参数究极迷惑,--count
参数默认是绑定--repeat-scope=function
的,但是由于--repeat-scope
参数独立工作的,并不是按照类或模块进行分类重复执行,这里无论是否携带--repeat-scope
参数,在结果上都是一致的,看网上大佬们的解读,说是体现在分组上。
使用方式一:命令行
示例代码
def test_case_01():
assert 1 == 1, "断言失败"
def test_case_02():
assert 1 == 2, "断言失败"
class TestClassDemo1:
def test_case_03(self):
assert 1 == 1, "断言失败"
def test_case_04(self):
assert 1 == 1, "断言失败"
执行结果
使用方式二:配置文件
pytest.ini
配置文件
[pytest]
addopts = -v -s --count 2
示例代码
def test_case_01():
assert 1 == 1, "断言失败"
def test_case_02():
assert 1 == 2, "断言失败"
class TestClassDemo1:
def test_case_03(self):
assert 1 == 1, "断言失败"
def test_case_04(self):
assert 1 == 1, "断言失败"
执行结果
使用方式三:装饰器
示例代码
import pytest
@pytest.mark.repeat(2)
def test_case_01():
assert 1 == 1, "断言失败"
def test_case_02():
assert 1 == 2, "断言失败"
@pytest.mark.repeat(2)
class TestClassDemo1:
def test_case_03(self):
assert 1 == 1, "断言失败"
def test_case_04(self):
assert 1 == 1, "断言失败"
执行结果