Pytest自动化测试 - 必知必会的一些插件

2023-12-20

Pytest拥有丰富的插件架构,超过800个以上的外部插件和活跃的社区,在PyPI项目中以“ pytest- *”为标识。

本篇将列举github标星超过两百的一些插件进行实战演示。

插件库地址: http://plugincompat.herokuapp.com/


1、pytest-html:用于生成HTML报告

一次完整的测试,测试报告是必不可少的,但是pytest自身的测试结果过于简单,而pytest-html正好可以给你提供一份清晰报告。

安装:

pip install -U pytest-html  
用例:
# test_sample.py
import pytest
# import time

# 被测功能
def add(x, y):
    # time.sleep(1)
    return x + y

# 测试类
class TestLearning:
    data = [
        [3, 4, 7],
        [-3, 4, 1],
        [3, -4, -1],
        [-3, -4, 7],
    ]
    @pytest.mark.parametrize("data", data)
    def test_add(self, data):
        assert add(data[0], data[1]) == data[2]
运行:
E:\workspace-py\Pytest>pytest test_sample.py --html=report/index.html
========================================================================== test session starts ==========================================================================
platform win32 -- Python 3.7.3, pytest-6.0.2, py-1.9.0, pluggy-0.13.0
rootdir: E:\workspace-py\Pytest
plugins: allure-pytest-2.8.18, cov-2.10.1, html-3.0.0, rerunfailures-9.1.1, xdist-2.1.0
collected 4 items                                                                                                                                                        

test_sample.py ...F                                                                                                                                                [100%]

=============================================================================== FAILURES ================================================================================
_____________________________________________________________________ TestLearning.test_add[data3] ______________________________________________________________________

self = <test_sample.TestLearning object at 0x00000000036B6AC8>, data = [-3, -4, 7]

    @pytest.mark.parametrize("data", data)
    def test_add(self, data):
>       assert add(data[0], data[1]) == data[2]
E       assert -7 == 7
E        +  where -7 = add(-3, -4)

test_sample.py:20: AssertionError
------------------------------------------------- generated html file: file://E:\workspace-py\Pytest\report\index.html --------------------------------------------------
======================================================================== short test summary info ========================================================================
FAILED test_sample.py::TestLearning::test_add[data3] - assert -7 == 7
====================================================================== 1 failed, 3 passed in 0.14s ======================================================================

运行完,会生产一个html文件 和 css样式文件夹assets,用浏览器打开html即可查看清晰的测试结果。

后面我将会更新更加清晰美观的测试报告插件: allure-python


2、pytest-cov:用于生成覆盖率报告

在做单元测试时,代码覆盖率常常被拿来作为衡量测试好坏的指标,甚至,用代码覆盖率来考核测试任务完成情况。

安装:

pip install -U pytest-cov  
运行:

E:\workspace-py\Pytest>pytest --cov=.
========================================================================== test session starts ==========================================================================
platform win32 -- Python 3.7.3, pytest-6.0.2, py-1.9.0, pluggy-0.13.0
rootdir: E:\workspace-py\Pytest
plugins: allure-pytest-2.8.18, cov-2.10.1, html-3.0.0, rerunfailures-9.1.1, xdist-2.1.0
collected 4 items                                                                                                                                                        

test_sample.py ....                                                                                                                                                [100%]

----------- coverage: platform win32, python 3.7.3-final-0 -----------
Name             Stmts   Miss  Cover
------------------------------------
conftest.py          5      3    40%
test_sample.py       7      0   100%
------------------------------------
TOTAL               12      3    75%


=========================================================================== 4 passed in 0.06s ===========================================================================

3、pytest-xdist:实现多线程、多平台执行

通过将测试发送到多个CPU来加速运行,可以使用-n NUMCPUS指定具体CPU数量,或者使用-n auto自动识别CPU数量并全部使用。

安装:

pip install -U pytest-xdist  
用例:

# test_sample.py
import pytest
import time

# 被测功能
def add(x, y):
    time.sleep(3)
    return x + y

