Python的pytest框架(1)--基本概念、入门

按基础到进阶的顺序,学习Python的pytest框架,本篇文章先讲一讲pytest的基本概念、入门使用规则。

目录

一、pytest基础知识

1、安装

2、pytest框架主要做了什么工作

二、pytest的规则约定、运行方式以及参数详解

1、编写测试用例

模块(文件)命名规则:

测试类命名规则:

测试方法命名规则:

使用assert进行断言:

2、运行测试

命令行模式

主函数模式

pytest.ini配置文件

测试失败时的输出解读

(1). 测试结果概览

(2).失败测试详细信息

(3).回溯(Traceback)


一、pytest基础知识

pytest是一个基于Python语言的单元测试框架,它可以和selenium、requests、appium结合实现web、接口、app自动化测试,它可以通过结合各种第三方库来实现自动化测试和其他工作,关于pytest框架系列的文章我们主要就pytest进行学习讨论。

1、安装

步骤:命令行环境确保已安装Python并配置好环境变量,通过pip安装:

pip install pytest#如果已安装旧版本
pip install --upgrade pytest  #可升级至最新版本pytest

在pycharm集成环境中,可以在terminal终端命令框中输入同上指令安装

pytest有很多强大的插件:

  • pytest-html 生成html报告
  • pytest-xdist 多线程
  • pytest-ordering 控制测试用例执行顺序
  • pytest-rerunfailures 失败用例重跑
  • pytest-base-url 基础路径
  • allure-pytest 生成allure报告

我们可以通过一个requirements.txt文件保存这些插件和第三方库,一次性安装

pip install -r requirements.txt

验证安装,在命令行环境输入:

pytest --version

如输出版本号,即验证安装成功

2、pytest框架主要做了什么工作

(1)、自动发现并执行测试用例

(2)、利用断言语句判断测试结果,断言失败时,pytest会输出清晰的错误消息,包括表达式、预期值、实际值以及上下文信息

(3)、生成测试报告

pytest框架能做的工作还能细分很多,在此不一一例举,我们先了解大致

二、pytest的规则约定、运行方式以及参数详解

1、编写测试用例

pytest通过特定的文件名和函数名约定来自动发现测试用例。对于测试用例函数,其名称应遵循以下规则:

模块(文件)命名规则:

文件名:测试模块(即Python源文件)应遵循以下命名规则之一:

以 test_ 开头,如 test_math.py。
以 _test.py 结尾,如 math_test.py。

通过这样的命名,pytest能在自动发现测试时识别出这些文件包含了测试代码。

测试类命名规则:

类名:测试类的名称应以字符串 "Test" 作为前缀。例如:

class TestMathFunctions:...

类名应具有描述性,反映所包含测试方法所属的功能或模块。遵循这一命名约定的类会被pytest视为测试集合类,其中的方法会被当作独立的测试用例来执行。

测试方法命名规则:

方法名:测试方法(即测试用例)应以字符串 "test_" 作为前缀。例如:

def test_addition():...

方法名应具体描述被测试的功能或场景,以便于快速理解测试的目的。pytest会自动识别并执行以 test_ 开头的函数作为测试用例。

注意事项:

避免定义 __init__ 方法:在测试类中,通常不应定义 __init__ 构造方法。pytest在实例化测试类时并不期望它们具有自定义的初始化逻辑。如果需要执行与类相关的初始化操作,可以使用类级别的setup/teardown方法(如setup_class 和 teardown_class)。

方法可见性:测试方法应为公有(def test_something():)或受保护(def test_something(self):),不推荐使用私有方法(def _test_something(self):),因为私有方法不会被pytest自动发现。

方法顺序:pytest在类内执行测试方法的顺序通常是按照方法在类中定义的顺序进行,而非方法名排序。

遵循上述命名规则,pytest能够有效地识别并组织项目的测试用例,简化测试执行过程,确保测试自动化工作的顺利进行。在实践中,除了这些基本命名规则外,还应注意保持测试代码的整洁与可读性,以及合理利用pytest提供的fixture、参数化测试等功能来提高测试的效率与覆盖率。

使用assert进行断言:

在测试用例中,通过assert语句来设置预期结果与实际结果之间的比较。当断言条件为真时,测试通过;否则,测试失败,并抛出AssertionError。典型的pytest测试用例可能包含如下结构:

