8款Pytest插件助力Python自动化测试

news2024/11/28 4:26:20

当测试用例变得复杂,或者需要处理大量测试数据时,插件通过使测试更加简洁和结构化而变得非常有用。Python凭借其简洁性和多功能性,成为自动化测试的热门选择,而pytest是最广泛使用的测试框架之一。虽然pytest本身功能强大,但通过插件可以充分发挥其真正潜力。

在Python自动化测试中,Pytest以其简单易用、功能强大的特性成为开发者的首选。然而,Pytest的真正魅力不止于其核心功能,而在于丰富的插件生态系统。如何充分利用这些插件,让测试变得更加高效?这8个实用插件绝对是你的测试“秘密武器”。

有哪些Pytest插件能够提升测试效率、增强报告功能,甚至支持复杂测试场景?它们分别适用于哪些测试需求?

pytest插件可以通过为特定需求提供针对性解决方案来帮助测试,比如并行运行测试、管理数据库、改进错误报告以及与CI/CD集成等。它们简化了测试过程,使其更快、更可靠,同时减少了手动操作和出错的可能性。

在本文中,让我们探索一些用于Python自动化测试的有用pytest插件。

如何安装pytest插件?

要安装pytest插件,你可以使用pip从Python包索引(PyPI)中添加插件。以下是具体步骤:

1. 在PyPI或pytest插件目录中查找你想要的插件。

2. 使用pip在你的环境中直接安装它:

pip install <plugin-name>

3. 例如,要安装pytest-check(一个流行的用于实现断言的插件),请运行以下命令:

pip install pytest-check

安装完成后,你可以将已安装的插件导入到你的测试套件中,以执行pytest测试。

8个顶级pytest插件

让我们探索一些顶级的pytest插件,并附上示例。

1. pytest-check

pytest-check是一个插件,它引入了高级的断言功能。虽然pytest本身提供了一套强大的断言功能,但pytest-check插件通过启用参数化测试并增强失败断言的报告,使其功能更加出色。

使用pytest-check,你可以从单个测试函数中动态生成和执行多个测试用例。这对于测试一系列输入值或场景特别有价值,而无需编写重复的测试脚本。

要安装这个pytest插件,请运行以下命令:

pip install pytest-check

示例:

在这个名为test_pytest_check.py的文件中,我们使用pytest-check插件实现了断言。这里的重点是利用pytest-check插件来增强Selenium测试中的断言处理。

名为test_1的测试函数展示了如何为一系列用户消息实现动态断言。首先,定义了一个消息列表,代表测试将要模拟的不同场景。WebDriver定位网页上的特定元素,包括一个输入框、一个按钮和一个消息元素。

在遍历消息列表的过程中,输入框被清空并填充每条消息。然后点击按钮触发一个动作,并使用pytest-check插件执行动态断言。

with check:

assert len(message_element.text) > 50

assert message_element.text == message

time.sleep(3)

在这里,测试确保了显示的消息内容超过50个字符,并且与输入的消息相匹配。添加time.sleep(3)是为了引入一个短暂的暂停,以便在移动到下一个迭代之前让响应在网页上呈现。

这里故意使用验证显示消息的大小来演示在失败情况下pytest-check插件是如何工作的。当运行上面的代码时,如果我们使用普通的断言,测试将在第一次交互时失败。但是,使用pytest-check插件,测试永远不会失败,并且会提供一个有洞察力的报告,以帮助你理解所有失败的情况。

在下面的输出中,生成了pytest-check报告,包含以下详细信息:

  • 测试未通过。
  • 有三个检查遇到了失败。
  • 每个失败检查的详细信息。

图片

 

2. pytest-bdd

pytest-bdd是一个插件,它能将行为驱动开发(BDD)原则无缝集成到你的自动化测试工作流程中。BDD是一种软件开发方法,它强调利益相关者之间的协作和沟通。

要安装这个pytest插件,请运行以下命令:

pip install pytest-bdd

示例:

要使用pytest-bdd插件自动化与简单表单的交互,你需要创建一个特性文件(feature file),其中概述你想要测试的具体场景。在这个例子中,特性文件的结构应该如下:

Feature: Simple Form Demo

Scenario: Entering a message

Given the user is on the Simple Form Demo page

When the user enters the message "My pytest-bdd message" in the input field

And clicks the Get  button

Then the user should see the message "My pytest-bdd message"

确保你在项目根目录下名为features的文件夹中组织这个特性文件。

