Pytest实践:Python测试技术基础知识!

一、简介

在软件开发领域,确保代码的正确性和稳健性至关重要。这就是软件测试发挥作用的地方。Python 是一种通用且广泛使用的编程语言,提供了大量的工具和库来帮助测试过程。

其中,Pytest就是一个很好用的测试框架,可以在 Python 中创建、组织和执行测试。pytest 的独特之处在于它的简单性、可扩展性以及处理复杂测试需求的能力。它支持固定装置、自动测试发现和丰富的插件,以及其他显着的功能,这使其成为从小型到大型应用程序的任何规模项目的可行选择。

  • 文档:http://docs.pytest.org/en/latest/contents.html#ttoc

  • 第三方库:https://pypi.org/search/?g=pytest

  • Github地址:https://github.com/pytest-dev/pytest/

二. 安装与配置

在深入使用 pytest 进行测试之前,正确设置至关重要。pytest 的安装和配置过程非常简单,使其成为各个级别的开发人员都可以使用的工具。

如何安装 Pytest

Pytest 可以使用 pip 来安装,pip 是 Python 的包安装程序。建议在安装 pytest 之前创建一个虚拟环境,因为这种做法有助于保持不同项目所需的依赖关系分离和组织。可以这样做:

1.首先,在项目目录中创建一个虚拟环境:

图片

2. 激活虚拟环境,在Windows上使用:

图片

在Unix或MacOS上使用:

图片

3.激活虚拟环境后,使用pip安装pytest:

图片

配置测试环境

配置pytest轻而易举。然而,了解一些基础知识将帮助你从一开始就充分利用它。Pytest 需要知道在哪里可以找到你的测试以及应该考虑什么作为测试。

以下是一些基础知识:

1.命名约定:默认情况下,pytest 会将任何前缀为 test_ 或后缀为 _test.py 的文件视为测试文件。同样,这些文件中任何以 test_ 为前缀的函数都被视为测试函数。遵循这一命名约定将使你的测试井井有条,易于识别。

图片

2.目录结构:虽然 pytest 的目录结构非常灵活,但在项目中通常会有一个专门的测试目录,存放所有测试文件。这样可以将测试与实际代码分开,是一种很好的做法。

项目结构:

图片

3. 配置文件:对于更高级的配置,pytest 支持名为 pytest.ini、pyproject.toml 或 tox.ini 的配置文件。在该文件中,你可以指定各种选项,如添加命令行参数、设置 python 路径等。

pytest.ini 文件示例:

图片

在这个配置文件中,我们指定了 pytest 的最低版本,添加了一些命令行选项,并将 pytest 指向测试目录。

按照上述步骤,你将拥有一个组织有序、配置完备的测试环境,为你的 pytest 之旅做好准备。在随后的章节中,当你深入研究 pytest 的特性和功能时,这个设置将为你提供良好的服务。

现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:691998057【暗号:csdn999】

三.Pytest基础知识

使用 pytest 开始测试,首先要了解它的基本功能。下面的内容旨在提供一个基础,你可以在此基础上随着你的进步构建更复杂的测试场景。这里将介绍的三个主要方面包括:创建简单的功能测试、利用断言以及从命令行识别和运行测试。

创建简单的功能测试

功能测试是一种黑盒测试,通过提供输入并检查输出来测试应用程序的功能。Pytest 简化了创建功能测试的过程。让我们深入研究一个基本示例:

假设在名为 math_operations.py 的文件中有一个函数 add:

图片

要测试该add函数,请创建一个名为的新文件test_math_operations.py并定义一个函数test_add:

图片

在此示例中,test_add是一个简单的功能测试,用于检查add函数是否返回正确的输出。

在Pytest中使用断言

断言是程序员在代码中假定为真的条件或布尔表达式。Pytest 使断言的使用变得轻松易读。断言语句用于在给定条件为真的情况下继续执行。如果 assert 判断为 false,pytest 将停止测试执行,报告失败,并提供深入的回溯信息。让我们扩展一下前面的例子:

图片

