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.hqwc.cn/news/625092.html

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

相关文章

SSA-LSTM多变量时序预测 基于麻雀搜索算法-长短期记忆神经网络多变量时序预测 (多输入单输出)

文章目录 效果一览文章概述订阅专栏只能获取一份代码部分源码参考资料效果一览 文章概述 SSA-LSTM多变量时序预测 基于麻雀搜索算法-长短期记忆神经网络多变量时序预测 (多输入单输出) 订阅专栏只能获取一份代码 部分源码 %

Go Plugin:动态模块的加载与问题解析_go语言加载动态库的工具(1)

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7 深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞…

百货商场用户画像描绘与价值分析

目录 内容概述数据说明实现目标技术点主要内容导入模块1.项目背景1.1 项目背景与挖掘目标 2.数据探索与预处理2.1 结合业务对数据进行探索并进行预处理2.2 将会员信息表和销售流水表关联与合并 3 统计分析3.1 分析会员的年龄构成、男女比例等基本信息3.2 分析会员的总订单占比&…

ThreadLocal和ThreadLocalHashMap

请直接百度详细介绍 -------------------------------------------------------------------------------------------------------------------------------- 1.ThreadLocalMap是Thread类里的一个局部变量 2.ThreadLocalMap是ThreadLocal类里的一个静态内部类, 3.ThreadL…

数据密集型应用系统设计 PDF 电子书(Martin Kleppmann 著)

简介 《数据密集型应用系统设计》全书分为三大部分: 第一部分,主要讨论有关增强数据密集型应用系统所需的若干基本原则。首先开篇第 1 章即瞄准目标:可靠性、可扩展性与可维护性,如何认识这些问题以及如何达成目标。第 2 章我们比…

Weakly Supervised Audio-Visual Violence Detection 论文阅读

Weakly Supervised Audio-Visual Violence Detection 论文阅读 摘要III. METHODOLOGYA. Multimodal FusionB. Relation Modeling ModuleC. Training and Inference IV. EXPERIMENTSV. CONCLUSION阅读总结 文章信息: 发表于:IEEE TRANSACTIONS ON MULTIME…

Yolo-world+Python-OpenCV之摄像头视频实时目标检测

上一次介绍了如何使用最基本的 Yolo-word来做检测,现在我们在加opencv来做个实时检测的例子 基本思路 1、读取离线视频流 2、将视频帧给yolo识别 3、根据识别结果 对视频进行绘制边框、加文字之类的 完整代码如下: import datetimefrom ultralytics …

代码随想录训练营Day 24|Python|Leetcode|93.复原IP地址, 78.子集,90.子集II

93.复原IP地址 有效 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 . 分隔。 例如:"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址,但是 &q…

Hive-Sql复杂面试题

参考链接:hive sql面试题及答案 - 知乎 1、编写sql实现每个用户截止到每月为止的最大单月访问次数和累计到该月的总访问次数 数据: userid,month,visits A,2015-01,5 A,2015-01,15 B,2015-01,5 A,2015-01,8 B,2015-01,25 A,2015-01,5 A,2015-02,4 A,20…

数智时代的AI人才粮仓模型解读白皮书(2024版)

来源:极客邦 自 2023 年上半年起,ChatGPT 等大模型技术蓬勃发展,AI 技术不断突破边界,展现 出惊人的潜力和发展速度。从早期的逻辑推理、专家系统,到如今的深度学习、神经网络, AI 技术显著缩小了科学与实…

使用python采集VIP会电商平台商品数据①

获取标头: 响应:服务器返回的数据 预览:查看响应得数据 载荷:查询参数/请求参数 标头:查看请求的网址/请求的标头/请求方法 数据包地址:https://mapi.vip.com/vips-mobile/rest/shopping/pc/product/mo…

安全中级-环境安装(手动nginx以及自动安装php,mysql)

为了方便大家跟bilibili课程,出了第一节环境 bilibili搜凌晨五点的星可以观看相关的教程 一、环境 ubentu 二、nginx手动安装 2.1第一步 wget https://nginx.org/download/nginx-1.24.0.tar.gz 2.2下载好安装包以后解压 tar -zxvf nginx-1.21.6.tar.gz2.3安…