Python测试之Pytest详解

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1


概要

当涉及到python的测试框架时,pytest是一个功能强大且广泛应用的第三方库。它提供简洁而灵活的方式来编写和执行测试用例,并具有广泛的应用场景。下面是pytest的介绍和详细使用说明:

pytest是一个用于python单元测试的框架,它建立在标准的unittest模块之上,并提供了更简洁、更易于使用的语法风格。它支持丰富的断言库,提供丰富的插件和扩展性,可以轻松地进行测试的编写、执行和报告。pytest的设计哲学强调可读性、灵活性和可扩展性,使得它适用于各种单元测试和集成测试场景。

在使用pytest工具之前,我们有必要了解一下python的一个关键字assert

1. assert关键字

assertpython中的一个关键字,用于在代码中执行断言。它用于检查一个条件是否为真,如果条件为假,则会引发AssertionError异常,以指示代码中的错误或意外情况。assert语句通常在调试和测试中使用,用于验证程序的正确性。使用方法如下:

1.1 基本使用

assert语句的一般用法如下:

assert condition, message

其中:

  • condition 是要检查的条件,如果为 False,则会引发 AssertionError 异常。

  • message 是可选的附加消息,用于在断言失败时提供更具体的错误信息。这对于识别断言失败的原因非常有用。

示例:

def divide(a, b):assert b != 0, "除数不能为零"return a / bresult = divide(10, 0)
print(result)

在上面的示例中,我们定义了一个 divide 函数,它执行两个数相除的操作。在执行除法之前,我们使用 assert语句来确保除数 b 不为零,如果为零,则会引发 AssertionError 异常,并在错误消息中指定除数不能为零的原因。

1.2 注意事项

  1. assert语句主要用于调试和测试目的,因此在正式生产代码中使用时要谨慎,并注意在所需的情况下使用适当的异常处理机制。

  2. 断言的目的是在运行时检查代码的假设条件,并帮助捕获潜在的错误。它不应该用于处理预期的错误情况(例如输入验证),而应该用于检查不应该发生的情况。

1.3 小结

assert关键字是python中的一个断言语句,用于检查条件的真假,并在条件为假时引发 AssertionError。它用于调试和测试目的,帮助识别代码中的错误或意外情况。但请注意,在正式生产代码中使用时要谨慎,并遵循适当的异常处理机制。

聊完了,assert,接下来我们可以深入了解一下pytest这个第三方库在代码测试方面的使用。

2.pytest代码测试

它提供了简洁而灵活的方式来编写和执行测试用例,并且具有广泛的应用场景。以下是一些关于 Pytest 的介绍:

  1. 简洁的语法:Pytest 具有简洁、直观的语法,比传统的 unittest 更易于使用和阅读。你可以使用函数来定义测试用例,以 test_ 开头,并使用断言来验证预期结果。

  2. 自动发现:Pytest 能够自动发现项目中的测试文件和测试用例,并在不需要额外配置的情况下执行它们。只需运行 pytest 命令,它会根据约定的命名规则查找测试文件和测试函数。

  3. 丰富的断言支持:Pytest 提供了丰富的断言支持,包括标准的 assert 语句、使用内置的 assert 断言模块的自定义断言、以及第三方断言库(如 pytest-assume 和 pytest-check)。

2.1 使用方法

安装pytest,可以使用pip安装pytest

pip install pytest

编写测试用例:pytest使用一种基于函数的方式编写测试用例。创建一个以test_开头的函数,根据需要添加断言来验证预期结果。示例代码如下:

def test_addition():assert 1 + 1 == 2def test_subtraction():assert 5 - 2 == 3

运行测试:在命令行中,运行以下命令来执行测试用例:

pytest

pytest将会自动发现项目中以test_开头的函数,并执行这些函数作为测试用例。

下面给出一个简单的测试用例:

class Bag:def __init__(self, maxsize=10):self.size = maxsizeself._item = []def add(self, item):if len(self) >= self.size:raise Exception('full')self._item.append(item)def remove(self, item):self._item.remove(item)def __len__(self):return len(self._item)def __iter__(self):for item in self._item:yield itemdef test_bag():bag = Bag()bag.add(1)bag.add(2)bag.add(3)assert len(bag) == 3bag.remove(3)assert len(bag) == 2for item in bag:print(item)if __name__ == '__main__':test_bag()

运行如下:

2.2 断言和测试标记

pytest支持广泛的断言,包括assert语句、使用内置assertions模块的自定义断言和第三方断言库,例如pytest-assume和pytest-check。

可以使用测试标记来组织和过滤测试用例。例如,使用@pytest.mark.skip标记来跳过某些测试,使用@pytest.mark.parametrize实现参数化测试。

2.3 使用插件和扩展:

pytest具有丰富的插件生态系统,可以通过安装和配置插件来扩展其功能。例如,有插件用于生成详细的测试报告、支持测试覆盖率的检查和集成、分布式测试等。

您可以使用pytest.fixture装饰器创建和共享测试固件,使用pytest.mark标记来控制测试的选择和执行,使用插件来生成详细报告、进行性能测试等。

测试配置文件:

可以通过创建pytest.ini或setup.cfg等配置文件来自定义pytest的行为。可以配置测试文件的匹配模式、报告格式、插件设置等。

pytest框架具有很强的灵活性和扩展性,适用于各种python测试场景。它提供了直观的语法、丰富的断言和插件生态系统,使得测试编写和执行变得更加便捷和高效。

pytest --help

运行上述命令可以获得更多关于pytest的命令行选项和用法信息。

这是对pytest的简要介绍和使用说明。请注意,这只是一个简单的入门指南,希望这个更完整的介绍和使用说明能帮助您开始使用pytest进行python测试。如果有其他问题或者指正,请随时提问与我交流!

3.总结

总而言之,Pytest作为一个功能强大的第三方测试库,为Python开发者提供了优雅且简单的方式来编写和执行测试。本文介绍了Pytest的基础概念和使用方法,包括使用简洁的语法编写测试用例、自动发现测试文件、丰富的断言支持以及参数化测试等。

我们还深入讨论了如何利用夹具来组织测试环境和共享设置代码片段。通过使用Pytest插件,我们可以自定义和扩展测试功能,例如生成详细的测试报告、检查测试覆盖率和并行运行测试。通过学习和掌握Pytest,我们能够更轻松地编写高质量的测试,提高Python应用程序的质量和可靠性。

Pytest的简单实用性使其成为任何Python开发者测试工具箱中必不可少的一部分。

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

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

相关文章

Dubbo篇---第一篇

系列文章目录 文章目录 系列文章目录一、说说一次 Dubbo 服务请求流程?二、说说 Dubbo 工作原理三、Dubbo 支持哪些协议?一、说说一次 Dubbo 服务请求流程? 基本工作流程: 上图中角色说明: 二、说说 Dubbo 工作原理 工作原理分 10 层: 第一层:service 层,接口层,…

Flutter 05 组件状态、生命周期、数据传递(共享)、Key

一、Android界面渲染流程UI树与FlutterUI树的设计思路对比 二、Widget组件生命周期详解 1、Widget组件生命周期 和其他的视图框架比如android的Activity一样,flutter中的视图Widget也存在生命周期,生命周期的回调函数体现在了State上面。组件State的生命…

mysql索引深度学习

索引是什么? 索引是一种用于加快查询和索引的数据结构,其本质上就是一种排序好的数据结构,就类似书的目录。 索引的底层有多种实现的结构:b树,b树,Hash,红黑树。InnoDB和MyISAM的索引都是通过…

Vue 中的 computed 和 watch 的区别

引言 在Vue.js中,computed和watch是两个常用的属性,用于处理数据的监听和响应。它们在功能上有一些相似之处,但也有一些重要的区别。本文将介绍computed和watch的区别,并提供相关的代码示例。 使用computed 和 watch 的好处 Vue…

Python模块psutil:系统进程管理与Selenium效率提升的完美结合

前言 在前面编写一个Selenium的自动化程序时候,发现一个问题。 因笔记本配置较为差,所以每次初始化Selenium的WebDriver都会非常慢,整个等待过程是不友好的。 所以我就想到: 在程序中初始化一个全局的WebDriver对象&#xff0c…

pytorch-损失函数-分类和回归区别