在这里,我们添加了更多断言来检查add具有不同输入的函数,确保其在这些场景中的行为符合预期。

从命令行识别并运行测试

Pytest 提供了用于运行测试的命令行界面。编写测试后,运行它们就像在终端中执行单个命令一样简单。导航到包含测试文件的目录,然后运行以下命令:

图片

Pytest 将自动发现当前目录和子目录中遵循测试文件命名约定的所有文件,然后运行它们包含的测试。

要进行更精细的控制,可以指定要运行的文件、测试类甚至测试方法。例如,要只运行 test_math_operations.py 文件中的 test_add 方法,可以执行:

图片

这种命令行灵活性使您可以轻松运行单个测试、文件中的所有测试或项目中的所有测试,随着测试套件的增长,这会非常有帮助。

pytest 用于创建、断言和运行测试的简单而强大的功能使其成为 Python 开发人员珍视的工具。这些基础知识将作为探索更高级测试概念的垫脚石,我们将在后面的文章中介绍这些概念。

四. Pytest 中的固定装置

pytest 的一个重要特点是使用固定装置(fixtures)来创建一个固定的基线,使测试能在这个基线上可靠地重复执行。固定装置是为测试功能创建设置和拆卸代码的一种方法。这种设置可以是以数据为中心的,也可以是在多个测试中重复使用的对象。

夹具(Fixtures)介绍

在 pytest 中,固定装置为创建可在多个测试中共享的设置代码提供了一种方法。一个固定装置函数会为测试创建一个固定的基线,然后固定装置名称会被用作任何测试的输入参数。真正的优势来自于在一个或多个独立的 conftest.py 文件中定义固定装置的能力,从而使它们可用于多个测试文件。

这是一个返回字典的简单装置,可用于保存测试数据:

图片

在测试中,使用夹具名称作为输入参数:

图片

使用夹具进行安装和拆卸的示例

夹具的用途非常广泛,可以在测试开始时进行设置,在测试结束时进行拆卸,以及其间的所有操作。这是一个更复杂的夹具示例,演示了设置和拆卸功能:

假设你有一个数据库类:

图片

你可以在conftest.py文件中创建一个固定装置来处理数据库连接的设置和拆卸:

然后,在测试函数中使用该夹具db_connection:

图片

在此示例中,db_connection夹具处理创建新对象并连接到数据库的设置Database,以及在测试函数执行后关闭数据库连接的拆卸。

该yield语句是 pytest 从设置阶段过渡到拆卸阶段的地方。之前的所有代码yield都是设置,之后的代码都是拆卸。

夹具提供了一种强大的方法来管理测试的设置和拆卸代码,使测试保持干净和干燥(不要重复)。它们提高了代码的可重用性,并且可以显着减少样板代码的数量,使测试更易于编写、阅读和维护。

五. 参数化测试

强大的测试框架应该有助于根据各种输入验证功能或方法,以确保其正确性。Pytest 通过参数化测试的能力在这方面表现出色。参数化有助于使用不同的输入值多次执行测试,这是确认代码在不同条件下的功能和可靠性的关键实践。

如何参数化测试

pytest 中的参数化是使用@pytest.mark.parametrize装饰器实现的。该装饰器允许指定测试的输入值和预期结果,使其成为增强测试套件全面性的强大工具。以下是如何使用它:

假设有一个函数multiply想要使用不同的输入集进行测试:

图片

可以创建一个测试文件test_math_operations.py并使用@pytest.mark.parametrize装饰器来测试multiply具有各种输入的函数:

图片

在上面的代码中,a、b、 和expected是函数的输入参数test_multiply,列表中的元组为测试的每次迭代提供这些参数的值。

不同测试用例的参数化示例

参数化可以在多种场景中使用。这是另一个说明性示例,其中可以采用参数化来测试确定数字是否为偶数的函数:

图片

要测试该is_even函数,您可以使用参数化来验证其在一系列数字上的正确性:

图片

在这个示例中,test_is_even 函数以不同的数值和预期参数值运行了6次,确保 is_even 函数对正数和负数(包括零)都表现出预期的效果。

