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

news2024/11/28 5:51:54

按基础到进阶的顺序,学习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框架~

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

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

相关文章

react17 + antd4 如何实现Card组件与左侧内容对齐并撑满高度

在使用antd进行页面布局时,经常会遇到需要将内容区域进行左右分栏,并在右侧区域内放置一个或多个Card组件的情况。然而,有时我们会发现右侧的Card组件并不能与左侧的栏目对齐,尤其是当左侧栏目高度动态变化时。本文将介绍如何使用…

基于绿证-阶梯式碳交易交互的源荷互补调度优化

基于绿证-阶梯式碳交易交互的源荷互补调度优化 基于绿证-阶梯式碳交易交互的源荷互补调度优化代码获取戳此处代码获取戳此处 23年新鲜代码,基本完成四个场景的复现。 针对多能精合的区域综合能源系统的低经济运行问题,提出基于绿证-阶梯式碳交易交与的源…

python之flask安装以及使用

1 flask介绍 Flask是一个非常小的Python Web框架,被称为微型框架;只提供了一个稳健的核心,其他功能全部是通过扩展实现的;意思就是我们可以根据项目的需要量身定制,也意味着我们需要学习各种扩展库的使用。 2 python…

栈的应用-四则运算表达式求值

文章目录 栈的应用-四则运算表达式求值1. 后缀(逆波兰)表示法2. 后缀(逆波兰)表达式计算3. 中缀表达式转换成后缀表达式 栈的应用-四则运算表达式求值 1. 后缀(逆波兰)表示法 我们平时写的数学计算表达式…

Proxmox VE 实现批量增加多网络

前言 实现批量创建多网络,更改主机名称,hosts解析 初始化网卡,主机名称,hosts解析,重启网卡 我的主机六个网卡,使用的有四个网卡,以下一键创建和初始化主机名称我是以硬件的SN号最为主机的名…

大数据、数据架构、推荐冷启动...小红书的 AI 数据新方案都在这个会

伴随着行业数据持续积累,人工智能正加速渗透各类场景,大数据、数据架构和推荐系统等领域,依然是各行各业目之所聚。4 月 19 至 20 日,「DataFunCon 2024 上海站」来袭!大会以“数聚垂域,智领未来”为主题…

超100万用户,迅速登顶 GitHub!运行在浏览器中的开源桌面操作系统,不到一个月拿下 10k star【文末福利】

Puter 是近日在 GitHub 上最受欢迎的一款开源项目,正式开源还没到一个月 ——star 数就已接近 10.1k。 作者表示这个项目已开发 3 年,并获得了超过 100 万用户。 Puter介绍 根据介绍,Puter 是基于 Web 的桌面操作系统,运行于浏览…

数据结构——栈(C++实现)

数据结构——栈 什么是栈栈的实现顺序栈的实现链栈的实现 今天我们来看一个新的数据结构——栈。 什么是栈 栈是一种基础且重要的数据结构,它在计算机科学和编程中扮演着核心角色。栈的名称源于现实生活中的概念,如一叠书或一摞盘子,新添加…

贝锐蒲公英企业路由器X5 Pro:无需专线和IT人员,分钟级异地组网

尽管我们公司规模较小,只有十几个人,但为了确保项目资料的安全,依旧在公司内部自建了文件存储服务器和办公系统。 但是,随着项目数量的增加,大家出差办公的情况也愈发普遍,如何解决远程访问内部系统成了问…

AIGC专栏10——EasyAnimate 一个新的类SORA文生视频模型 轻松文生视频

AIGC专栏10——EasyAnimate 一个新的类SORA文生视频模型 📺轻松文生视频 学习前言源码下载地址技术原理储备(DIT/Lora/Motion Module)什么是Diffusion Transformer (DiT)LoraMotion Module EasyAnimate简介EasyAnimate原理界面展示快速启动云…

《中医临床诊疗术语》数据库

最新版的《中医临床诊疗术语》于2023年3月17日由国家中医药管理局提出的,由国家市场监督管理总局和国家标准化管理委员会共同发布。新版的修订是为落实相关政策文件要求,推进中医医疗服务规范化、标准化管理,提高中医医疗服务标准化水平和管理…

Web前端开发——Ajax,Axios概述及在Vue框架中的使用

前言: 整理下学习笔记,打好基础,daydayup!!! Ajax Ajax是什么? Ajax全称Asynchromous JavaScript And Xml,是异步的JavaScript和Xml。 Ajax的作用? 1,数据交换:通过Ajax可以给服务器…

【Redis 神秘大陆】003 数据类型使用场景

三、Redis 数据类型和使用场景 Hash:对象类型的数据,购物车List:队列/栈Set:String类型的无序集合,intset,抽奖、签到、打卡,商品评价标签Sorted Set:存储有序的元素,zip…

二叉树的先中后序遍历

什么是遍历呢? 遍历:按照某种次序把所有结点都访问一遍 先/中/后序遍历:基于树的递归特性确定的次序规则 二叉树的递归特性: ①要么是个空二叉树 ②要么就是由“根节点左子树右子树”组成的二叉树 先序遍历:根左右(NLR) ——先访问根结点,…

抖音小店新店铺起飞式玩法,这几步一定要做好,前期很重要

大家好,我是电商笨笨熊 进入抖音小店后不知道该怎么操作,不清楚如何让新店快速起店; 今天我们就来聊聊新店铺快速起店的几个关键步骤,新手玩家一定要按照流程去做。 第一步:店铺搭建 小店开通之后不要着急选品上架&…

FreeRTOS_day1

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

项目7-音乐播放器2(上传音乐+查询音乐+拦截器)

0.加入拦截器 之后就不用对用户是否登录进行判断了 0.1 定义拦截器 0.2 注册拦截器 生效 1.上传音乐的接口设计 请求: { post, /music/upload {singer,MultipartFile file}, } 响应: { "status": 0, "message&…

【Android】Activity task和Instrumentation杂谈

文章目录 activity taskInstrumentation机制参考 Android不仅可以装载众多的系统组件,还可以将它们跨进程组成ActivityTask,这个特性使得每个应用都不是孤立的。 activity task 从数据结构角度看,Task有先后之分,源码实现上采取了…

AI人工智能老师大模型讲师叶梓 OneLLM:开创性的多模态大型语言模型技术

在人工智能领域,多模态大型语言模型(MLLM)的研究一直是一个热门话题。近期,一种名为OneLLM的创新技术引起了业界的广泛关注。OneLLM通过其独特的统一框架,实现了多种不同模态与自然语言的高效对齐,为多模态…

加拿大银行入局,强化数字货币的量子安全防护

领先的量子网络安全公司EvolutionQ此前宣布与加拿大银行签订合同,为加拿大银行的一个研究项目做出贡献,该项目涉及绿地数字货币的量子安全网络安全技术。这项工作强调了EvolutionQ致力于理解量子计算机对新兴金融技术(如数字货币)…