from my_module import Calculator #导入待测试模块、类def test_addition(): #测试方法calculator = Calculator()  #实例化待测试类result = calculator.add(2, 3)  #测试结果assert result == 5, f"结果应该等于5,但是输出结果为:{result}"  #断言测试结果,如果断言失败,抛出自定义异常

2、运行测试

命令行模式

用户可以直接在终端或命令提示符中输入 pytest 命令来运行测试。可以通过指定不同的参数和选项来控制测试的执行,如指定测试文件、目录、筛选特定测试、设定输出详细程度等。例如:

pytest    #运行当前目录及其子目录下的所有测试。
pytest path/to/test_file.py    #运行指定文件中的测试。
pytest path/to/test_directory    #运行指定目录下的所有测试。
pytest path/to/test_file.py::TestDemo     # 执行到对应模块下的类
pytest path/to/test_file.py::TestDemo::test_add    # 执行到对应模块下的类里的方法
pytest -v 或 pytest --verbose    #以详细模式运行,提供更丰富的输出信息。
pytest -k keyword    #仅运行包含指定关键字的测试。
pytest -m marker    #仅运行标记为特定标记(marker)的测试。#更多参数和选项可以通过 pytest --help 查看。

主函数模式

在 Python 脚本中直接调用 pytest.main() 函数来运行测试。这种方式允许在程序中嵌入pytest的执行,便于集成到其他自动化流程或者脚本中。可以传入参数列表来定制测试执行行为,如:

import pytestif __name__ == '__main__':
pytest.main()    #运行默认设置下的所有测试。
pytest.main(['-vs', 'test_login.py'])    #以详细和显示打印信息模式运行指定文件的测试。
pytest.main(['-vs', './in_testcase'])    #以同样详细模式运行指定目录下的所有测试。
pytest.main(['-vs', './in_testcase/test_interface.py::test_04_func'])    #运行指定文件内特定函数的测试。
pytest.main(['-vs', './in_testcase/test_interface.py::Testinterface::test_03_zhiliao'])    #运行指定文件内特定类和方法的测试。

pytest.ini配置文件

创建一个名为 pytest.ini 的配置文件,放置在项目根目录下。在这个文件中可以定义默认的命令行选项、测试收集规则、插件设置等。例如:

[pytest]
#配置运行时参数
addopts = -vs -m "user or smoke"
#配置发现测试用例的位置
testpaths = ./testcases
#配置并修改发现模块的默认规则
python_files = test_*.py
#配置并修改发现类的默认规则
python_classes = Test*
#配置并修改发现用例的默认规则
python_functions = test_*
#标记用例(冒烟测试,分模块运行测试用例,接口和web分离)
markers =
smoke:冒烟测试
user:用户管理模块

参数列表:
-v 输出详细信息

-s 输出调试信息

-n 多线程运行  可以减少运行时间

--reruns=x 失败用例重跑  一条用例可以失败重跑x次  自定义次数

-x 用例出现1个失败就停止测试

--maxfail=x 用例出现x个失败就停止测试

--html=路径 生成html报告   路径规则  要使用”/”  如../python_autotest_study/practice/reports.html 结尾要有文件名,可以使用相对路径  ./reports.html  生成在当前目录

-k=XX 运行名称中包含有特定字符串XX的测试用例

-m 用于执行特定标记的用例:-m "smoke or user"

运行测试时,pytest会自动读取并应用这些配置,无需在命令行中显式指定,pytest.ini配置文件只是配置全局,执行还是需要在命令行或者主函数模式执行。

运行模式总结

命令行模式适合日常手动执行和CI/CD环境中的自动化测试,主函数模式适用于在Python脚本中嵌入pytest执行,而配置文件则方便对整个项目的测试行为进行统一管理和持久化配置。

测试失败时的输出解读

当pytest测试失败时,其输出包含丰富的信息,帮助开发者快速定位和理解失败原因。以下是pytest测试失败时输出的解读:

(1). 测试结果概览