在 pytest 中参数化测试的能力增强了测试套件的清晰度和全面性。通过利用参数化,可以确保您的函数和方法在广泛的输入中得到彻底的测试,从而培养出强大而可靠的代码库。

六. 高级功能

随着你越来越习惯 pytest 的基础知识,探索其高级功能可以进一步优化你的测试过程。下面,让我们将深入研究 pytest 中的标记、插件以及异常和模拟的处理。尽管被称为高级功能,但这些功能非常易于使用,并且可以显着增强测试能力。

标记及其用途

pytest 中的标记提供了一种将元数据添加到测试中的方法,允许根据标记运行测试子集。这对于具有大量测试套件的大型项目特别有用。以下是使用标记的方法:

使用配置文件定义自定义标记pytest.ini:

图片

现在,将@pytest.mark.slow装饰器应用于你想要标记为慢的任何测试:

图片

要仅运行慢速测试,请使用-mpytest 选项:

图片

插件以及与其他工具的集成

pytest 的插件架构允许扩展其功能并与其他工具集成。有许多可用的插件,创建自己的插件也是一个简单的过程。这是使用该pytest-cov插件来测量代码覆盖率的示例:

通过 pip安装pytest-cov:

图片

现在,运行 pytest 并--cov选择获取覆盖率报告:

此命令将运行测试并提供myproject目录的覆盖率报告。

测试异常和使用模拟

测试代码如何处理异常对于构建健壮的应用程序至关重要。Pytest 简化了这个过程。以下是测试函数是否引发预期异常的方法:

图片

模拟是另一个高级功能,可以在测试期间模拟行为,这对于将测试与外部因素或系统隔离非常有用。该unittest.mock库包含在 Python 中,可以与 pytest 一起使用来创建模拟。

下面是使用mock来模拟数据库连接的示例:

图片

在此示例中,Mock用于将实际db_connection函数替换为模拟版本,这个模拟版本在调用时返回“Connected”,从而允许进行受控和隔离测试。

探索 pytest 的这些高级功能为更有效的测试开辟了多种可能性。通过利用标记、插件以及测试异常和使用模拟的功能,从而可以构建更加健壮、可靠和可维护的代码库。

七. 实际用例

通过深入研究 pytest 用于测试的现实场景,可以很好地补充 pytest 的理论知识。下面将展示在实际项目中实施测试的示例,然后讨论使用 pytest 测试软件时采用的最佳实践。

在实际项目中实施测试的示例

1.测试REST API:

使用REST API时,测试端点的预期行为至关重要。让我们考虑一个简化的场景,其中您有一个 Flask 应用程序,该应用程序具有返回问候语的单个端点:

图片

可以创建一个测试文件 test_app.py,使用 pytest 和 requests 库测试 /greet 端点:

图片

2. 测试数据库交互:

确保应用程序按预期与数据库交互至关重要。假设有一个查询数据库以按 ID 检索用户的函数:

图片

可以使用pytest装置来管理数据库连接和回滚事务,以确保测试状态一致:

图片

使用 Pytest 进行软件测试的最佳实践的讨论

遵循软件测试的最佳实践不仅可以提高代码质量,还可以使测试过程更加高效和有效。以下是使用 pytest 时的一些推荐做法:

1.保持测试简单且集中:每个测试都应该验证一个行为或概念。保持测试简单且集中,可以更轻松地识别和解决出现的问题。

2.使用描述性测试函数名称:描述性名称有助于理解测试的目的。采用清晰表明每个测试正在检查的内容的命名约定。

3.利用夹具进行安装和拆卸:利用 pytest 夹具来管理安装和拆卸操作。这促进了代码重用并有助于保持测试 DRY(不要重复自己)。

4.采用参数化来覆盖一系列输入:参数化测试有助于使用最少的代码针对广泛的输入值验证代码的行为。

5.维护一致的目录结构:遵循一致的目录结构可以更轻松地查找测试、装置和其他相关文件。

