Pytest框架 — 12、Pytest的标记(三)(重复执行)

yizhihongxing

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"])
示例:

def test_1():
    print("测试1")
    assert True

def test_2():
    print("测试2")
    assert False

"""
执行结果
mark/repeat/repeat_count.py::test_1[1-3] 测试1
PASSED
mark/repeat/repeat_count.py::test_1[2-3] 测试1
PASSED
mark/repeat/repeat_count.py::test_1[3-3] 测试1
PASSED
mark/repeat/repeat_count.py::test_2[1-3] 测试2
FAILED
mark/repeat/repeat_count.py::test_2[2-3] 测试2
FAILED
mark/repeat/repeat_count.py::test_2[3-3] 测试2
FAILED
"""

(二)在全局配置文件中使用

pytest.ini配置文件中addopts添加count参数

[pytest]
addopts = -s -v --count 2 
testpaths = scripts
python_files = test_*.py
python_classes = Test*
python_functions = test*

示例:

def test_1():
    print("测试1")
    assert True

def test_2():
    print("测试2")
    assert False

"""
执行结果
mark/repeat/repeat_count.py::test_1[1-2] 测试1
PASSED
mark/repeat/repeat_count.py::test_1[2-2] 测试1
PASSED
mark/repeat/repeat_count.py::test_2[1-2] 测试2
FAILED
mark/repeat/repeat_count.py::test_2[2-2] 测试2
FAILED
"""

3、--repeat-scope参数使用

从上面的示例中可以看到测试1先执行了3次,然后测试2再执行3次,有些时候我们想整体执行3次,这就需要用到--repeat-scope参数。类似于fixturescope也可以设置范围

  • session:重复整个测试会话,即所有收集到的测试用例测试完成一次,再进行下一次测试
  • module:重复整个模块,即模块内所有收集到的测试用例测试完成一次,再进行下一次测试
  • class:重复所有类,即以每个类为集合所有测试用例测试完成一次,再进行下一次测试
  • function:默认范围,重复所有函数和方法,即一个测试函数或方法重复执行完毕,再对下一个测试函数重复执行
    测试代码:
class TestClass_1:
    def test_method_1(self):
        print("类1测试方法1")

    def test_method_2(self):
        print("类1测试方法2")

class TestClass_2:
    def test_method_1(self):
        print("类2测试方法1")

    def test_method_2(self):
        print("类2测试方法2")

  1. 类级别执行
    pytest -s -v xxx.py --count=2 --repeat_scope=class
"""
执行结果
mark/repeat/repeat_scope.py::TestClass_1::test_method_1[1-2] 类1测试方法1
PASSED
mark/repeat/repeat_scope.py::TestClass_1::test_method_2[1-2] 类1测试方法2
PASSED
mark/repeat/repeat_scope.py::TestClass_1::test_method_1[2-2] 类1测试方法1
PASSED
mark/repeat/repeat_scope.py::TestClass_1::test_method_2[2-2] 类1测试方法2
PASSED
mark/repeat/repeat_scope.py::TestClass_2::test_method_1[1-2] 类2测试方法1
PASSED
mark/repeat/repeat_scope.py::TestClass_2::test_method_2[1-2] 类2测试方法2
PASSED
mark/repeat/repeat_scope.py::TestClass_2::test_method_1[2-2] 类2测试方法1
PASSED
mark/repeat/repeat_scope.py::TestClass_2::test_method_2[2-2] 类2测试方法2
PASSED
"""
  1. 模块级别执行
    pytest -s -v xxx.py --count=2 --repeat-scope=module
"""
执行结果
mark/repeat/repeat_scope.py::TestClass_1::test_method_1[1-2] 类1测试方法1
PASSED
mark/repeat/repeat_scope.py::TestClass_1::test_method_2[1-2] 类1测试方法2
PASSED
mark/repeat/repeat_scope.py::TestClass_2::test_method_1[1-2] 类2测试方法1
PASSED
mark/repeat/repeat_scope.py::TestClass_2::test_method_2[1-2] 类2测试方法2
PASSED
mark/repeat/repeat_scope.py::TestClass_1::test_method_1[2-2] 类1测试方法1
PASSED
mark/repeat/repeat_scope.py::TestClass_1::test_method_2[2-2] 类1测试方法2
PASSED
mark/repeat/repeat_scope.py::TestClass_2::test_method_1[2-2] 类2测试方法1
PASSED
mark/repeat/repeat_scope.py::TestClass_2::test_method_2[2-2] 类2测试方法2
PASSED
"""

4、@pytest.mark.repeat(count)装饰器使用

还可以在测试代码中使用@pytest.mark.repeat(count)装饰器来标记需要重复执行的测试。

import pytest

@pytest.mark.repeat(2)
def test_1():
    print("测试函数1")

def test_2():
    print("测试函数2")

class TestClass:
    def test_1(self):
        print("类中测试方法1")

    @pytest.mark.repeat(3)
    def test_2(self):
        print("类中测试方法2")

