前言

通常我们认为每个测试用例都是相互独立的,因此需要保证测试结果不依赖于测试顺序,以不同的顺序运行测试用例,可以得到相同的结果。

pytest默认运行用例的顺序是按模块和用例命名的 ASCII 编码顺序执行的,这就意味着每次运行用例的顺序都是一样的。

app 测试里面有个 monkey 测试,随机在页面点点点,不按常理的点点点能找到更多的不稳定性 bug。那么我们在写pytest用例的时候,既然每个用例都是相互独立的,

那就可以打乱用例的顺序随机执行,用到 pytest 的插件 pytest-random-order 可以实现此目的,github 地址https://github.com/jbasko/pytest-random-order

pytest-random-order 插件

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

该插件允许用户控制他们想要引入的随机性级别,并禁止对测试子集进行重新排序。通过传递先前测试运行中报告的种子值,可以按特定顺序重新运行测试。

使用pip安装

pip install pytest-random-order

在pytest -h查看,命令行可以有三个参数选择

  1. pytest-random-order options:
  2. --random-order Randomise test order (by default, it is disabled) with default configuration.
  3. --random-order-bucket={global,package,module,class,parent,grandparent,none}
  4. Randomise test order within specified test buckets.
  5. --random-order-seed=RANDOM_ORDER_SEED
  6. Randomise test order using a specific seed.

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

  1. pytest --random-order
  2. pytest --random-order-bucket=<bucket_type>
  3. pytest --random-order-seed=<seed>

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

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

--random-order 随机测试

先写几个简单的用例,目录结构如下

module1/test_order1.py内容

  1. # module1/test_order1.py
  2. # 作者-上海悠悠 QQ交流群:717225969
  3. # blog地址 https://www.cnblogs.com/yoyoketang/
  4. class TestRandom():
  5. def test_01(self):
  6. print("用例1")
  7. def test_02(self):
  8. print("用例2")
  9. def test_03(self):
  10. print("用例3")

module2/test_order2.py内容

  1. # module2/test_order2.py
  2. # 作者-上海悠悠 QQ交流群:717225969
  3. # blog地址 https://www.cnblogs.com/yoyoketang/
  4. class TestDemo():
  5. def test_04(self):
  6. print("用例4")
  7. def test_05(self):
  8. print("用例5")
  9. def test_06(self):
  10. print("用例6")

带上--random-order参数运行用例

  1. >pytest --random-order -v
  2. ================================================= test session starts =================================================
  3. Using --random-order-bucket=module
  4. Using --random-order-seed=357703
  5. collected 6 items
  6. module2/test_order2.py::TestDemo::test_04 PASSED [ 16%]
  7. module2/test_order2.py::TestDemo::test_05 PASSED [ 33%]
  8. module2/test_order2.py::TestDemo::test_06 PASSED [ 50%]
  9. module1/test_order1.py::TestRandom::test_03 PASSED [ 66%]
  10. module1/test_order1.py::TestRandom::test_02 PASSED [ 83%]
  11. module1/test_order1.py::TestRandom::test_01 PASSED [100%]
  12. ================================================== 6 passed in 0.05s ==================================================

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

--random-order-bucket 随机范围

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

插件组在存储桶中进行测试,在存储桶中进行混洗,然后对存储桶进行混洗,设计原理如图

给定上面的测试套件,以下是一些可能生成的测试顺序中的两个:

可以从以下几种类型的存储桶中进行选择:

  • 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,所有的用例都会被打乱。

  1. >pytest --random-order -v --random-order-bucket=global
  2. ================================================= test session starts =================================================
  3. Using --random-order-bucket=global
  4. Using --random-order-seed=255529
  5. collected 6 items
  6. module1/test_order1.py::TestRandom::test_02 PASSED [ 16%]
  7. module1/test_order1.py::TestRandom::test_01 PASSED [ 33%]
  8. module2/test_order2.py::TestDemo::test_06 PASSED [ 50%]
  9. module2/test_order2.py::TestDemo::test_04 PASSED [ 66%]
  10. module2/test_order2.py::TestDemo::test_05 PASSED [ 83%]
  11. module1/test_order1.py::TestRandom::test_03 PASSED [100%]
  12. ================================================== 6 passed in 0.05s ==================================================

最好从最小的存储桶类型开始(class或module取决于您是否有基于类的测试),并在确定测试可以处理较大的存储桶类型时切换为更大的存储桶类型。

如果您的测试依赖模块或会话范围的fixture,则测试的随机性越高,测试速度就越慢。您可能不想在编码时随机global或随机分组,package并且需要快速确认没有什么大问题。``

模块或类中禁用随机

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

  1. # 写在.py文件最上面即可
  2. pytestmark = pytest.mark.random_order(disabled=True)
  3. def test_number_one():
  4. assert True
  5. def test_number_two():
  6. assert True

也可以写在class里面

  1. import pytest
  2. # 作者-上海悠悠 QQ交流群:717225969
  3. # blog地址 https://www.cnblogs.com/yoyoketang/
  4. class TestRandom():
  5. pytestmark = pytest.mark.random_order(disabled=True)
  6. def test_01(self):
  7. print("用例1")
  8. def test_02(self):
  9. print("用例2")
  10. def test_03(self):
  11. print("用例3")

这样在执行的时候,TestRandom里面的用例顺序就是test_01,test_02,test_03不会被打乱