6.定期运行测试并自动化:定期运行测试有助于及早发现回归。尽可能自动化你的测试过程以确保一致性。

7.投入时间学习高级功能:Pytest 提供许多高级功能,例如标记、插件和模拟。学习这些可以显着提高您的测试能力。

在项目中使用 pytest 时结合这些最佳实践将培养质量保证文化,并为项目的成功和可维护性做出重大贡献。

八、结论

通过上面的介绍,带领大家了解了用于设置和拆卸的固定装置的概念,参数化测试以涵盖一系列情况,并深入研究了一些高级功能,例如使用标记、插件以及处理异常和模拟,所有这些都在 pytest 生态系统中实现的。

当你超越基础知识时,丰富的资源和充满活力的社区正在等待着支持您的 pytest 工作。参与pytest 社区,参与讨论,做出贡献,并继续探索 pytest 提供的无数功能。官方文档是一个信息宝库,并且有许多插件可用于进一步扩展 pytest 的功能。

下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

最后: 可以在公众号:程序员小濠 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!

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

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

相关文章

transformer上手(3) —— 开箱即用的 pipelines

1 开箱即用的 pipelines Transformers 库将目前的 NLP 任务归纳为几下几类: 文本分类:例如情感分析、句子对关系判断等;对文本中的词语进行分类:例如词性标注 (POS)、命名实体识别 (NER) 等;文本生成:例如…

2024年MathorCup数学建模A题移动通信网络中PCI规划问题解题文档与程序

2024年第十四届MathorCup高校数学建模挑战赛 A题 移动通信网络中PCI规划问题 原题再现: 物理小区识别码(PCI)规划是移动通信网络中下行链路层上,对各覆盖小区编号进行合理配置,以避免 PCI 冲突、PCI 混淆以及 PCI 模3 千扰等现象。PCI 规划…

milvus各组件的结构体分析

milvus各组件的结构体分析 各组件启动,需要构建各组件的结构体,一共8个。 runComponent(ctx, localMsg, wg, components.NewRootCoord, metrics.RegisterRootCoord) runComponent(ctx, localMsg, wg, components.NewProxy, metrics.RegisterProxy) run…

lv_micropython for ESP32-C3

一、开发平台说明 硬件:立创实战派ESP32-C3开发板。处理器ESP32-C3(内置400KB SRAM),无内置FLASH,2.0寸液晶(液晶驱动IC:ST7789,触屏驱动IC:FT6336),下载口UART0。 ESP…

c++ 中文转拼音的封装, char 类型 不支持 中文 已解决

在日常业务中&#xff0c;需要进行中文转拼音的检索。已便实现对应的 模糊搜索。 使用方法 std::string res "我是中国人";char* result new char[res.length() 1];for (int i 0; i < res.length(); i){result[i] res[i];}result[res.length()] \0;std::str…

【C++第三阶段】vector容器

以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 构造函数赋值操作容量和大小插入和删除数据存取互换容器预留空间 构造函数 vector函数是常用数据结构&#xff0c;见于刷题网站。 它是单端数组&#xff0c;与普通数组区别在于可以…

【Linux】基础IO----理解缓冲区

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;理解缓冲区 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! > 专栏选自&#xff1a;Linux初阶 > 望…

Aritest+python+Jenkins解放双手iOS/Android自动化

ARITest、Python 和 Jenkins 可以结合在一起创建一个自动化测试解决方案&#xff0c;实现持续集成和持续测试的目标。以下是三者如何协同工作的基本概念&#xff1a; 1. **ARITest**&#xff1a; ARITest 是一款功能全面的自动化测试工具&#xff0c;提供 UI 自动化、接口自…

独立服务器,数据安全保障:WorkPlus即时通讯为企业信息安全把关

随着手机普及率的不断增加&#xff0c;即时通讯已经成为了企业内部沟通的重要方式。WorkPlus作为一家领先的企业级即时通讯服务商&#xff0c;提供了全方位的即时通讯解决方案&#xff0c;助力企业实现沟通无障碍、协作高效率的目标。 WorkPlus提供了多样化的即时通讯功能&…