在test_simple_form_demo.py文件中,我们使用pytest-bdd插件提供的@given、@when和@then装饰器来定义步骤函数。每个步骤函数对应于Gherkin场景中的一行,这使得将特性文件的动作映射到实际的Python代码变得容易。

此外,步骤定义利用parsers.parse()方法的强大解析能力来动态地从Gherkin场景中提取值。

在这个代码片段中,我们首先导入必要的模块,包括用于元素定位策略的By和用于浏览器自动化的webdriver。使用@given、@when和@then装饰器来定义步骤函数。

使用scenarios()函数将步骤定义与特性文件链接起来,这样pytest-bdd插件就可以自动识别和执行定义的场景。使用pytest.fixture设置了一个名为driver的fixture,提供了一个ChromeDriver。

步骤函数对应于Gherkin场景中描述的动作。它们使用find_element()方法与网页上的元素进行交互,并执行诸如发送按键和点击按钮等操作。

最后,进行断言以验证预期行为与实际结果是否匹配。

图片

 

3.pytest-xdist

pytest-xdist 是一个插件,它提供了跨多台机器并行运行测试的能力。这能够显著减少测试执行时间,使其成为大型测试套件项目中不可或缺的 pytest 插件。

要安装这个pytest插件,请运行以下命令:

pip install pytest-xdist

安装完成后,pytest-xdist插件将与您现有的pytest设置无缝集成。要并行执行测试,您可以使用-n标志,后跟您希望运行的并行进程数。

pytest -n 2

示例:

在test_basic.py文件中,我们有一套Selenium测试。我们将创建一个示例测试套件,并展示pytest-xdist插件如何减少总体执行时间。

除了这个Python文件,我们还将创建另外两个内容完全相同的文件,只是更改了文件名。我们的三个Python自动化脚本是test_basic_1.py、test_basic_2.py和test_basic_3.py。

让我们使用pytest命令运行这些测试脚本。

图片

在上述终端输出中,您可以看到三个测试已运行并通过,执行时间为16.68秒。

现在,让我们使用pytest-xdist的功能运行相同的测试。下面的命令将同时运行三个独立的进程中的测试:

pytest -n 3

在上述终端输出中,您可以看到,与之前一样,三个测试已运行并通过。但是,执行时间仅为7.08秒,测试套件执行时间减少了近58%。

图片

虽然并行测试执行可以显著加快测试过程,但有效监控和管理结果同样重要。pytest-xdist插件提供了清晰简洁的报告,汇总了所有并行进程的结果。

此外,您还可以结合使用pytest的广泛报告选项(如pytest-html)和pytest-xdist插件。这允许您生成全面的报告,这些报告提供了有关测试覆盖率、性能和并行执行过程中遇到的任何失败的见解。

4.pytest-randomly

pytest-randomly插件为您的测试引入随机执行顺序,为Web应用程序的行为提供新的视角。以随机顺序运行测试有助于发现测试套件中隐藏的依赖项或状态问题。

要安装这个pytest插件,请运行以下命令:

pip install pytest-randomly

安装完成后,pytest-randomly插件将与您现有的pytest设置无缝集成。您可以通过在运行以下命令时包含–randomly标志来启用随机测试顺序:

pytest --randomly-seed=1234

该命令使用pytest-randomly插件启动pytest,并指定一个种子值1234。这个种子值确保多次测试运行之间的随机化结果一致,便于调试和结果共享时的可重复性。

因此,如果您想重现相同的执行顺序,可以使用相同的种子。如果您想改变顺序,只需在每次运行时更改种子值,这样测试就会以不同的顺序执行。

示例:

为了展示pytest-randomly插件的工作原理,我们将使用与pytest-xdist部分中相同的代码和项目结构。

让我们使用pytest命令运行这些测试:test_basic_1.py、test_basic_2.py和test_basic_3.py

在下面的终端输出中,您可以看到三个测试已运行并通过,且执行顺序是test_basic_1、test_basic_2和test_basic_3。

 

图片

如果您再次运行相同的测试,执行顺序将会相同。

图片

现在,让我们使用pytest-randomly插件运行相同的测试。以下命令将执行测试:

pytest --randomly-seed=1234

图片

在上述终端输出中,您可以看到三个测试像以前一样已运行并通过。但是,执行顺序是test_basic_1、test_basic_3和test_basic_2。

如果您再次运行相同的测试,并将种子更改为9999,执行顺序将会改变。

图片

在上述终端输出中,您可以看到,与之前一样,三个测试已运行并通过。然而,执行顺序是test_basic_2、test_basic_1和test_basic_3。

