测试学习之——Pytest Day4

Pytest作为Python中功能强大且易于使用的测试框架,深受开发者喜爱。它不仅提供了简洁的测试编写方式,还通过丰富的配置选项、灵活的标记机制和强大的数据驱动能力,极大地提升了测试效率和可维护性。本文将深入探讨Pytest的配置意义与层级、常用命令参数、标记(mark)的使用,以及数据驱动测试的实现方法。

一、Pytest配置:意义、层级与常用参数

Pytest的配置允许我们自定义测试行为,例如指定测试文件发现规则、添加命令行选项、定义fixture等。理解其配置意义和层级对于高效使用Pytest至关重要。

1. 配置意义与层级

Pytest的配置具有层级性,允许在不同粒度上进行设置,从项目级别到测试文件级别。当存在多个配置时,Pytest会按照一定的优先级进行合并和覆盖。

•全局配置: 通常通过pytest.ini、pyproject.toml或setup.cfg文件在项目根目录进行配置。这些配置对整个项目的所有测试都有效。

•目录级配置: 可以在子目录中放置pytest.ini等配置文件,这些配置仅对当前目录及其子目录下的测试文件生效,并会覆盖全局配置中的同名设置。

•模块/文件级配置: 在测试文件中,可以通过pytest.mark等装饰器对单个测试函数或类进行更细粒度的配置。

•命令行参数: 命令行参数具有最高的优先级,会覆盖所有文件中的配置。

2. 常用命令参数

Pytest提供了丰富的命令行参数,用于控制测试的执行行为。以下是一些常用的参数:

•-v:显示更详细的测试结果(verbose)。

•-s:允许捕获标准输出(stdout)和标准错误(stderr),通常用于打印调试信息。

•-x:遇到第一个失败的测试时立即停止测试。

•--lf (--last-failed):只运行上次失败的测试。

•--ff (--failed-first):先运行上次失败的测试,然后运行所有其他测试。

•-k <expression>:根据名称表达式选择要运行的测试。例如,-k "keyword and not another_keyword"。

•-m <marker_expression>:根据标记表达式选择要运行的测试。例如,-m "web and not slow"。

•--collect-only:只收集测试,不执行。

•--maxfail=<num>:在达到指定数量的失败后停止测试。

•--html=<path>:生成HTML格式的测试报告(需要安装pytest-html插件)。

•--alluredir=<path>:指定Allure报告结果的输出目录(需要安装allure-pytest插件)。

示例:命令行执行

pytest -v -s my_test_file.py pytest -m "smoke" pytest --alluredir=./allure-results

3. 配置文件:pytest.ini

pytest.ini是Pytest最常用的配置文件,它允许我们将常用的命令行参数、标记注册、测试发现规则等固化到文件中,避免每次都在命令行中输入。一个典型的pytest.ini文件可能包含以下内容:

# pytest.ini
[pytest]
# 添加默认的命令行参数
addopts = -vs --strict-markers# 注册自定义标记,避免出现Unknown marker警告
markers =smoke: 冒烟测试regression: 回归测试web: Web自动化测试# 配置测试文件和目录的发现规则
python_files = test_*.py *_test.py
python_classes = Test*
python_functions = test_# 配置测试路径,只在指定路径下查找测试
testpaths =tests/e2e_tests/# 配置allure报告输出目录(如果使用allure)
# addopts = --alluredir=./allure-results --clean-alluredir

配置说明:

•addopts:用于设置默认的命令行参数,每次运行pytest时都会自动加上这些参数。

•markers:用于注册自定义的测试标记。注册后,Pytest就不会对这些标记发出“Unknown marker”警告。

•python_files、python_classes、python_functions:定义Pytest如何发现测试文件、测试类和测试函数。

•testpaths:指定Pytest应该在哪些目录下查找测试文件。

二、标记(Mark):用户自定义与框架内置

Pytest的标记(pytest.mark)是一个强大的功能,它允许我们对测试函数、测试类甚至模块进行分类和筛选。通过标记,我们可以灵活地选择性执行特定类型的测试,例如只运行冒烟测试、跳过某些测试等。

1. 用户自定义标记步骤

自定义标记的步骤非常简单:

1.在测试代码中使用@pytest.mark.<marker_name>装饰器: 将标记应用到测试函数或类上。