# 测试类
class TestAdd:
    def test_first(self):
        assert add(3, 4) == 7

    def test_second(self):
        assert add(-3, 4) == 1

    def test_three(self):
        assert add(3, -4) == -1

    def test_four(self):
        assert add(-3, -4) == 7
运行:
E:\workspace-py\Pytest>pytest test_sample.py
========================================================================== test session starts ==========================================================================
platform win32 -- Python 3.7.3, pytest-6.0.2, py-1.9.0, pluggy-0.13.0
rootdir: E:\workspace-py\Pytest
plugins: allure-pytest-2.8.18, cov-2.10.1, html-3.0.0, rerunfailures-9.1.1, xdist-2.1.0
collected 4 items                                                                                                                                                        

test_sample.py ....                                                                                                                                                [100%]

========================================================================== 4 passed in 12.05s ===========================================================================

E:\workspace-py\Pytest>pytest test_sample.py -n auto
========================================================================== test session starts ==========================================================================
platform win32 -- Python 3.7.3, pytest-6.0.2, py-1.9.0, pluggy-0.13.0
rootdir: E:\workspace-py\Pytest
plugins: allure-pytest-2.8.18, assume-2.3.3, cov-2.10.1, forked-1.3.0, html-3.0.0, rerunfailures-9.1.1, xdist-2.1.0
gw0 [4] / gw1 [4] / gw2 [4] / gw3 [4]
....                                                                                                                                                               [100%]
=========================================================================== 4 passed in 5.35s ===========================================================================

E:\workspace-py\Pytest>pytest test_sample.py -n 2
========================================================================== test session starts ==========================================================================
platform win32 -- Python 3.7.3, pytest-6.0.2, py-1.9.0, pluggy-0.13.0
rootdir: E:\workspace-py\Pytest
plugins: allure-pytest-2.8.18, assume-2.3.3, cov-2.10.1, forked-1.3.0, html-3.0.0, rerunfailures-9.1.1, xdist-2.1.0
gw0 [4] / gw1 [4]
....                                                                                                                                                               [100%]
=========================================================================== 4 passed in 7.65s ===========================================================================

  

上述分别进行了未开多并发、开启4个cpu、开启2个cpu,从运行耗时结果来看,很明显多并发可以大大缩减你的测试用例运行耗时。


4、pytest-rerunfailures:实现重新运行失败用例

我们在测试时可能会出现一些间接性故障,比如接口测试遇到网络波动,web测试遇到个别插件刷新不及时等,这时重新运行则可以帮忙我们消除这些故障。

安装:

pip install -U pytest-rerunfailures  
运行:
E:\workspace-py\Pytest>pytest test_sample.py --reruns 3
========================================================================== test session starts ==========================================================================
platform win32 -- Python 3.7.3, pytest-6.0.2, py-1.9.0, pluggy-0.13.0
rootdir: E:\workspace-py\Pytest
plugins: allure-pytest-2.8.18, cov-2.10.1, html-3.0.0, rerunfailures-9.1.1, xdist-2.1.0
collected 4 items                                                                                                                                                        

test_sample.py ...R                                                                                                                                                [100%]R
 [100%]R [100%]F [100%]

=============================================================================== FAILURES ================================================================================
___________________________________________________________________________ TestAdd.test_four ___________________________________________________________________________

self = <test_sample.TestAdd object at 0x00000000045FBF98>

    def test_four(self):
>       assert add(-3, -4) == 7
E       assert -7 == 7
E        +  where -7 = add(-3, -4)

test_sample.py:22: AssertionError
======================================================================== short test summary info ========================================================================
FAILED test_sample.py::TestAdd::test_four - assert -7 == 7
================================================================= 1 failed, 3 passed, 3 rerun in 0.20s ==================================================================

  

如果你想设定 重试间隔 ,可以使用 --rerun-delay 参数指定延迟时长(单位秒);

如果你想重新运行 指定错误 ,可以使用 --only-rerun 参数指定正则表达式匹配,并且可以使用多次来匹配多个。


pytest --reruns 5 --reruns-delay 1 --only-rerun AssertionError --only-rerun ValueError  

如果你只想 标记单个测试 失败时自动重新运行,可以添加 pytest.mark.flaky() 并指定重试次数以及延迟间隔。