轻松解锁销售利润!使用淘宝商品关键词搜索API接口

随着电商行业的快速发展&#xff0c;如何提高销售利润成为了卖家们的关注焦点。淘宝商品关键词搜索API接口提供了一种高效的方式来帮助卖家们找到最适合的商品关键词&#xff0c;提高商品曝光率和销售量。联讯数据将全面介绍淘宝商品关键词搜索API接口的用途、优势以及如何使用…

蓝桥杯模拟赛题——魔法失灵了——toRefs()

目标 找到 index.html 中 TODO 部分&#xff0c;正确修复代码使 data 对象恢复响应式特性&#xff0c;即点击页面上的 - 与 按钮可以改变 value 的值。正确实现后效果如下&#xff1a; 题解 value是reactive 利用toRefs; toRefs() 函数可以将 reactive() 创建出来的响应式对象…

数据结构之单链表的相关知识点及应用

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构 目录 链表的概念及结构 链表与顺序表的区别与优劣势 链表的分类 单链表的实现 单链表中增加节点 单链表中尾插数据 打印单链…

《零基础入行IT:步步为营的转型攻略与实践策略》

在信息化社会&#xff0c;IT行业以其强劲的发展势头、广阔的就业前景和丰厚的薪酬待遇&#xff0c;吸引了无数希望转行或初入职场人士的目光。然而&#xff0c;对于毫无相关背景知识的人来说&#xff0c;如何成功叩开IT行业的大门&#xff0c;似乎是一项颇具挑战性的任务。本文…

visual studio 2017开发QT框架程序

1. 配置开发环境 首先创建项目 进入到项目后&#xff0c;右键点击项目点击属性&#xff0c;配置如下&#xff1a;

Window11的CUDA 和CUDNN的安装

确定自己电脑的英伟达驱动版本 打开英伟达的控制面板:确定自己的版本,安装的CUDA和CUDNN不能超过这个版本 下载CUDA (我个人安装的是CUDA12)CUDA12的下载网址 下载网址 下载到安装包之后,直接点击就可以完成安装: 完成之后会有个文件夹:

linux上使用redis-cli登录以及操作redis

1、找到redis-cli 2、输入redis-cli回车 3、登录redis 输入auth密码 4、登录成功

stm32 之SPI通信协议

本文为大家介绍 SPI 通信协议的基础知识。 文章目录 前言一、SPI协议的概念二、SPI总线架构三、SPI通讯时序1. 起始&#xff0c;停止 信号2.CPOL&#xff08;时钟极性&#xff09;/CPHA&#xff08;时钟相位&#xff09; 四&#xff0c; I2C 总线 和SPI 总线比较相同点&#xf…

Elastic 线下 Meetup 将于 2024 年 4 月 27 号在重庆举办

2024 Elastic Meetup 重庆站活动&#xff0c;由 Elastic、新智锦绣联合举办&#xff0c;现诚邀广大技术爱好者及开发者参加。 活动时间 2024年4月27日 13:30-18:00 活动地点 中国重庆 沙坪坝区学城大道62-1号研发楼一期b3栋1楼(瑞幸咖啡旁&#xff09; 活动流程 14:00-14:50…

卫星图像10个开源数据集资源汇总

文章目录 1、UC Merced Land-Use 2、Indian Pines 3、KSC 4、Washington DC 5、BigEarthNet 6、水体卫星图像的图像 7、城市航拍图像分割数据集 8、游泳池和汽车卫星图像检测 9、人工月球景观数据集 10、马萨诸塞州道路数据集 1、UC Merced Land-Use 数据集下载地址&am…

Windows系统本地部署Jupyter Notebook并实现公网访问编辑笔记

文章目录 1.前言2.Jupyter Notebook的安装2.1 Jupyter Notebook下载安装2.2 Jupyter Notebook的配置2.3 Cpolar下载安装 3.Cpolar端口设置3.1 Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 在数据分析工作中&#xff0c;使用最多的无疑就是各种函数、图表、…