2.在pytest.ini中注册标记(可选但推荐): 在pytest.ini文件的[pytest]部分添加markers选项,注册自定义标记。这可以避免Pytest在运行时发出“Unknown marker”警告,并提供标记的描述。

3.通过命令行执行带有特定标记的测试: 使用-m参数加上标记表达式来运行测试。

示例:自定义标记

# test_example.py
import pytest@pytest.mark.smoke
def test_login_success():assert True@pytest.mark.regression
@pytest.mark.slow
def test_complex_calculation():assert True@pytest.mark.web
def test_homepage_load():assert True

pytest.ini配置:

# pytest.ini
[pytest]
markers =smoke: 冒烟测试regression: 回归测试slow: 运行缓慢的测试web: Web自动化测试

 Web自动化测试

执行命令:

# 运行所有冒烟测试
pytest -m smoke# 运行所有回归测试,但不包括慢速测试
pytest -m "regression and not slow"# 运行所有web测试
pytest -m web

2. 框架内置标记

Pytest也提供了一些内置的标记,用于处理常见的测试场景:

•@pytest.mark.skip:无条件跳过测试。可以提供一个reason参数说明跳过的原因。

•@pytest.mark.skipif(condition, reason):根据条件跳过测试。当condition为True时跳过。

•@pytest.mark.xfail(condition, reason, raises):预期失败的测试。即使测试失败,也不会计入失败总数,而是标记为“xfailed”。

•@pytest.mark.parametrize(argnames, argvalues):用于数据驱动测试,将在下一节详细介绍。

三、Pytest的数据驱动测试:parametrize实现

数据驱动测试(Data-Driven Testing)是一种测试方法,它将测试逻辑与测试数据分离。通过使用不同的测试数据重复执行相同的测试逻辑,可以有效地增加测试覆盖率并减少代码冗余。Pytest通过@pytest.mark.parametrize装饰器提供了强大的数据驱动能力。

1. parametrize的基本用法

@pytest.mark.parametrize装饰器接受两个主要参数:

•argnames:一个字符串,包含用逗号分隔的参数名称。这些参数将作为测试函数的参数传入。

•argvalues:一个列表,包含参数值的元组或列表。每个元组/列表对应一次测试执行的参数组合。

示例:单个参数的数据驱动

# test_data_driven.py
import pytest@pytest.mark.parametrize("input_value, expected_output", [(1, 2),(2, 3),(3, 4),
])
def test_increment(input_value, expected_output):assert input_value + 1 == expected_output

在这个例子中,test_increment函数会被执行三次,每次传入不同的input_value和expected_output。

2. 多个参数的数据驱动

parametrize可以很方便地处理多个参数的组合。

示例:多个参数的数据驱动

# test_data_driven.py
import pytest@pytest.mark.parametrize("num1, num2, expected_sum", [(1, 2, 3),(0, 0, 0),(-1, 5, 4),(10, -3, 7),
])
def test_addition(num1, num2, expected_sum):assert num1 + num2 == expected_sum

3. parametrize与fixture结合

parametrize还可以与fixture结合使用,为每个参数组合提供不同的fixture实例。

示例:parametrize与fixture结合

# conftest.py
import pytest@pytest.fixture
def setup_data(request):# request.param 会获取到parametrize传入的参数data = request.param * 2yield data# test_data_driven.py
import pytest@pytest.mark.parametrize("setup_data", [1, 2, 3], indirect=True)
def test_with_fixture_data(setup_data):# setup_data 会依次是 2, 4, 6assert setup_data % 2 == 0

在@pytest.mark.parametrize中设置indirect=True,表示setup_data不是直接作为参数传入,而是作为fixture的名称,Pytest会为每个参数值调用setup_data fixture。

4. 从外部文件加载数据

对于大量的测试数据,通常会将其存储在外部文件(如CSV、JSON、YAML)中,然后动态加载。这里以YAML为例,结合之前提到的PyYAML库。

data.yaml文件:

# data.yaml
- test_case:id: 1input: 10expected: 20
- test_case:id: 2input: 0expected: 0
- test_case:id: 3input: -5expected: -10

test_from_file.py文件:

import pytest
import yamldef load_test_data(file_path):with open(file_path, 'r', encoding='utf-8') as f:return yaml.safe_load(f)@pytest.mark.parametrize("test_data", load_test_data('data.yaml'))
def test_multiply_by_two(test_data):input_value = test_data['test_case']['input']expected_output = test_data['test_case']['expected']assert input_value * 2 == expected_output

