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 pytest

if __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框架~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GitHub repository - commits - branches - releases - contributors

GitHub repository - commits - branches - releases - contributors 1. commits2. branches3. releases4. contributorsReferences 1. commits 在这里可以查看当前分支的提交历史。左侧的数字表示提交数。 2. branches 可以查看仓库的分支列表。左侧的数字表示当前拥有的分…

asyncio异步编程

参考视频:02 协程_哔哩哔哩_bilibili 1.协程:(不是计算机中真实存在的,人为创造出的概念),也可称为微线程。 本质是用一个线程在一段代码中来会切换游走的线程,是一种用户态内的上下文切换技术…

【数据结构与算法】最大公约数与最小公倍数

最大公因数(英语:highest common factor,hcf)也称最大公约数(英语:greatest common divisor,gcd)是数学词汇,指能够整除多个非零整数的最大正整数。例如8和12的最大公因数…

Linux系统部署可视化数据多维表格APITable并实现无公网IP远程协同办公

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-G5XdKx1vxX0o0PES {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

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

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

上网方法介绍

注册 https://www.cordcloud.biz/user 注册后先充值,充值后还要购买套餐, 充值之后,就可以看到流量了,然后复制订阅地址,到客户端去自动下载 URL拷贝到这个地方,然后点击下载

latex论文写作学习

首先无论是什么文章,最基础的格式都是这个: 如何修改字体呢?: 这样一来就可以在写完之后统一改掉了,用来做标记 最后记得\par 插图: 命令后面的中括号一般就是option

ESP32S3学习笔记(0)—— Vscode IDF环境搭建及OpenOCD调试介绍

前言 (1)如果有嵌入式企业需要招聘湖南区域日常实习生,任何区域的暑假Linux驱动/单片机/RTOS的实习岗位,可C站直接私聊,或者邮件:zhangyixu02gmail.com,此消息至2025年1月1日前均有效 &#xff…

男生穿什么裤子最百搭?适合男生穿的裤子品牌测评分享

每个伙伴们想必经常都会选择一些裤子,但现在市面上的裤子品牌也实在太多了,好不容易选到了几件好看的裤子,结果质量却很不好。主要就是因为现在有太多商家为了利润而使用一些舒适性、质量差的面料,那么今天就给大家分享一些质量上…

实战小项目 | ESP32-S3和ESP32-C3通过ESP-Mesh-Lite组网 温湿度传感器案例

传统Wi-Fi网络所有终端设备都需要直接与路由器相连,这使得Wi-Fi的覆盖区域受到路由器位置的限制,可接入终端设备的数量也受到路由器容量的限制。而乐鑫ESP-Mesh-Lite Wi-Fi组网方案,所有终端设备都可以与相邻设备连接,摆脱了对路由…

酒店水电能源计量管理系统

酒店水电能源计量管理系统是一种针对酒店行业设计的能源管理系统,旨在实现对水电能源的计量、监测和管理。本文将从系统特点、构成以及带来的效益三个方面展开介绍。 系统特点 1.多元化计量:该系统能够对酒店内的水、电能源进行多元化计量,…

【C++学习】map和set

目录 一、关联式容器 二、键值对 三、树形结构的关联式容器 四、set 4.1 set的介绍 4.2 set的使用 4.2.1 set的模板参数列表 4.2.2 set的构造 4.2.3 set的容量 4.2.4 set修改操作 4.2.5 set的使用举例 五、map 5.1 map的介绍 5.2 map的使用 5.2.1 map的模板参数说…

【Qt 学习笔记】Qt常用控件 | 按钮类控件Check Box的使用及说明

博客主页:Duck Bro 博客主页系列专栏:Qt 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Qt常用控件 | 按钮类控件Check Box的使用及说明 文章编号:…

自动化测试-如何优雅实现方法的依赖

在复杂的测试场景中,常常会存在用例依赖,以一个接口自动化平台为例,依赖关系: 创建用例 --> 创建模块 --> 创建项目 --> 登录。 用例依赖的问题 • 用例的依赖对于的执行顺序有严格的要求,比如让被依赖的方…

揭秘智慧礼品背后的故事

如若不是从事技术行业,在罗列礼品清单时,可能不会想到 “数据”,但幸运的是,我们想到了。如何将AI技术应用到当季一些最受青睐的产品中去,训练数据是这一智能技术的背后动力。很多电子设备或名称中带有“智能”一词的设…

TikTok赚钱攻略 | 这6个方法你必须知道

在浩瀚的网络世界中,TikTok成为了一个让普通人一夜成名的舞台。Khabane Lame和Charli DAmelio就是其中的明星例子。无论是Khabane简单的肢体幽默还是Charli的舞蹈视频,他们都凭借TikTok赚钱,并且成功转变了自己的人生轨迹。他们的故事证明&am…

【kafka】安装

也是第二次安装,蛮记录一下 1.安装kafka之前需要先完成zookeeper的安装 【zookeeper】安装 2. Apache Kafka官网下载 3. 解压完成后修改server.properties配置文件 修改日志文件存放路径 查看与zookeeper连接的端口是否和zookeeper服务所在的端口一致 &#xf…

BTI性能开销权衡及优化措施

BTI分支目标识别精讲与实践系列 思考 1、什么是代码重用攻击?什么是ROP攻击?区别与联系? 2、什么是JOP攻击?间接分支跳转指令? 3、JOP攻击的缓解技术?控制流完整性保护? 4、BTI下的JOP如何…

智能助手大比拼!5款热门思维导图软件细致评估!

思维导图是一种创造性的方法,集思广益,寻找不同想法之间的联系。如果你做得好,你可以为难题提出新的想法和解决方案,总结一篇文章或演示稿,让你的想法井然有序。在数字时代,纸质思维导图存在不能随意更改、…

Nginx内存池相关源码剖析(六)外部资源释放和内存池销毁

ngx_destroy_pool函数 先执行回调函数释放所有的外部资源,然后free释放所有的大块内存和小块内存。 // 释放外部资源,销毁内存池 void ngx_destroy_pool(ngx_pool_t *pool) {ngx_pool_t *p, *n;ngx_pool_large_t *l;ngx_pool_cleanup_t *…