首先,pytest会显示一个简要的测试结果概览,通常包含以下内容:

  • 总测试数:执行的测试用例总数。
  • 通过数:成功通过的测试用例数量。
  • 失败数:导致失败的测试用例数量。
  • 跳过数(如果使用):被跳过的测试用例数量,可能由于标记(markers)或条件判断(如pytest.mark.skip、pytest.mark.skipif)导致。
  • 错误数(如果使用):测试执行过程中出现非预期错误(如代码异常)的测试用例数量。
  • 测试执行时间:整个测试套件的运行时间。

(2).失败测试详细信息

对于每个失败的测试,pytest会输出详细的错误信息,包括:

  • 测试路径:失败测试所在的文件名和行号,以及完整的测试函数签名(包括类名,如果有)。
  • 失败原因:AssertionError消息,通常包含断言失败的具体条件和实际值。如果使用了自定义的错误消息,也会在此处显示。
  • 堆栈跟踪:从失败点向上追溯的函数调用序列,直至测试函数的入口。堆栈跟踪有助于找到导致失败的代码行和上下文。如果测试失败涉及多个断言,pytest可能会为每个失败断言分别提供上述信息。
(3).回溯(Traceback)

紧随错误消息之后,pytest会显示一个详细的回溯(traceback),即从失败点开始向上遍历的函数调用链,直到引发错误的源头。每一层回溯包括:

  • 文件名:发生错误的Python源文件。
  • 行号:错误发生的代码行。
  • 函数/方法名:引发错误的函数或方法名称。
  • 源代码片段:错误发生位置的上下文代码行。

回溯信息有助于快速定位到导致失败的具体代码行,以及理解错误发生时的调用关系。

希望该篇文章能帮助到大家快速了解pytest的基础内容,知晓pytest的模块、类、方法命名约定,以及它的各种运行模式和统一管理配置,以便后续我们继续深入学习pytest框架~

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

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

相关文章

Oracle 19c RAC 补丁升级 补丁回退

补丁升级流程 补丁升级 停止集群备份家目录 两节点分别操作 cd /u01/app/19.3.0/grid/bin/ crsctl stop crs tar -zcvf /u01/app.tar.gz /u01/app /u01/app/19.0.0/grid/bin/crsctl start crs 两节点OPatch替换 --- 表示 root 用户,$ 表示 Oracle 用户提示符&#…

负荷预测 | Matlab基于TCN-GRU-Attention单变量时间序列多步预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于TCN-GRU-Attention单变量时间序列多步预测; 2.单变量时间序列数据集,采用前12个时刻预测未来96个时刻的数据; 3.excel数据方便替换,运行环境matlab2023及以…

无人棋牌室软硬件方案

先决思考 软件这一套确实是做一套下来,可以无限复制卖出,这个雀氏是一本万利的买卖。 现在肯定是有成套的方案,值不值得重做?为什么要重做? 你想达到什么效果?还是需要细聊的。 做这个东西难度不高&…

DNF手游攻略:萌新入坑大全!

玩DNF手游国服已经正式定档,离上线已经越来越近了,很多小伙伴对于装备打造以及附魔还不是特别了解。如果你还不知道装备要怎么附魔,不要担心,本篇攻略将为你全面解析全职业过渡和毕业附魔推荐。 ​ 一、物理职业附魔推荐 1. 武器…

1688推出跨境业务,用API自动对接商品货源

2023年底,出海圈迎来一则重磅消息:1688正式进军海外市场。这一决策引发了众多卖家的关注与疑惑,为何1688会在这个时候推出跨境版呢? 事实上,1688早已涉足跨境业务,拥有“跨境专供”板块,成为众…

【C++学习】C++IO流

这里写目录标题 🚀C语言的输入与输出🚀什么是流🚀CIO流🚀C标准IO流🚀C文件IO流 🚀C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取…

Cloudflare Workers 付费文档

定价 默认情况下,用户可以访问Workers免费计划。Workers免费计划包括对Workers、Pages Functions和Workers KV的有限使用。了解更多关于免费计划限制的信息。 Workers付费计划包括Workers、Pages Functions、Workers KV和Durable Objects的使用,每个账…

MedSAM环境搭建推理测试

引子 之前分享过一篇SAM(感兴趣的,请移步Segment Anything(SAM)环境安装&代码调试_segment anything环境-CSDN博客)环境搭建&推理测试,虽然话说Segment Anything,但是原始模型对于一些…

