首页 > 其他分享 >Pytest框架 — 12、Pytest的标记(三)(重复执行)

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

时间:2022-08-20 12:34:13浏览次数:93  
标签:12 标记 py mark Pytest 测试方法 PASSED test repeat

目录

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

标签:12,标记,py,mark,Pytest,测试方法,PASSED,test,repeat
From: https://www.cnblogs.com/qishuaiRisen/p/16607505.html

相关文章

  • Unity3D学习笔记12——渲染纹理
    目录1.概述2.详论3.问题1.概述在文章《Unity3D学习笔记11——后处理》中论述了后处理是帧缓存(Framebuffer)技术实现之一;而另外一个帧缓存技术实现就是渲染纹理了。通......
  • SIC 模块FF08MR12W1MA1B11ABPSA1 150A 1200V /FF08MR12W1MA1B11概述
    概述FF08MR12W1MA1B111200VCoolSiC™模块是碳化硅(SiC)MOSFET模块,具有较高的效率和系统灵活性。这些模块采用近阈值电路(NTC)和PressFIT触点技术。该款CoolSiC模块具......
  • 12332
    publicclasstest_payload{publicstaticvoidmain(String[]args){Stringtext="{\"@type\":\"Lcom.sun.org.apache.xalan.internal.xsltc.trax.Temp......
  • 123213
    packageaction;importcom.opensymphony.xwork2.Action;publicclassHelloWorldActionimplementsAction{//请求中传递的参数和返回给页面的值都定义成属性......
  • Java SE 12 新增特性
    JavaSE12新增特性作者:Grey原文地址:JavaSE12新增特性源码源仓库:Github:java_new_features镜像仓库:GitCode:java_new_featuresString类中新增的APIJavaSE......
  • uleb128编码的解析
    uleb128编码,是一种可变长度的编码,长度大小为1-5字节。uleb128通过字节的最高位来决定是否用到下一个字节。如果最高位为1,则用到下一个字节,直到某个字节最高位为0或已经读......
  • 123213
    packageaction;importcom.opensymphony.xwork2.Action;publicclassHelloWorldActionimplementsAction{//请求中传递的参数和返回给页面的值都定义成属性......
  • 吴恩达机器学习笔记|(12)应用实例-照片OCR
    介绍一个复杂的机器学习系统如何组成一、照片光学字符识别(PhotoOpticalCharacterRecognition,photoOCR)如查找图片时,输入照片上存在的词语就可以将该照片搜索出来。......
  • Educational Codeforces Round 117 (Rated for Div. 2) CF1612
    https://codeforces.com/contest/1612VP过了A~E,感觉海星。F,G这几天补。主要是luogu有翻译拯救了英语不好的我。A一眼\(x+y\equiv0\pmod{2}\),否则无解。那么显......
  • pytest系列——allure命令行参数详解
    一、查看allure命令的帮助文档allure-hallure命令的语法格式allure[options][command][commandoptions]options列表Options:--help命令行帮助文档......