@pytest.mark.flaky(reruns=5, reruns_delay=2)
def test_example():
    import random
    assert random.choice([True, False])  


5、pytest-randomly:实现随机排序测试

测试中的随机性非常越大越容易发现测试本身中隐藏的缺陷,并为你的系统提供更多的覆盖范围。

安装:

pip install -U pytest-randomly  
运行:
E:\workspace-py\Pytest>pytest test_sample.py
========================================================================== test session starts ==========================================================================
platform win32 -- Python 3.7.3, pytest-6.0.2, py-1.9.0, pluggy-0.13.0
Using --randomly-seed=3687888105
rootdir: E:\workspace-py\Pytest
plugins: allure-pytest-2.8.18, cov-2.10.1, html-3.0.0, randomly-3.5.0, rerunfailures-9.1.1, xdist-2.1.0
collected 4 items                                                                                                                                                        

test_sample.py F...                                                                                                                                                [100%]

=============================================================================== FAILURES ================================================================================
___________________________________________________________________________ TestAdd.test_four ___________________________________________________________________________

self = <test_sample.TestAdd object at 0x000000000567AD68>

    def test_four(self):
>       assert add(-3, -4) == 7
E       assert -7 == 7
E        +  where -7 = add(-3, -4)

test_sample.py:22: AssertionError
======================================================================== short test summary info ========================================================================
FAILED test_sample.py::TestAdd::test_four - assert -7 == 7
====================================================================== 1 failed, 3 passed in 0.13s ======================================================================

E:\workspace-py\Pytest>pytest test_sample.py
========================================================================== test session starts ==========================================================================
platform win32 -- Python 3.7.3, pytest-6.0.2, py-1.9.0, pluggy-0.13.0
Using --randomly-seed=3064422675
rootdir: E:\workspace-py\Pytest
plugins: allure-pytest-2.8.18, assume-2.3.3, cov-2.10.1, forked-1.3.0, html-3.0.0, randomly-3.5.0, rerunfailures-9.1.1, xdist-2.1.0
collected 4 items                                                                                                                                                        

test_sample.py ...F                                                                                                                                                [100%]

=============================================================================== FAILURES ================================================================================
___________________________________________________________________________ TestAdd.test_four ___________________________________________________________________________

self = <test_sample.TestAdd object at 0x00000000145EA940>

    def test_four(self):
>       assert add(-3, -4) == 7
E       assert -7 == 7
E        +  where -7 = add(-3, -4)

test_sample.py:22: AssertionError
======================================================================== short test summary info ========================================================================
FAILED test_sample.py::TestAdd::test_four - assert -7 == 7
====================================================================== 1 failed, 3 passed in 0.12s ======================================================================

这功能默认情况下处于启用状态,但可以通过标志禁用(假如你并不需要这个模块,建议就不要安装)。


pytest -p no:randomly  

如果你想指定 随机顺序 ,可以通过 --randomly-send 参数来指定,也可以使用 last 值来指定沿用上次的运行顺序。


pytest --randomly-seed=4321
  

pytest --randomly-seed=last  


6、其他活跃的插件

还有一些其他功能性比较活跃的、一些专门为个别框架所定制的、以及为了兼容其他测试框架,这里暂不做演示,我就简单的做个列举:

pytest-django :用于测试Django应用程序(Python Web框架)。

pytest-flask :用于测试Flask应用程序(Python Web框架)。

pytest-splinter :兼容Splinter Web自动化测试工具。

pytest-selenium :兼容Selenium Web自动化测试工具。

pytest-testinfra :测试由Salt,Ansible,Puppet, Chef等管理工具配置的服务器的实际状态。

pytest-mock :提供一个mock固件,创建虚拟的对象来实现测试中个别依赖点。

pytest-factoryboy :结合factoryboy工具用于生成各式各样的数据。

pytest-qt :提供为PyQt5和PySide2应用程序编写测试。

pytest-asyncio :用于使用pytest测试异步代码。

pytest-bdd :实现了Gherkin语言的子集,以实现自动化项目需求测试并促进行为驱动的开发。

pytest-watch :为pytest提供一套快捷CLI工具。

