Pytest(16)随机执行测试用例pytest-random-order「建议收藏」

Pytest(16)随机执行测试用例pytest-random-order「建议收藏」前言通常我们认为每个测试用例都是相互独立的,因此需要保证测试结果不依赖于测试顺序,以不同的顺序运行测试用例,可以得到相同的结果。pytest默认运行用例的顺序是按模块和用例命名的ASCII编码

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

前言

通常我们认为每个测试用例都是相互独立的,因此需要保证测试结果不依赖于测试顺序,以不同的顺序运行测试用例,可以得到相同的结果。
pytest默认运行用例的顺序是按模块和用例命名的 ASCII 编码顺序执行的,这就意味着每次运行用例的顺序都是一样的。
app 测试里面有个 monkey 测试,随机在页面点点点,不按常理的点点点能找到更多的不稳定性 bug。那么我们在写pytest用例的时候,既然每个用例都是相互独立的,
那就可以打乱用例的顺序随机执行,用到 pytest 的插件 pytest-random-order 可以实现此目的,github 地址https://github.com/jbasko/pytest-random-order
 

说明

pytest-random-order是一个pytest插件,用于随机化测试顺序。这对于检测通过的恰好是有用的,因为它恰好在不相关的测试之后运行,从而使系统处于良好状态。

该插件使用户可以控制要引入的随机性级别,并禁止对测试子集进行重新排序。通过传递先前测试运行中报告的种子值,可以按特定顺序重新运行测试。
Pytest(16)随机执行测试用例pytest-random-order「建议收藏」

快速开始

 

安装

pip3 install pytest-random-order

 

注意

从v1.0.0开始,默认情况下,此插件不再将测试随机化。要启用随机化,您必须以下列方式之一运行pytest:

pytest --random-order
pytest --random-order-bucket=<bucket_type>
pytest --random-order-seed=<seed>

 

配置方式

如果要始终随机化测试顺序,请配置pytest。有很多方法可以做到这一点,我最喜欢的一种方法是addopts = --random-order在pytest选项(通常是[pytest]或[tool:pytest]部分)下添加特定

# pytest.ini文件内容
[pytest]
addopts = --random-order

 

案例演示

# test_random.py
def test_1():
    print("用例1")


def test_2():
    print("用例2")


def test_3():
    print("用例3")

# test_random2.py
def test_4():
    print("用例4")


def test_5():
    print("用例5")


def test_6():
    print("用例6")

 

执行命令

pytest -s --random-order

 

执行结果

Using --random-order-bucket=module
Using --random-order-seed=63275
collecting ... 
 case/random_case/test_random2.py::test_5 ✓                                                                                                                                                               17% █▋        
 case/random_case/test_random2.py::test_6 ✓                                                                                                                                                               33% ███▍      
 case/random_case/test_random2.py::test_4 ✓                                                                                                                                                               50% █████     
 case/random_case/test_random.py::test_3 ✓                                                                                                                                                                67% ██████▋   
 case/random_case/test_random.py::test_1 ✓                                                                                                                                                                83% ████████▍ 
 case/random_case/test_random.py::test_2 ✓                                                                                                                                                               100% ██████████
Results (0.04s):

从运行的结果可以看出,默认使用–random-order-bucket=module,模块下的用例会被打乱随机执行,每次运行会重新生成–random-order-seed=63275,seed值不一样,用例的顺序也会不一样
 

更改重新排序与范围

要更改重新排序与范围,运行pytest –random-order-bucket=选项,其中可以是global,package,module,class,parent,grandparent:

插件组在存储桶中进行测试,在存储桶中进行混洗,然后对存储桶进行混洗,设计原理如图
Pytest(16)随机执行测试用例pytest-random-order「建议收藏」
给定上面的测试套件,以下是一些可能生成的测试顺序中的两个:
Pytest(16)随机执行测试用例pytest-random-order「建议收藏」
可以从以下几种类型的存储桶中进行选择:

class 测试将在一个类中进行混洗,而各类将被混洗,但是来自一个类的测试将永远不会在其他类或模块之间运行来自其他类的测试。

  • module 模块级别。如果仅使用–random-order运行pytest,同时带上参数–random-order-seed=。
  • package 程序包级别。请注意,属于package的模块(以及这些模块内的测试)x.y.z不属于package x.y,因此在对存储package桶类型进行随机分配时,它们将落入不同的存储桶中。
  • parent 如果使用的是不属于任何模块的自定义测试项,则可以使用此项将测试项的重新排序限制在它们所属的父级中。对于正常测试函数,父级是声明它们的模块。
  • grandparent 类似于上面的parent,但是使用测试项的父级作为bucket key。
  • global 所有测试属于同一存储桶,完全随机,测试可能需要更长的时间才能运行。
  • none (已弃用) 禁用混洗。自1.0.4起不推荐使用,因为此插件默认不再重做测试,因此没有禁用的功能。
    如果你有测试三个桶A,B和C三个测试1和2,并3在他们每个人,那么许多潜在的排序的一个非全局随机化可以产生可能是:
c2,c1,c3,a3,a1,a2,b3,b2,b1