5.pytest-html

pytest-html插件提供了一个强大的解决方案,用于创建交互式HTML报告,从而提高测试结果的可见性。

要安装这个pytest插件,请运行以下命令:

pip install pytest-html

安装完成后,pytest-html插件将与您现有的pytest设置无缝集成。使用pytest运行测试后,插件会自动生成HTML报告,提供测试结果的详细摘要。

示例:

为了展示pytest-html的工作原理,我们将使用与pytest-xdist部分中相同的代码和项目结构。

现在,让我们使用以下命令运行这些测试:test_basic_1.py、test_basic_2.py、test_basic_3.py。

pytest --html=report.html

如果您检查项目文件夹,会发现已创建了report.html文件,并且项目文件夹中还添加了一个包含style.css文件的assets文件夹。

如果您在浏览器中打开report.html文件,可以看到:

图片

pytest-html插件还提供了丰富的自定义选项,使您能够精细地调整生成的HTML报告的外观和内容,以满足您独特的测试需求和偏好。

6.pytest-datafiles

pytest-datafiles插件通过无缝集成外部数据文件(如JSON、YAML或文本文件)到您的Selenium测试中,简化了测试管理过程。

要安装这个pytest插件,请运行以下命令:

pip install pytest-datafiles

示例:

为了演示pytest-datafiles插件的工作原理,让我们创建一个名为test_data.json的示例数据文件,其中包含一些将在我们的演示中使用的消息:

[

{"message": "Test Case 1"},

{"message": "Test Case 2"},

{"message": "Test Case 3"}

]

在test_with_datafiles.py文件中,测试脚本的结构大体上与前面的部分相同,重点是自动化一个简单的表单演示。然而,关键的变化在于test_simple_form_demo函数内部。

通过集成pytest-datafiles,我们现在能够动态遍历一个在名为test_data.json的外部JSON文件中定义的场景集。该文件包含多个测试用例,每个用例都有一个不同的消息。对于每个场景,我们在输入新消息之前确保输入字段已被清空,从而提高测试的准确性。

现在,让我们使用pytest命令运行这些测试:

图片

 

7.pytest-cov

pytest-cov插件与pytest无缝集成,为Selenium自动化项目提供了一种轻松测量测试覆盖率的方法。

要安装这个pytest插件,请运行以下命令:

pip install pytest-cov

示例:

按照pytest-cov-sample存储库中的定义创建项目结构。在calculator.py文件中,我们将创建两个简单的函数来计算两个数的加法和减法。

def sum(a, b):

return a + b

def diff(a, b):

return a - b

在test_calculator.py文件中,我们将创建一个简单的测试来检查一些加法运算。我们故意不为diff()函数添加任何测试。

from myproject.calculator import sum, diff


def test_sum():

assert sum(2, 3) == 5

assert sum(-1, 1) == 0

assert sum(0, 0) == 0

init.py文件只是为了告诉pytest-cov插件在哪里运行测试。使用覆盖率分析运行测试非常简单。只需像平常一样使用pytest运行测试,但要添加–cov选项和测试文件夹的名称(即tests):

pytest --cov=myproject tests

此命令将运行您的测试,并为您的软件项目生成一个覆盖率报告。报告将指示哪些代码行已被您的测试覆盖,哪些仍未被测试。

图片

 

8.pytest-mock

pytest-mock是一个与pytest无缝集成的插件,它提供了一种既简单又强大的方式来创建和管理模拟对象(mocks)。模拟对象在多种场景下都很有用,比如处理像数据库、API或第三方服务等外部依赖时。

要安装这个pytest插件,请运行以下命令:

pip install pytest-mock

示例:

在test_sample.py文件中,我们有一个test_network_error_handling(driver, mocker)函数,它测试当在尝试导航时发生网络错误时Selenium WebDriver的行为。

我们使用mocker来模拟driver.get方法。mocker是pytest-mock插件提供的MockFixture类的一个实例,它允许你创建和配置模拟对象以进行测试。

我们配置模拟对象在调用时引发异常,以模拟网络错误的情况。当我们尝试使用driver.get("https://www.xxxx.com/simple-form-demo")导航到网页时,模拟的driver.get方法将引发异常,以模拟网络错误。我们捕获异常,打印它,并断言错误消息包含“Network Error”。

现在,让我们使用pytest -s命令运行这些测试,你可以看到下面的输出:

图片