pytest-testmon :可以自动选择并重新执行仅受最近更改影响的测试。

pytest-assume :用于每个测试允许多次失败。

pytest-ordering :用于测试用例的排序功能。

pytest-sugar :可立即显示失败和错误并显示进度条。

pytest-dev / pytest-repeat :可以重复(可指定次数)执行单个或多个测试。

这可能是B站最详细的pytest自动化测试框架教程,整整100小时,全程实战!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pytest自动化测试 - 必知必会的一些插件 的相关文章

  • Python3+Kivy+Plyer 推送通知图标问题

    我在使用 Android 的简单通知测试应用程序时遇到了一个奇怪的错误 错误 python AttributeError type object notification org notificator R drawable has no
  • DataFrame 中的字符串,但 dtype 是对象

    为什么 Pandas 告诉我我有对象 尽管所选列中的每个项目都是一个字符串 即使在显式转换之后也是如此 这是我的数据框
  • 对打开文件的脚本进行单元测试

    我编写了一个脚本 它打开一个文件 读取内容并进行一些操作和计算 并将它们存储在集合和字典中 我该如何为这样的事情编写单元测试 我的问题具体是 我会测试文件是否打开 文件很大 这是unix字典文件 我如何对计算进行单元测试 我真的必须手动计算
  • 返回不包括指定键的字典副本

    我想创建一个函数 返回字典的副本 不包括列表中指定的键 考虑这本词典 my dict keyA 1 keyB 2 keyC 3 致电without keys my dict keyB keyC 应该返回 keyA 1 我想用一行简洁的字典理
  • 远程控制或脚本打开 Office 从 Python 编辑 Word 文档

    我想 最好在 Windows 上 在特定文档上启动 Open Office 搜索固定字符串并将其替换为我的程序选择的另一个字符串 我该如何从外部 Python 程序中做到这一点 OLE 什么 原生 Python 脚本解决方案 The doc
  • GitHub 未显示存储库中使用的语言

    我在 GitHub 上上传了 java 的 android studio 项目 但它没有显示语言部分 如何添加语言部分 为什么 GitHub 无法检测存储库中使用的语言 存储库链接 https github com QAZIMAAZARSH
  • pandas 两个数据框交叉连接[重复]

    这个问题在这里已经有答案了 我找不到有关交叉联接的任何内容 包括合并 联接或其他一些内容 我需要使用 my function 作为 myfunc 处理两个数据帧 相当于 for itemA in df1 iterrows for itemB
  • 使用reduce方法的斐波那契数列

    于是 我看到有人用reduce方法来计算斐波那契数列 这是他的想法 1 0 1 1 2 1 3 2 5 3 对应于 1 1 2 3 5 8 13 21 代码如下所示 def fib reduce n initial 1 0 dummy ra
  • 如何像在浏览器中一样检索准确的 HTML

    我正在使用 Python 脚本来呈现网页并检索其 HTML 它适用于大多数页面 但对于其中一些页面 检索到的 HTML 不完整 我不太明白为什么 这是我用来废弃此页面的脚本 由于某种原因 每个产品的链接不在 HTML 中 Link http
  • Docker 日志中的 Python 异常标记为流:stdout

    我想解析和处理来自 docker 容器的所有错误 但当我期望 stderr 时 Python 异常标记为 stdout 举个简单的例子app py raise Exception 然后我在 docker 容器中运行这个文件 但在 var l
  • 将参数传递给 __enter__

    刚刚学习 with 语句尤其是这篇文章 http effbot org zone python with statement htm 问题是 我可以传递一个参数给 enter 我有这样的代码 class clippy runner def
  • python 中的基本矩阵转置

    我尝试了 python 中矩阵转置的最基本方法 但是 我没有得到所需的结果 接下来是代码 A 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4 print A def TS A B A for i in range len A
  • django如何将字符串转换为模块?

    我试图了解 django 的另一个神奇之处 它可以将字符串转换为模块 In settings py INSTALLED APPS声明如下 INSTALLED APPS django contrib auth django contrib c
  • 如何表示类的实例与将其作为输入的类之间的关系?

    我有一堂课叫House 这个类的实例是house class House def init self height length self height height self length length def housePlan hou
  • python csv按列转换为字典

    是否可以将 csv 文件中的数据读取到字典中 使得列的第一行是键 同一列的其余行构成列表的值 例如 我有一个 csv 文件 strings numbers colors string1 1 blue string2 2 red string
  • 本地设置的 Cython 编译器指令是否影响一个或所有函数?

    我正在努力使用 Cython 加速一些 Python Numpy 代码 并且对 本地 设置 如定义的here http docs cython org en latest src reference compilation html在文档中
  • 字母尺度和随机文本上的马尔可夫链

    我想使用 txt 文件中的一本书中的字母频率生成随机文本 以便每个新字符 string lowercase 取决于前一个 如何使用马尔可夫链来做到这一点 或者使用每个字母都有条件频率的 27 个数组更简单 我想使用来自的字母频率生成随机文本
  • 获取运行云功能的运行时服务帐户

    有没有办法以编程方式从云功能获取运行时服务帐户的电子邮件 我知道我可以 猜测 默认的 App Engine 帐户 因为它始终是 appspot gserviceaccount com 但这不是我想要的 我本来期待有一些环境变量 https
  • bool() 和operator.truth() 有什么区别?

    bool https docs python org 3 library functions html bool and operator truth https docs python org 3 library operator htm
  • 如何抑制 Pandas Future 警告?

    当我运行该程序时 Pandas 每次都会给出如下所示的 未来警告 D Python lib site packages pandas core frame py 3581 FutureWarning rename with inplace