这种方式使得测试数据与测试逻辑完全分离,便于数据的管理和维护。

总结

Pytest通过其灵活的配置机制、强大的标记功能和便捷的数据驱动能力,为Python项目的测试提供了全面的支持。合理利用pytest.ini进行项目级配置,通过@pytest.mark对测试进行分类和筛选,以及运用@pytest.mark.parametrize实现数据驱动测试,都能够显著提升测试的效率、可读性和可维护性。掌握这些进阶用法,将帮助您构建更加健壮和高效的自动化测试体系。

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

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

相关文章

【软件系统架构】系列七:系统性能——路由器性能深入解析

目录 一、路由器的核心功能 二、路由器性能核心指标 1. 吞吐量&#xff08;Throughput&#xff09; 2. 并发连接数&#xff08;Session Capacity&#xff09; 3. 每秒连接数&#xff08;CPS&#xff0c;Connections Per Second&#xff09; 4. 转发延迟&#xff08;Laten…

【数据结构】第一讲 —— 概论

【数据结构】第一讲 —— 概论 文章目录【数据结构】第一讲 —— 概论1.1 基本概念和常用术语1.2 了解数据结构1. 数据结构2. 数据的逻辑结构3. 数据的物理结构&#xff08;存储结构&#xff09;4. 数据的运算1.3 算法的描述和分析1.3.1 算法的描述1.3.21.1 基本概念和常用术语…

全面解析MySQL(2)——CRUD基础

1.CreateCreate(创建)&#xff1a;添加新数据到数据库中#基础语法 insert into table_name (column1,column2,column3, ...) values (value1,value2,value3, ...);1.1 单行全列插入value中值的数量和顺序必须和column⼀致describe demo1; -----------------------------------…

某外企笔试总结——纯C语言

这里写自定义目录标题一、sizeof 计算&#xff08;32位环境&#xff09;二、简答题三、数据存储区域与可修改性四、字符串比较输出及原因五、数组指针运算输出六、字符串倒序代码错误排查七、下面程序可以把1维数组转为2维数组&#xff0c;然后调用 printArr2D 打印出数组内容&…

Qt Graphs 模块拟取代 charts 和 data visualization还有很长的路要走

近期关注 Qt 6.10 的分支进展&#xff0c; 发现了 Qt 6.10 的 charts 和 data visualization &#xff08;以下简称 DV&#xff09;已经被deprecated, 功能将会合并到 graphs 模块。如果后面 charts\ DV 被弃用&#xff0c;那算是很大的API变化了。从Qt 6.5 以后开始引入的 gra…

2025牛客暑期多校训练营2(部分补题)

题目链接&#xff1a;牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ B Bitwise Perfect 思路 考虑到由&#xff0c;那么只有变小的时候对答案的贡献才能够减少&#xff0c;从二进制的角度考虑什么时候变小&#xff0c;只有min(x,y)中的最高位1异或之后变…

Nginx的location匹配规则

Nginx的location匹配规则 为什么你的Nginx配置总是不生效&#xff1f; 改了Nginx配置无数次&#xff0c;reload命令执行了几十遍&#xff0c;浏览器访问时却依然返回404&#xff1f;运维工程师小张上周就遇到了这个问题&#xff1a;明明配置了location /static/ { root /var/ww…

USB 2.0 vs USB 3.0:全面技术对比与选择指南

USB 2.0 vs USB 3.0&#xff1a;全面技术对比与选择指南 引言 在当今数字时代&#xff0c;USB接口已成为连接设备与计算机的最普遍标准之一。从2000年USB 2.0的发布到2008年USB 3.0的问世&#xff0c;USB技术经历了显著的演进。本文将深入比较这两种广泛使用的USB标准&#xff…

DApp架构设计与开发流程指南

目录 DApp架构设计与开发流程指南 引言:DApp的核心特性 一、DApp架构设计 1.1 分层架构设计 各层核心组件: 1.2 典型架构模式 1.2.1 全去中心化架构 1.2.2 混合架构(推荐) 二、开发流程 2.1 敏捷开发流程 2.2 详细开发阶段 阶段1:需求分析与设计(1-2周) 阶段2:智能合约…

Windows下odbc配置连接SQL Server