我们上面运行的测试是在本地Selenium Grid上进行的。然而,对于需要可扩展性和可靠性的大型测试套件,你可以利用与基于云的测试平台集成的pytest插件。

结论

在您的自动化测试过程中充分利用pytest插件的力量,有助于您构建健壮、可维护和高效的测试套件。当pytest与其广泛的插件生态系统相结合时,它使测试人员和开发人员能够根据自己的确切需求定制测试框架。

通过利用pytest插件,您能够以可能无法通过标准测试框架轻松实现的方式,扩展自动化测试项目的功能。从专门的断言到全面的报告和数据驱动测试,pytest插件生态系统提供了多种增强测试工作的方法。

在自动化测试逐步普及的当下,测试开发者的核心任务正从手动操作向工具优化转变。Pytest插件的灵活性和扩展性,不仅降低了测试开发的门槛,也为提升测试效率提供了无限可能。

Pytest插件的丰富生态,为自动化测试开发者提供了从测试执行、结果分析到环境优化的全方位支持。熟练掌握这些工具,不仅能大幅提升工作效率,更能让测试变得轻松高效。

工具是手段,效率是目标,Pytest插件是测试开发者的“好帮手”,让你的测试工作事半功倍!

作/译者Paulo Oliveira/路人甲

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2248814.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【spark-spring boot】学习笔记

目录 说明RDD学习RDD介绍RDD案例基于集合创建RDDRDD存入外部文件中 转换算子 操作map 操作说明案例 flatMap操作说明案例 filter 操作说明案例 groupBy 操作说明案例 distinct 操作说明案例 sortBy 操作说明案例 mapToPair 操作说明案例 mapValues操作说明案例 groupByKey操作说…

Spring Boot 3 集成 Spring Security(2)授权

文章目录 授权配置 SecurityFilterChain基于注解的授权控制自定义权限决策 在《Spring Boot 3 集成 Spring Security&#xff08;1&#xff09;》中&#xff0c;我们简单实现了 Spring Security 的认证功能&#xff0c;通过实现用户身份验证来确保系统的安全性。Spring Securit…

Apache OFBiz xmlrpc XXE漏洞(CVE-2018-8033)

目录 1、漏洞描述 2、EXP下载地址 3、EXP利用 1、漏洞描述 Apache OFBiz是一套企业资源计划&#xff08;ERP&#xff09;系统。它提供了广泛的功能&#xff0c;包括销售、采购、库存、财务、CRM等。 Apache OFBiz还具有灵活的架构和可扩展性&#xff0c;允许用户根据业务需求…

【Android】ARouter的使用及源码解析

文章目录 简介介绍作用 原理关系 使用添加依赖和配置初始化SDK添加注解在目标界面跳转界面不带参跳转界面含参处理返回结果 源码基本流程getInstance()build()navigation()_navigation()Warehouse ARouter初始化init帮助类根帮助类组帮助类 completion 总结 简介 介绍 ARouter…

springboot整合hive

springboot整合hive pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.…

IntelliJ IDEA 中,自动导包功能

在 IntelliJ IDEA 中&#xff0c;自动导包功能可以极大地提高开发效率&#xff0c;减少手动导入包所带来的繁琐和错误。以下是如何在 IntelliJ IDEA 中设置和使用自动导包功能的详细步骤&#xff1a; 一、设置自动导包 打开 IntelliJ IDEA&#xff1a; 启动 IntelliJ IDEA 并打…

【MySQL课程学习】:MySQL安装,MySQL如何登录和退出?MySQL的简单配置

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;MySQL课程学习 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 MySQL在Centos 7环境下的安装&#xff1a; 卸载…

Easyexcel(7-自定义样式)

相关文章链接 Easyexcel&#xff08;1-注解使用&#xff09;Easyexcel&#xff08;2-文件读取&#xff09;Easyexcel&#xff08;3-文件导出&#xff09;Easyexcel&#xff08;4-模板文件&#xff09;Easyexcel&#xff08;5-自定义列宽&#xff09;Easyexcel&#xff08;6-单…

(计算机网络)期末

计算机网络概述 物理层 信源就是发送方 信宿就是接收方 串行通信--一次只发一个单位的数据&#xff08;串行输入&#xff09; 并行通信--一次可以传输多个单位的数据 光纤--利用光的反射进行传输 传输之前&#xff0c;要对信源进行一个编码&#xff0c;收到信息之后要进行一个…

uniapp跨域问题解决方案