随机推荐

  • EasyV+UE创造数字孪生可视化新篇章!

    众所周知 UE是UNREAL ENGINE 虚幻引擎 的简写 由Epic开发 是世界知名授权最广的游戏引擎之一 EasyV是一款数据可视化应用平台 用户通过EasyV可以更高效的实现数据可视化项目搭建 产品内有丰富的模版 海量的组件 简单的
  • 智能辅助技术的未来前景:创新与便利的引领者

    在数字化时代 智能辅助技术正迅速崛起 成为改善生活 提升工作效率的关键因素 这些技术通过结合人工智能 机器学习和物联网等前沿技术 为用户提供更加智能 便捷的体验 未来 智能辅助技术有望在多个领域引领创新 改变人们的生活方式 1 智能助理的个
  • 使用 Amazon Fault Injection Service 演示多区域和多可用区应用程序弹性

    文章作者 Jeff Amazon Fault Injection Service FIS 可帮助您将混沌工程大规模付诸实践 今天 我们推出了新的 场景 这些场景可以让您演示在亚马逊云科技可用区完全断电 或从一个亚马逊云科技区域到另一个亚马逊
  • 测试开发 | 物流与供应链中的智能优化

    随着全球化的深入和商业环境的复杂化 物流与供应链管理面临着前所未有的挑战 然而 随着人工智能 AI 和物联网 IoT 等技术的不断发展 智能优化正成为推动物流与供应链行业变革的关键力量 以下是智能优化在物流与供应链领域的一些关键应用 1 实
  • 测试开发 |AI驱动的健康监测与管理:数字化时代的医疗创新

    随着人工智能 AI 技术的飞速发展 其在健康监测与管理领域的应用正日益成为医疗领域的重要变革力量 AI不仅提供了更精准 高效的医学诊断手段 还为个体化的健康管理提供了全新的可能性 以下是AI驱动的健康监测与管理在数字化时代的一些关键应用 1
  • 测试开发 | 游戏开发中的人工智能创新:探索数字娱乐的未来

    随着科技的不断进步 人工智能 AI 在游戏开发领域展现出巨大的潜力 为游戏行业带来了前所未有的创新 以下是游戏开发中人工智能创新的一些关键方面 1 智能敌对角色和游戏对抗性 传统游戏中的敌对角色往往遵循固定的模式和策略 容易被玩家预测 通过
  • 跟着野火学FreeRTOS:第一段(任务定义,切换以及临界段)

    在裸机系统中 系统的主体就是 C P U CPU CP U 按照预先设定的程序逻辑在 m a i n
  • git命令github拉取推送代码超时报错

    背景 使用魔法科学上网之后 github的页面可以正常访问 但是拉取代码和推送代码还是一直报错 报错信息内容 Failed to connect to github com port 443 Timed out 其实本质是因为代理设置的不正
  • LLama Factory 安装部署实操记录(二)

    1 项目地址 GitHub hiyouga LLaMA Factory Easy to use LLM fine tuning framework LLaMA BLOOM Mistral Baichuan Qwen ChatGLM Easy
  • 从学到考,一图带你读懂开发者技能成长秘籍

    亚马逊云科技开发者社区 为开发者们提供全球的开发技术资源 这里有技术文档 开发案例 技术专栏 培训视频 活动与竞赛等 帮助中国开发者对接世界最前沿技术 观点 和项目 并将中国优秀开发者或技术推荐给全球云社区 如果你还没有关注 收藏 看到这里
  • C++ 字符串比较------strcmp函数和strncmp函数

    strcmp 函数原型 int strcmp const char str1 const char str2 功能 strcmp函数会按照字典顺序逐个比较两个字符串的字符 直到遇到不同的字符或者遇到字符串结束符 0 返回值 该函数返回值如下
  • LLama Factory 实操记录(一)

    1 api端口参数说明 src api h help 显示帮助信息并退出 model name or path MODEL NAME OR PATH 模型权重的路径或标识符 来自 huggingface co models 或 models
  • 开班在即 | 测试开发线下高薪私教班助力你的职场晋升

    深圳线下高薪私教班即将结束 很多同学都实现了跳槽涨薪的目标 今天和大家分享其中一位同学的求职成果 她成功斩获了4个名企Offer 并且薪资从25W涨到了40W 她自己对这个结果很满意 我们也为她感到高兴 现在 我们推荐她所选择的班型给大家
  • 高通切换到Emergency Download:adb reboot edl

    刷机 开机下adb reboot edl 切到QDloader 9008 点下载 The command adb reboot edl is used to reboot an Android device into EDL Emergen
  • 一文详解Python中PO模式的设计与实现

    在使用 Python 进行编码的时候 会使用自身自带的编码设计格式 比如说最常见的单例模式 稍微抽象一些的抽象工厂模式等等 在利用 Python 做自动化测试的时候 是不是也有自己的设计模式呢 所以在今天这个小章节里 需要续了解的就是 py
  • 测试开发 | 智能辅助在心理健康治疗中的革新:倾听、理解、支持的新时代

    随着科技的迅速发展 智能辅助技术正在逐渐渗透到心理健康治疗领域 为个体提供更为智能 个性化的支持 这种创新性的结合为心理健康领域带来了新的可能性 使治疗更加灵活 高效 并为患者提供了更全面的关怀 1 虚拟治疗环境 智能辅助技术通过虚拟治疗环
  • Postman报错提示 Could not get any response怎么解决

    在通过 postman 请求做接口测试的过程中 有时候会遇到一些报错 当遇到这些报错我们不要着急 看着具体哪里报错 然后进行解决 postman报错 经常使用postman的小伙伴们都应该遇到过一些报错 遇到报错的时候我们不要着急 这么这几
  • Elasticsearch——索引数据

    索引可以说是Elasticsearch中非常重要的模块 一个索引可以视作关系数据库中的一张表 本帖将详细介绍与Elasticsearch索引相关的各种功能等 主要内容如下 索引映射 mapping 结构的定义方法 常用的各种字段类型和动态映
  • 【源码】基于SpringBoot+thymeleaf实现的快递之家管理系统

    系统介绍 基于SpringBoot thymeleaf实现的快递之家管理系统是为学校打造的高效的快递管理系统 系统分为管理员 注册用户两类角色 一共是分为三大菜单项 分别是我的物流 个人管理 后台管理 管理员拥有全部菜单 注册用户拥有我的物
  • Pytest自动化测试 - 必知必会的一些插件

    Pytest拥有丰富的插件架构 超过800个以上的外部插件和活跃的社区 在PyPI项目中以 pytest 为标识 本篇将列举github标星超过两百的一些插件进行实战演示 插件库地址 http plugincompat herokuapp