pytest一些常见的插件

2023-09-18 19:42:59

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:可以重复(可指定次数)执行单个或多个测试。

更多推荐

【大数据】Doris 构建实时数仓落地方案详解(一):实时数据仓库概述

本系列包含:Doris构建实时数仓落地方案详解(一):实时数据仓库概述Doris构建实时数仓落地方案详解(二):Doris核心功能解读Doris构建实时数仓落地方案详解(三):Doris实时数仓设计Doris构建实时数仓落地方案详解(一):实时数据仓库概述1.数据仓库的发展历程2.数据仓库技术的发展3.数仓的相关技术栈

grafana结合Skywalking追踪Trace(一)

SW应用中对Trace的跟踪一直占有重要的地位,即可以用户指定的tag值,可以筛选出感兴趣的trace(跟踪链),用户可以通过跟踪链追踪各个Span的详细情况。但是在使用SWOAP原生页面中会存在两个问题:1)Trace数量太多了,需要反复搜索才能找到2)找到的Trace,往往代表一类业务,但原生的OAP无法提供Tra

开源日报 0820:Python编程学习的完整指南

这篇文章推荐了几个优秀的开源项目,包括Python编程学习项目、前端好文精选项目、高性能机器学习研究库、程序员的英语学习指南、网络应用程序安全测试项目、Kubernetes的DNS同步项目以及用于时态一致视频处理的内容变形场项目。这些项目都具有一定的优势和特点,能够帮助用户学习和提升技能。无论是对于编程学习、前端开发、

JavaWeb开发-07-MySQL(二)

一.数据库操作-DQL--准备测试数据INSERTINTOtb_emp(id,username,password,name,gender,image,job,entrydate,create_time,update_time)VALUES(1,'jinyong','123456','金庸',1,'1.jpg',4,'2

Cython 笔记 (Python/Jython)

目录1.Cython笔记(Python)2.python加速库cython简介2.1.Cython是什么?2.2.如何安装Cython?2.3.简单示例2.4.性能比对2.5.总结3.PYTHON,CYTHON,JYTHON,IRONPYTHON的区别(注意:此篇有误导,表述不一定正确,只提供一个方向)3.1.PYTH

知识管理系统重构,对卡片盒笔记的理解又进了一步 | Obsidian实践

去年4、5月份的时候接触到《卡片笔记写作法:如何实现从阅读到写作》,便被其中知识管理的理念深深吸引,并且在它的推荐下,果断投入到Obsidian的使用中。这期间,我常常自诩为“Obsidian重度用户”和“彩虹屁爱好者”,乐此不疲地分享Obsidian实践经验,并孜孜不倦地向身边每一位“忘性大”的朋友推荐。截至到今天为

实战演练 | Navicat 常用功能之转储与运行 SQL 文件

数据库管理工作中,"转储SQL文件"和"运行SQL文件"是两个极为常见操作。一般来说,用户使用数据库管理工具或命令行工具来完成。Navicat管理开发工具中的“转储SQL文件”和“运行SQL文件”功能具有直观易用的界面、多种文件格式支持、数据备份和恢复功能、SQL编辑器、数据传输功能等多方面的优势,可以帮助用户更方便地

现在进入广告行业好做吗?

广告行业真的很好,大家快来……在这里你可以无限发挥你的创意和想象力,有趣的同事,不刻板的工作内容,与爱豆合作,偶尔见见明星,出入城市CBD,一身名牌,精美PPT挥斥方遒,轻松出几个炸裂的创意,戛纳获奖,满足感爆棚……以上这些,纯属想象!!做广告是很苦滴,这个苦包括精神和身体两个方面。现在如果没做好吃苦准备的,千万别来。

26 WEB漏洞-XSS跨站之订单及Shell箱子反杀记

目录xss平台及工具使用session与Cookie获取问题演示案例某营销订单系统XSS盲打_平台某Shell箱子系统XSS盲打_工具其他参考应用案例-后台权限维持工具Http/s数据包提交Postman使用xss平台及工具使用凡是有数据交互的地方,前端是接收数据的,后端是要把这个数据进行显示的,在这个过程中就符合了x

springmvc之自定义注解-->自定义注解简介,基本案例和aop自定义注解

自定义注解简介自定义注解基本案例aop自定义注解1.自定义注解简介1.基本注解2.元注解3.自定义注解3.1.标记注解3.2.元数据注解3.3.自定义注解语法:@interfaceJDK基本注解@Override重写@SuppressWarnings(value="unchecked")压制编辑器警告JDK元注解@Re

ns2无线局域网隐藏节点仿真实验

ns2无线局域网隐藏节点仿真实验实验内容实验原理实验过程相关模块安装仿真模块问题总结问题一问题二问题三实验内容无线网络与移动技术第二次实验,用ns2完成无线局域网隐藏节点仿真实验。实验原理隐藏节点指在接收节点的覆盖范围内而在发送节点的覆盖范围外的节点。由于听不到发送节点的发送,隐藏节点可能向相同的接收节点发送分组,导致

热文推荐