"""
执行结果
mark/repeat/repeat_mark.py::test_1[1-2] 测试函数1
PASSED
mark/repeat/repeat_mark.py::test_1[2-2] 测试函数1
PASSED
mark/repeat/repeat_mark.py::test_2 测试函数2
PASSED
mark/repeat/repeat_mark.py::TestClass::test_1 类中测试方法1
PASSED
mark/repeat/repeat_mark.py::TestClass::test_2[1-3] 类中测试方法2
PASSED
mark/repeat/repeat_mark.py::TestClass::test_2[2-3] 类中测试方法2
PASSED
mark/repeat/repeat_mark.py::TestClass::test_2[3-3] 类中测试方法2
PASSED
"""

注意:使用装饰器标记的重复执行用例不受参数执行的影响,即当上面例子在执行时使用--count=5,标记过的测试用例以装饰器标记次数为准,其他未标记的测试用例会执行5次。

5、结合参数x使重复执行在失败时停止

如果遇到间歇性bug,可以在命令中--count-x结合使用,重复执行测试用例,直到测试失败停止。
pytest -vs -x xxx.py --count=100
这样将运行100次,一旦遇到失败就会停止。

参考:https://www.cnblogs.com/yoyoketang/p/9800961.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Pytest框架 — 12、Pytest的标记(三)(重复执行) - Python技术站

(0)
上一篇 2023年4月2日
下一篇 2023年4月2日

相关文章

  • Pytest框架 — 13、Pytest的标记(四)(分组执行)

    目录 1、前言 2、mark的使用 (一)注册自定义标记 (二)在测试用例上标记 (三)执行 3、扩展 (一)在同一个测试用例上使用多个标记 (二)在测试类上使用标记 1、前言 在自动化测试工作中我们有时候并不需要测试所有的测试用例,比如在冒烟测试阶段,我们只需要测试基本功能是否正常就可以了。在pytest中提供了mark标记功能来实现分组执行。 2、mar…

    Python开发 2023年4月2日
    00
  • Pytest框架 — 06、Pytest的Fixture(部分前后置)(一)

    目录 1、前言 2、Fixture的优势 3、Fixture的定义与调用 (1)定义方法 (2)参数简要说明 (3)调用方法 1、前言 fixture中文名翻译为夹具,作用与上一篇中setup和teardown一致,都是用来做前后置处理的,但fixture更灵活更强大。它支持部分前后置,比如有时候我们不需要为每一条测试用例都添加前后置,使用setup和tea…

    Python开发 2023年4月2日
    00
  • Pytest框架 — 16、Pytest的测试报告(pytest-html插件和Allure框架)

    目录 1、前言 2、pytest-html生成测试报告 (1)pytest-html插件安装 (2)pytest-html的使用 (3)报告独立显示 3、Allure框架生成测试报告 (1)说明 (2)环境准备 (3)执行测试并生成测试报告 1、前言 在pytest中常用的测试报告生成方法有两种,一种是通过pytest-html插件来完成,另一种通过Allu…

    2023年4月2日
    00
  • Pytest框架 — 11、Pytest的标记(二)(parametrize参数化)

    目录 1、标记实现参数化 示例1:单个参数 示例2:多个参数 示例3:多个参数化(笛卡尔积) 示例4:ids参数给用例起别名 示例5:使用indirect处理参数值 示例6:标记数据 1、标记实现参数化 通过@pytest.mark.parametrize(argnames, argvalues, indirect=False, ids=None, scop…

    Python开发 2023年4月2日
    00
  • Pytest框架 — 07、Pytest的Fixture(部分前后置)(二)

    目录 4、Fixture的相互调用 5、Fixture复用 6、Fixture缓存返回结果 7、Fixture的后置处理 (一)使用yield关键字实现后置 (二)使用addfinalizer关键字实现后置 (三)yield和addfinalizer的区别 4、Fixture的相互调用 示例: import pytest # 第一层fixture @pyte…

    Python开发 2023年4月2日
    00
  • Pytest框架 — 09、Pytest的conftest.py文件

    目录 1、conftest.py介绍 2、conftest.py的特点 3、conftest.py文件的使用 4、conftest.py的作用域 1、conftest.py介绍 conftest.py是pytest框架的一种固定写法,把fixture或者自己定义的插件写到这个文件里就会自动去调用。我们前面都是将fixture写到测试用例文件里,在实际工作中更…

    Python开发 2023年4月2日
    00
  • Pytest框架 — 14、Pytest的标记(五)(控制测试用例执行顺序)

    目录 1、前言 2、使用 3、标记最先执行和最后执行 1、前言 在执行自动化测试时,我们通常都希望能够控制执行测试用例的顺序。 在unittest框架中默认按照ACSII码的顺序加载测试用例并执行,顺序为:0~9、A~Z、a~z,测试目录、测试模块、测试类、测试方法/测试函数都按照这个规则来加载测试用例。 在pytest测试框架中,默认从上至下执行,也可以通…

    Python开发 2023年4月2日
    00
  • Pytest框架 — 08、Pytest的Fixture(部分前后置)(三)

    目录 8、Fixture带返回值 9、Fixture实现参数化 10、可靠的Fixture写法 (一)一个不可靠Fixture的例子 (二)修改成可靠Fixture的例子 8、Fixture带返回值 在fixture中我们可以使用yield或者return来返回我们需要的东西,如测试数据,数据库连接对象,文件对象等。 没有后置处理 直接采用return的方式…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部