--random-order-seed 随机种子

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

  1. ============================= test session starts ==============================
  2. ..
  3. Using --random-order-bucket=module
  4. Using --random-order-seed=24775
  5. ...

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

pytest -v --random-order-seed = 24775

禁用插件

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

pytest -p no:random_order

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

首先运行最后失败的测试

另外 --failed-first 标志-上一次运行失败的测试将在通过测试之前运行,而不管改组存储桶类型如何。

pytest文档58-随机执行测试用例(pytest-random-order)的更多相关文章

  1. Pytest(16)随机执行测试用例pytest-random-order

    前言 通常我们认为每个测试用例都是相互独立的,因此需要保证测试结果不依赖于测试顺序,以不同的顺序运行测试用例,可以得到相同的结果. pytest默认运行用例的顺序是按模块和用例命名的 ASCII 编码 ...

  2. pytest文档27-pytest分布式执行(pytest-xdist)

    前言 平常我们手工测试用例非常多时,比如有1千条用例,假设每个用例执行需要1分钟.如果一个测试人员执行需要1000分钟才能执行完,当项目非常紧急的时候, 我们会用测试人力成本换取时间成本,这个时候多找 ...

  3. pytest文档38-allure.setp添加测试用例步骤

    前言 一般流程性的测试用例,写成自动化用例时,步骤较多写起来会比较长.在测试用例里面添加详细的步骤有助于更好的阅读,也方便报错后快速的定位到问题. 举个常见的测试场景用例:从登陆开始,到浏览商品添加购 ...

  4. pytest文档2-用例执行

    用例设计原则 1.文件名以test_******.py文件和*******_test.py 2.以test_****开头的函数 3.以Test***开头的类 4.以test_*****开头的方法 5. ...

  5. pytest文档7-pytest-html生成html报告

    前言 pytest-HTML是一个插件,pytest用于生成测试结果的HTML报告.兼容Python 2.7,3.6 pytest-html 1.github上源码地址[https://github. ...

  6. pytest文档3-pycharm运行pytest

    前言 上一篇pytest文档2-用例运行规则已经介绍了如何在cmd执行pytest用例,平常我们写代码在pycharm比较多 写完用例之后,需要调试看看,是不是能正常运行,如果每次跑去cmd执行,太麻 ...

  7. pytest文档46-关于https请求警告问题(InsecureRequestWarning: Unverified HTTPS request is being made)

    前言 使用 pytest 执行 https 请求用例的时候,控制台会出现警告:InsecureRequestWarning: Unverified HTTPS request is being mad ...

  8. pytest文档16-用例a失败,跳过测试用例b和c并标记失败xfail

    前言 当用例a失败的时候,如果用例b和用例c都是依赖于第一个用例的结果,那可以直接跳过用例b和c的测试,直接给他标记失败xfail 用到的场景,登录是第一个用例,登录之后的操作b是第二个用例,登录之后 ...

  9. pytest文档19-doctest测试框架

    前言 doctest从字面意思上看,那就是文档测试.doctest是python里面自带的一个模块,它实际上是单元测试的一种. 官方解释:doctest 模块会搜索那些看起来像交互式会话的 Pytho ...

随机推荐

  1. transition实现图片轮播

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  2. html基础:js

    js是一种脚本语言.在html中起到操控行为的作用.在html中,html代码如果是一个人的话,那么js就是这个人的行为 js在html的head中被引用,也可以在body中被引用.引用方式用< ...

  3. oracle之二物化视图

    物化视图 18.1.物化视图作用 1) 物化视图起源于数据仓库,早期的考虑是用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免在基表上进行这些耗时的操作,从而快速的得 ...

  4. Git进阶:常用命令和问题案例整理

    一.前言 整理常用git命令和以及在实际使用的过程中碰到的问题案例,旨在git进阶,提升工作开发效率,有需要补充的小伙伴欢迎下方留言,本篇持续更新中... 二.命令 配置用户名和邮箱 git conf ...

  5. 软件开发过程中常用的环境解释DEV FAT UAT PRO

    1.DEV Development environment 开发环境,用于开发者调试使用 2.FAT Feature Acceptance Test environment 功能验收测试环境,用于软件 ...

  6. Mysql数据分片技术(一)——初识表分区

    1. 为什么需要数据分片技术 2. 3种数据分片方式简述 3. 分片技术原理概述 4. 对单表分区的时机 1为什么需要数据分片技术 数据库产品的市场 在互联网行业内,绝大部分开发人员都会遇到数据表的性 ...

  7. 本以为自己 MySQL 够牛逼了,直到亲自去阿里受虐了一次!

    前言 众所周知,简历上“了解=听过名字:熟悉=知道是啥:熟练=用过:精通=做过东西”. 相信大家对于MySQL的索引都不陌生,索引(Index)是帮助MySQL高效获取数据的数据结构.索引作为MySQ ...

  8. 10.Atomic-原子性操作

  9. ERP与EHR系统的恩怨纠葛--开源软件诞生13

    ERP中需要EHR的存在吗--第13篇 用日志记录"开源软件"的诞生 [点亮星标]----祈盼着一个鼓励 博主开源地址: 码云:https://gitee.com/redragon ...

  10. SON Web Tokens 工具类 [ JwtUtil ]

    pom.xml <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt< ...