运行示例,带上参数–random-order-bucket=global,所有的用例都会被打乱。

Using --random-order-bucket=global
Using --random-order-seed=784641
collecting ... 
 case/random_case/test_random2.py::test_5 ✓                                                                                                                                                               17% █▋        
 case/random_case/test_random.py::test_3 ✓                                                                                                                                                                33% ███▍      
 case/random_case/test_random2.py::test_6 ✓                                                                                                                                                               50% █████     
 case/random_case/test_random2.py::test_4 ✓                                                                                                                                                               67% ██████▋   
 case/random_case/test_random.py::test_2 ✓                                                                                                                                                                83% ████████▍ 
 case/random_case/test_random.py::test_1 ✓                                                                                                                                                               100% ██████████

Results (0.04s):
       6 passed

 

模块或类中禁用随机

如果我们在一个模块或类中,不想让里面的用例随机,可以设置 disabled=True 来禁用随机参数
 

模块中禁用随机

# 写在.py文件最上面即可
import pytest
pytestmark = pytest.mark.random_order(disabled=True)


def test_1():
    print("用例1")


def test_2():
    print("用例2")


def test_3():
    print("用例3")

 

类中禁用随机

import pytest


class TestRandom():
    pytestmark = pytest.mark.random_order(disabled=True)

    def test_1(self):
        print("用例1")

    def test_2(self):
        print("用例2")

    def test_3(self):
        print("用例3")

这样在执行的时候,TestRandom里面的用例顺序就是test_1,test_2,test_3不会被打乱
 

重现测试结果:–random-order-seed 随机种子

如果由于重新排序测试而发现测试失败,则可能希望能够以相同的失败顺序重新运行测试。为了允许重现测试订单,该插件报告其与伪随机数生成器一起使用的种子值:

============================= test session starts ==============================
..
Using --random-order-bucket=module
Using --random-order-seed=36775
...

现在,您可以使用该–random-order-seed=…位作为下一次运行的参数以产生相同的顺序:

pytest -v --random-order-seed = 36775

 

禁用插件

如果你觉得这个插件不好用,或者对你的其它功能会有影响,则可以将其禁用

pytest -p no:random_order

 

注意

默认情况下禁用随机化。通过传递,-p no:random_order您将阻止插件的注册,因此其钩子将不会被注册,并且命令行选项也不会

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/166264.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 因果图方法_因果图法符号

    因果图方法_因果图法符号因果图方法  一.方法简介  1.定义:是一种利用图解法分析输入的各种组合情况,从而设计测试用例的方法,它适合于检查程序输入条件的各种组合情况。  2.因果图法产生的背景:  等价类划分法和边界值分析方法都是着重考虑输入条件,但没有考虑输入条件的各种组合、输入条件之间的相互制约关系。这样虽然各种输入条件可能出错的情况已经测试到了,但多个输入条件组合起来可能出错的情况却被忽视了。

    2022年8月14日
    3
  • 浏览器报错400系列总结「建议收藏」

    浏览器报错400系列总结「建议收藏」 

    2022年5月18日
    51
  • MySQL忘记密码怎么修改密码[通俗易懂]

    MySQL忘记密码怎么修改密码[通俗易懂]MySQL的root帐号密码默认为空,经常都有修改密码后忘记密码的事。如果忘记了root帐号密码,那该怎么修改密码呢?这里有一个可行的方法,就是在MySQL安全模式下(跳过权限检查)修改密码的方式来解决这个问题。本文分别对Windows环境与Linux环境下介绍MySQL忘记密码时修改密码的方法,希望帮助初学者解决丢失密码的烦恼。

    2022年6月22日
    30
  • 如何查看vue版本号以及vue/cli脚手架版本号「建议收藏」

    如何查看vue版本号以及vue/cli脚手架版本号「建议收藏」查看vue版本号方法一:直接在项目的package.json文件,找到dependencies就能看到了方法二:输入命令npmlsvue(或者npmlistvue)查看vue/cli脚手架版本号方法:输入命令vue-V(或者vue–version)

    2022年5月30日
    317
  • Android视频编码_安卓视频解码器

    Android视频编码_安卓视频解码器SVideoRecorder(https://github.com/yellowcath/SVideoRecorder)使用Android原生的MediaCodec进行视频录制,对比大量使用FFmpeg进行录制的库优点如下:体积小 :编译后的aar只有187K,ffmpeg一个so就7、8M,精简之后也差不多还有一半大小 速度快 :在huaweiP9上,720P的一帧:  FFmpeg编码…

    2022年8月31日
    4
  • mysql左连接查询慢[通俗易懂]

    mysql左连接查询慢[通俗易懂]之前一直用的Oracle,今天用mysql查询一个很普通的左连接的时候,发现速度很慢。selectx.fid,x.isbirt,x.fscoresum,x.fsystemscore,x.feffectivescorefromtableaxleftjointablebhonx.fitemid=h.fidwhereh.fprojectid=’’这个sql耗时:2s多。我有点吓到了,后来我百度后发现然后我换了表的位置selectx.fid,x.isbirt,x.fsc

    2022年5月22日
    60

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号