一文详解MES、ERP、SCM、WMS、APS、SCADA、PLM、QMS、CRM、EAM及其关系

经常遇到很多系统,比如:MES、ERP、SCM、WMS、APS、SCADA、PLM、QMS、CRM、EAM,这些都是什么系统?有什么功能和作用?它们之间的关系是怎样的? 今天就一文详细分享给大家。 10大系统之间的关系 ERP 和其他…

网络层协议——IP协议

目录 IP协议 IP协议格式 分片与组装 网段划分 特殊IP地址 IP地址的数量限制 私有IP地址和公网IP地址 路由 路由表生成算法 IP协议 IP协议全称为“网际互连协议(Internet Protocol)”,IP协议是TCP/IP体系中的网络层协议。 在应用层我…

一例白加黑样本的分析

概述 这是一个典型的白加黑的恶意代码,原始样本是一个自解压文件,可能是钓鱼样本,使用了一个合法签名的exe加载一个恶意的dll,在内存中解密和运行恶意载荷,,创建启动项的方式很特别,没有传播功…

FreeRTOS_day1

1.总结keil5下载代码和编译代码需要注意的事项 下载代码前要对仿真进行设置 勾选后代码会立刻执行 勾选后会导致代码不能执行 写代码的时候要写在对应的begin和end之间,否则会被覆盖 2.总结STM32Cubemx的使用方法和需要注意的事项 ①打开软件,新建工程…

深入理解神经网络学习率(定义、影响因素、常见调参方法、关键代码实现)

目录 什么是学习率? 有哪些影响因素? 常用调整方法? 博主介绍:✌专注于前后端、机器学习、人工智能应用领域开发的优质创作者、秉着互联网精神开源贡献精神,答疑解惑、坚持优质作品共享。本人是掘金/腾讯云/阿里云等平…

基于SpringBoot+Vue的计算机课程管理平台(源码+文档+包运行)

一.系统概述 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了基于工程教育认证的计算机课程管理平台的开发全过程。通过分析基于工程教育认证的计算机课程管理平台管理的不足,创建了一个计算机管理基于工…

第八届云计算与大数据计算国际会议(ICCBDC 2024)即将召开!

第八届云计算与大数据计算国际会议(ICCBDC 2024)将于2024年8月15-17日在英国的牛津布鲁克斯大学举行。云舞长空,数织经纬,ICCBDC 2024将围绕推动云计算与大数据技术的创新与发展,促进全球范围内的学术交流与合作,共同探索云计算与…

linux项目部署 解决Nginx浏览器刷新出现404,但是不刷新是能够正常请求成功

文章目录 目录 文章目录 安装流程 小结 概要安装流程技术细节小结 概要 提示:部署成功,访问登录页面登录也成功,强制刷新浏览器报404问题 进入到系统 刷新页面 解决流程 参考如图,再下面添加这条配置信息 location / {try_file…

说说你对集合的理解?常见的操作有哪些?

一、是什么 集合(Set),指具有某种特定性质的事物的总体,里面的每一项内容称作元素 在数学中,我们经常会遇到集合的概念: 有限集合:例如一个班集所有的同学构成的集合无限集合:例如…

LangChain入门:19.探索结构化工具对话

引言 在人工智能的浪潮中,对话代理技术正逐渐成为企业和开发者关注的焦点。LangChain,作为对话代理领域的一颗新星,自2021年9月诞生以来,以其强大的功能和灵活的应用场景迅速赢得了市场的认可。本文将带你深入了解LangChain中的S…

智慧公厕厂家,众多智慧公厕精品工程解读

智慧公厕,作为现代城市建设中的重要组成部分,正以其智能化、信息化的特点逐渐引起人们的关注。 一、什么是智慧公厕? 智慧公厕是什么?智慧公厕通过物联网、大数据、云计算、网络通信、自动化控制等技术,监测公厕内部…

深度学习知识点:卷积神经网络(CNN)

深度学习知识点:卷积神经网络(CNN) 前言卷积神经网络(CNN)卷积神经网络的结构Keras搭建CNN经典网络分类LeNetAlexNetAlexNet 对比LeNet 的优势? VGGVGG使用2个33卷积的优势在哪里?每层卷积是否只…