uniapp跨域问题解决方案 引言 在使用 uni-app 本地开发 H5> 平台时&#xff0c;需要使用浏览器进行调试&#xff0c;而浏览器会有跨域的问题。比如直接通过本地IP地址去访问开发中的页面&#xff0c;同时这个页面会调一些现有的接口时&#xff0c;就面临着跨域的问题。 解决…

Android 基于Camera2 API进行摄像机图像预览

前言 近期博主准备编写一个基于Android Camera2的图像采集并编码为h.264的应用&#xff0c;准备分为三个阶段来完成&#xff0c;第一阶段实现Camera2的摄像机预览&#xff0c;第二阶段完成基于MediaCodec H.264编码&#xff0c;第三阶段完成基于MediaCodec H.264解码,针对不同…

设计模式:11、迭代器模式(游标)

目录 0、定义 1、迭代器模式的四种角色 2、迭代器模式的UML类图 3、示例代码 4、迭代器的next()方法与集合的get(int index)方法的效率对比&#xff08;LinkedList为例&#xff09; 0、定义 提供一种方法顺序访问一个聚合对象中的各个元素&#xff0c;而又不需要暴露该对象…

UE5连接VR(pico,quest)进行PC VR开发(没有废话全是干货)

一、PICO VR连接UE 首先picoVR&#xff0c;不管是pico neo3还是pico4&#xff0c;用到的软件就只有三个 分别是pico互联助手PICO 互联 | PICO (picoxr.com)、steam VR&#xff0c;虚幻引擎5 pico互联助手 在pico互联助手中你需要选择两种连接方式&#xff08;推荐USB连接&a…

《UnityShader 入门精要》更复杂的光照

代码&示例图见&#xff1a;zaizai77/Shader-Learn: 实现一些书里讲到的shader 到了这里就开启了书里的中级篇&#xff0c;之后会讲解 Unity 中的渲染路径&#xff0c;如何计算光照衰减和阴影&#xff0c;如何使用高级纹理和动画等一系列进阶内容 Unity 中的渲染路径 在U…

用nextjs开发时遇到的问题

这几天已经基本把node后端的接口全部写完了&#xff0c;在前端开发时考虑时博客视频类型&#xff0c;考虑了ssr&#xff0c;于是选用了nextJs&#xff0c;用的是nextUi,tailwincss,目前碰到两个比较难受的事情。 1.nextUI个别组件无法在服务器段渲染 目前简单的解决方法&…

Golang项目:实现一个内存缓存系统

要求 支持设定过期时间&#xff0c;精确到秒支持设定最大内存&#xff0c;当内存超过时做出合适的处理支持并发安全按照以下接口安全 type Cache interface{//size : 1KB 100KB 1MB 2MB 1GBSetMaxMemory(size string )bool//将value写入缓存Set(key string, val interface{},e…

Softing线上研讨会 | Ethernet-APL:推动数字时代的过程自动化

| &#xff08;免费&#xff09;线上研讨会时间&#xff1a;2024年11月19日 16:00~16:30 / 23:00~23:30 Ethernet-APL以10Mb/s的传输速率为过程工业中的现场设备带来了无缝以太网连接和本质安全电源&#xff0c;这不仅革新了新建工厂&#xff0c;也适用于改造现有工厂。 与现…

《Deep Multimodal Learning with Missing Modality: A Survey》中文校对版

文章汉化系列目录 文章目录 文章汉化系列目录摘要1 引言2 方法论分类&#xff1a;概述2.1 数据处理方面2.2 策略设计方面 3 数据处理方面的方法3.1 模态填充3.1.1 模态组合方法3.1.2 模态生成方法 3.2 面向表示的模型3.2.1 协调表示方法3.2.2 表示组合方法。3.2.3 表示生成方法…

python爬虫案例——猫眼电影数据抓取之字体解密,多套字体文件解密方法(20)

文章目录 1、任务目标2、网站分析3、代码编写1、任务目标 目标网站:猫眼电影(https://www.maoyan.com/films?showType=2) 要求:抓取该网站下,所有即将上映电影的预约人数,保证能够获取到实时更新的内容;如下: 2、网站分析 进入目标网站,打开开发者模式,经过分析,我…

鸿蒙安全控件之位置控件简介

位置控件使用直观且易懂的通用标识&#xff0c;让用户明确地知道这是一个获取位置信息的按钮。这满足了授权场景需要匹配用户真实意图的需求。只有当用户主观愿意&#xff0c;并且明确了解使用场景后点击位置控件&#xff0c;应用才会获得临时的授权&#xff0c;获取位置信息并…