一、查看SQL Server服务是否启动打开SQL Server 2022配置管理器查看SQL Server运行状态&#xff0c;可以设置 启动或停止服务二、windows下如何配置ODBC数据源1、Windows搜索栏中输入“ODBC数据源管理器”并选择“以管理员身份运行”来打开它2、添加新的数据源ODBC数据源管理器…

MySQL—表设计和聚合函数以及正则表达式

文章目录一、第一范式&#xff08;原子性&#xff09;二、第二范式&#xff08;消除部分依赖&#xff09;三、第三范式&#xff08;消除传递依赖&#xff09;四、表设计五、聚合函数六、正则表达式MySQL 的三大范式&#xff08;1NF、2NF、3NF&#xff09;是关系型数据库设计的核…

基于Electron打包jar成Windows应用程序

基于Electron打包jar成Windows应用程序简介注意编译及命令&#xff1a;运行效果登录界面用户管理界面界面全屏锁屏界面文档查看界面简介 本文介绍了一种将maven jar包打包成Windows下EXE可执行程序的方法。 Maven打包Java Web应用成jar&#xff0c;Electron封装jar成Windows …

Autosar RTE实现观测量生成-基于ETAS软件

文章目录前言观测量定义arTypedPerInstanceMemoryPorts Measurable工具链配置及使用Port中的配置arTypedPerInstanceMemory观测量生成文件分析总结前言 之前我们在XCP中&#xff0c;对于标定量和观测量并没有严格按照Autosar标准中定义&#xff0c;Autosar RTE中对标定量和观测…

【REACT18.x】creat-react-app在添加eslint时报错Environment key “jest/globals“ is unknown

今天在创建新项目的时候&#xff0c;给cra创建的项目添加eslint支持&#xff0c;出现如下报错 添加eslint npx eslint --init页面报错 Compiled with problems:ERROR [eslint] package.json eslint-config-react-app/jest#overrides[0]:Environment key "jest/globals&…

Linux的例行性工作 -- (练习)

1、atd和crond两个任务管理程序的区别 答&#xff1a; atd 专为一次性任务设计&#xff0c;允许用户在特定未来时间点&#xff08;绝对或相对时间&#xff09;执行单次命令后就结束。 crond 则是周期性任务的调度核心&#xff0c;通过配置文件&#xff08;crontab&#xff09;实…

《Java语言程序设计》1.6 复习题

1.6.1 什么是Java语言规范?计算机有严格的使用规则。如果编写程序时没有遵循这些规则&#xff0c;计算机就不能理解程序。Java语言规范和Java API定义了Java的标准。Java语言规范(Java language specification)是对Java程序设计语言的语法和语义的技术定义。应用程序接口(Appl…

【机器学习深度学习】什么是量化?

目录 前言 一、量化的基本概念 1.1 量化对比示例 1.2 量化是如何实现的&#xff1f; 二、为什么要进行量化&#xff1f; 2.1 解决模型体积过大问题 2.2 降低对算力的依赖 2.3 加速模型训练和推理 2.4 优化训练过程 2.5 降低部署成本 小结&#xff1a;量化的应用场…

告别 T+1!解密金融级实时数据平台的构建与实践

在数字金融浪潮下&#xff0c;数据处理的“实时性”已不再是加分项&#xff0c;而是逐渐成为决定业务价值的核心竞争力。然而&#xff0c;金融机构在追求实时的道路上&#xff0c;往往陷入一个新的困境&#xff1a;实时分析系统与离线大数据平台形成了两套独立的“烟囱”&#…

[Python] -项目实战7- 用Python和Tkinter做一个图形界面小游戏

一、为什么从小游戏入门GUI? 趣味性强:小游戏直观、有趣,一学就上手。 系统掌握事件驱动:了解按钮点击、键盘响应、图形刷新机制。 扎实基础:为日后构建更复杂应用奠定 GUI 编程基础。 二、选定游戏:猜数字小游戏 🎯 这个小游戏界面简单,核心机制是:3 个按钮分别…

【18】MFC入门到精通——MFC(VS2019)+ OpenCV 显示图片的3种方法

MFC (VS2019)+ OpenCV,显示图片的3种方法 1 方法介绍 2 方法一:嵌套OpenCV窗口显示图片 2.1 建立供工程 添加控件 2.2 引用头文件 2.3 找到OnInitDialog()函数,在其中添加如下代码 2.4 在button触发函数中加入代码(就是你双击button进入的函数) 2.5 注意事项 3 方法二:…