Pytest精通指南(22)钩子函数-重复执行(pytest-repeat)

46 篇文章 2 订阅
32 篇文章 3 订阅
本文详细介绍了pytest框架中的pytest-repeat插件,包括其在不稳定测试、概率性测试和性能评估中的应用,以及如何通过命令行、配置文件和装饰器进行安装和配置。重点讲解了--count和--repeat-scope参数的作用和使用方式。
摘要由CSDN通过智能技术生成


请添加图片描述

前言

pytest框架中的**重复测试(pytest-repeat)**插件的用途是允许在运行测试用例时进行多次循环,以更全面地评估代码的稳定性。

它可以帮助发现和解决潜在问题,特别是在某些场景下,自动化测试时某个用例时好时坏,为了排查这类问题,需要对用例进行重复执行。

应用场景

  • 不稳定的测试:当测试用例由于某种原因(如外部资源的不稳定性、网络延迟等)而偶尔失败时,pytest-repeat可以帮助你通过多次运行这些用例来识别和隔离这些问题。
  • 概率性测试:对于测试那些依赖于概率或随机性的功能(如抽奖活动、随机排序等),pytest-repeat允许你运行测试用例多次,从而收集更准确的统计数据和结果。
  • 性能评估:虽然pytest-repeat的主要目标不是性能测试,但它也可以用于评估在重复执行测试时系统或应用的性能。

插件安装

安装命令pip install pytest-repeat

请添加图片描述

参数分析

–count

  • 用途:指定整个测试套件应重复运行的次数。
  • 含义:当你使用这个参数时,pytest 将运行整个测试套件指定的次数,而不是仅仅重复运行失败的测试用例。
  • 源码解释:在 pytest_collection_modifyitems 钩子函数中,pytest-repeat 会根据 --count 参数的值来复制整个测试项列表,从而增加测试套件的运行次数。

–repeat-scope

  • 用途:指定重复运行的范围,可以是 sessionfunctionclass
  • 含义:这个参数决定了重复运行是应用于整个测试会话(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, "断言失败"

执行结果

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

需要休息的KK.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值