torch.nn 库和 torch.nn.functional库的区别 torch.nn库:这个库提供了许多预定义的层,如全连接层(Linear)、卷积层(Conv2d)等,以及一些损失函数(如MSELoss、CrossEntropyLoss等&…

nginx负载配置

Nginx是一款高性能的Web服务器,同时也是一款高效的反向代理和负载均衡工具。在高并发的情况下,使用Nginx进行负载均衡可以提高网站的并发处理能力,保证网站的稳定性和可用性。下面是一些关于Nginx负载均衡的基础知识和配置方法。 Nginx负载均…

算法——多数相和

三数 15. 三数之和 - 力扣&#xff08;LeetCode&#xff09; 所以代码实现应该是 vector<vector<int>> threeSum(vector<int>& nums) {int n nums.size();sort(nums.begin(), nums.end()); // 对数组进行排序&#xff0c;以便后续操作vector<vector…

【微信小程序】自定义组件(二)

自定义组件 纯数据字段1、什么是纯数据字段2、使用规则 组件的生命周期1、组件全部的生命周期函数2、组件主要的生命周期函数3、lifetimes节点 组件所在页面的生命周期1、什么是组件所在页面的生命周期2、 pageLifetimes节点3、生成随机的颜色值 纯数据字段 1、什么是纯数据字…

快速了解推荐引擎检索技术

目录 一、推荐引擎和其检索技术 二、推荐引擎的整体架构和工作过程 &#xff08;一&#xff09;用户画像 &#xff08;二&#xff09;文章画像 &#xff08;三&#xff09;推荐算法召回 三、基于内容的召回 &#xff08;一&#xff09;召回算法 &#xff08;二&#xf…

C#高级--IO详解

零、文章目录 IO详解 1、IO是什么 &#xff08;1&#xff09;IO是什么 IO是输入/输出的缩写&#xff0c;即Input/Output。在计算机领域&#xff0c;IO通常指数据在内部存储器和外部存储器或其他周边设备之间的输入和输出。输入和输出是信息处理系统&#xff08;例如计算器&…

分享者 - 携程旅游创作者搬砖项目图文教程

大家好&#xff01;携程这个出行旅游平台相信大家都不陌生吧。 每天都有大量的旅客在里面浏览攻略&#xff0c;寻找灵感和旅游建议。 那么&#xff0c;我们的项目就是把一些优质的小红书平台上的旅游攻略或作品&#xff0c;经过处理后搬运到携程平台上发布。 这个项目如何操作呢…

Portraiture4.1.2最新中文汉化版

提起PS后期修图人像美白磨皮&#xff0c;大家会想到各种磨皮工具&#xff0c;其中Portraiture这款磨皮效率超高&#xff0c;是99%摄影师的必备插件&#xff0c;一秒磨皮&#xff0c;无卡顿&#xff0c;效果好&#xff01;人像摄影师人均一款&#xff0c;磨皮质感非常好&#xf…

Java 正则表达式重复匹配篇

重复匹配 * 可以匹配任意个字符&#xff0c;包括0个字符。 可以匹配至少一个字符。? 可以匹配0个或一个字符。{n} 可以精确指定 n 个字符。{n,m} 可以精确匹配 n-m 个字符。你可以是 0 。 匹配任意个字符 匹配 D 开头&#xff0c;后面是任意数字的字符&#xff0c; String …

独创改进 | RT-DETR 引入双向级联特征融合结构 RepBi-PAN | 附手绘结构图原图

本专栏内容均为博主独家全网首发,未经授权,任何形式的复制、转载、洗稿或传播行为均属违法侵权行为,一经发现将采取法律手段维护合法权益。我们对所有未经授权传播行为保留追究责任的权利。请尊重原创,支持创作者的努力,共同维护网络知识产权。 文章目录 YOLOv6贡献RepBi-…

实习记录--(海量数据如何判重?)--每天都要保持学习状态和专注的状态啊!!!---你的未来值得你去奋斗

海量数据如何判重&#xff1f; 判断一个值是否存在&#xff1f;解决方法&#xff1a; 1.使用哈希表&#xff1a; 可以将数据进行哈希操作&#xff0c;将数据存储在相应的桶中。 查询时&#xff0c;根据哈希值定位到对应的桶&#xff0c;然后在桶内进行查找。这种方法的时间复…

一站式解决方案:体验亚马逊轻量服务器/VPS的顶级服务与灵活性

文章目录 一、什么是轻量级服务器/VPS 二、服务器创建步骤 三、服务器连接客户端(私钥登录) 四、使用服务器搭建博客网站 五、个人浅解及总结 一、什么是轻量级服务器/VPS 亚马逊推出的轻量级服务器/VPS&#xff1a;是一种基于云计算技术的虚拟服务器解决方案。它允许用户…

0005Java安卓程序设计-ssm基于Android的网店系统

文章目录 **摘要**目录系统设计开发环境 编程技术交流、源码分享、模板分享、网课教程 &#x1f427;裙&#xff1a;776871563 摘要 随着Internet的发展&#xff0c;人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化&#xff0c;网络化和电子化。网上管…

Spring Boot 3 整合 xxl-job 实现分布式定时任务调度,结合 Docker 容器化部署(图文指南)

目录 前言初始化数据库Docker 部署 xxl-job下载镜像创建容器并运行访问调度中心 SpringBoot 整合 xxl-jobpom.xmlapplication.ymlXxlJobConfig.java执行器注册查看 定时任务测试添加测试任务配置定时任务测试结果 结语附录xxl-job 官方文档xxl-job 源码测试项目源码 前言 xxl-…

代码随想录算法训练营第四十三天丨 动态规划part06

518.零钱兑换II 思路 这是一道典型的背包问题&#xff0c;一看到钱币数量不限&#xff0c;就知道这是一个完全背包。 对完全背包还不了解的同学&#xff0c;可以看这篇&#xff1a;动态规划&#xff1a;关于完全背包&#xff0c;你该了解这些&#xff01;(opens new window)…