深入理解 pytest.main():Python 测试框架的核心功能解析

前言

笔者平常运行pytest用例时,通常使用命令行方式,像这样

pytest -v pxl/test_dir/test_demo.py::TestDemo::test_my_var,执行某一条case,但每次命令行敲也挺麻烦的。那如何在python代码中调用pytest呢?带着疑问一起看。

解答疑问

main()函数中调用pytest.main()就可以啦。

我们深入探讨一下 pytest.main 的用法和一些常见的应用场景。

什么是pytest.main

pytest.main 是 Pytest 框架中一个非常实用的函数,它用于从命令行运行测试集或者以编程方式运行测试。通过调用 pytest.main() 函数,我们可以在代码中启动测试过程,并获取测试结果或者进行进一步的操作。

如何使用 pytest.main 运行测试用例?

我们看一个简单示例:

test_demo.py

import pytest
​
def test_add():assert 1 + 1 == 2
​
if __name__ == "__main__":pytest.main([__file__])

在这个示例中,我们定义了一个简单的测试用例 test_add,用于检查加法运算的正确性。然后,我们通过 pytest.main([__file__]) 来执行当前文件中的测试用例。

要运行这个测试用例,只需在命令行中执行以下命令:

python test_demo.py

Pytest 将会自动发现并执行 test_add 测试用例,并生成测试结果报告。

源码定义

def main(args: Optional[Union[List[str], "os.PathLike[str]"]] = None,plugins: Optional[Sequence[Union[str, _PluggyPlugin]]] = None,
) -> Union[int, ExitCode]:"""Perform an in-process test run.
​:param args: List of command line arguments.:param plugins: List of plugin objects to be auto-registered during initialization.
​:returns: An exit code."""

可以看到有两个参数,args 传一个list对象,list 里面是多个命令行的参数;plugins 传一个list对象,list 里面是初始化的时候需注册的插件

常用参数

  • -m <标记>--mark=<标记>:只运行被标记为 <标记> 的测试用例。
  • -k <关键字表达式>--keyword=<关键字表达式>:只运行名称中包含 <关键字表达式> 的测试用例。
  • -s--capture=no:禁止捕获标准输出和标准错误,将其直接打印到控制台。
  • -v--verbose:以详细模式运行测试,显示更多的信息,如每个测试用例的名称、结果和错误信息。
  • --collect-only:只收集测试用例但不执行它们,可以用于查看测试集中的所有可用测试。
  • --ignore:忽略某个测试模块
  • -q: 简单输出模式, 不输出环境信息
  • -x: 出现一条测试用例失败就退出测试。在调试阶段非常有用,当测试用例失败时,应该先调试通过,而不是继续执行测试用例。

这些参数可以单独使用,也可以组合使用。例如,可以同时使用 -m-k 参数来指定运行特定标记和关键字的测试用例。像这样

pytest.main(["-s", "-v", "-m", "p0"])
现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:110685036

举例说明

-m
import pytest
​
@pytest.mark.p0
def test_addition():assert 2 + 2 == 4
​
@pytest.mark.p1
def test_subtraction():assert 5 - 3 == 2
​
if __name__ == "__main__":pytest.main(["-m", "p0"])

在这个示例中,我们使用 @pytest.mark 装饰器为两个测试用例标记了不同的标记。然后,我们在 pytest.main 函数调用时传递了 -m p0 参数,表示只运行被标记为 p0 的测试用例。这样就可以只运行 test_addition 测试用例。

-k
import pytest
​
def test_addition():assert 2 + 2 == 4
​
def test_subtraction():assert 5 - 3 == 2
​
def test_multiplication():assert 2 * 3 == 6
​
if __name__ == "__main__":pytest.main(["-k", "addition"])

在这个示例中,我们定义了三个测试用例,分别测试加法、减法和乘法运算的正确性。然后,我们在 pytest.main 函数调用时传递了 -k addition 参数,表示只运行名称中包含 "addition" 关键字的测试用例。这样就可以只运行 test_addition 测试用例。

--ignore

test_demo.py

import pytest
​
def test_addition():assert 2 + 2 == 4
​
def test_subtraction():assert 5 - 3 == 2
​
if __name__ == "__main__":pytest.main(["--ignore=test_contract_controller.py"])

在这个示例中,我们定义了两个测试用例 test_additiontest_subtraction。然后,我们在 pytest.main 函数调用时传递了 --ignore=test_contract_controller.py 参数,表示忽略名为 test_contract_controller.py 的测试模块,不运行其中的测试用例。

--durations
import pytest
import time
​
def test_slow_function():time.sleep(2)assert True
​
def test_fast_function():assert True
​
if __name__ == "__main__":pytest.main(["--durations=5"])
​

在这个示例中,我们定义了两个测试用例,test_slow_functiontest_fast_function,分别模拟了一个耗时较长和一个耗时较短的测试。然后,我们在 pytest.main 函数调用时传递了 --durations=5 参数,表示输出最慢的 5 个测试用例的执行时间。这样可以帮助我们识别出执行时间较长的测试用例,进行性能优化或者重点关注。

--collect-only
import pytest
​
def test_addition():assert 2 + 2 == 4
​
def test_subtraction():assert 5 - 3 == 2
​
if __name__ == "__main__":pytest.main(["--collect-only"])

我们在 pytest.main 函数调用时传递了 --collect-only 参数,这样只会收集用例,而不会执行。

运行指定用例

运行指定目录下的case
pytest.main(["--collect-only", "/panda-test/peilian/test_dir/"])
运行指定模块下的case
pytest.main(["--collect-only", "/panda-test/peilian/test_dir/test_demo.py"])
运行指定的case
pytest.main(["--collect-only", "/panda-test/peilian/test_dir/test_demo.py::test_01"])

plugins参数

我们自定义的插件放到 conftest.py 会被pytest查找到,如果不是写到conftest.py 的插件内容,可以通过 plugins 参数指定加载。我们看个案例:

import pytest
​
​
class MyPlugin(object):def pytest_sessionstart(self):print("*** test run start ***")
​
​
def test_division():assert 10 / 2 == 5
​
​
if __name__ == "__main__":pytest.main(["/panda-test/peilian/test_dir/test_demo.py::test_division"], plugins=[MyPlugin()])

这里又涉及到一个新的钩子函数pytest_sessionstart,先不用管,之后写一篇文章来介绍。我们运行case,会发现在执行最开始会输出*** test run start ***。说明已经加载插件成功了。

plugins参数的作用就是指定需加载的插件,也可以指定多个。

最后

pytest.main 是一个非常有用的函数,它允许我们以编程的方式执行测试用例。通过灵活运用 pytest.main,我们可以更好地集成测试流程和自动化工具,提高测试效率和质量。

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
 

在这里插入图片描述

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

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

相关文章

MySQL面试题-索引的基本原理及相关面试题

先了解一下MySQL的结构 下面我们重点讲一下存储引擎 MySQL的数据库和存储数据的目录是一一对应的&#xff0c;这些数据库的文件就保存在磁盘中对应的目录里 下面我们来看一下对应的具体数据文件 .frm是表的结构&#xff0c;不管什么样的索引都会有 .ibd代表我们现在使用的存…

六、如何让卡片一直对着摄像头

上期我们创建了卡片&#xff0c;那么如何让卡片一直面向浏览器。这个交互有一部分公司还是很需要的&#xff0c;今天我们就来讲讲&#xff0c;先看效果图 在animate.js里面增加卡片Mesh的LookAt&#xff0c;代码如下 import camera from "./camera"; import rendere…

【STM32】IAP升级01 bootloader实现以及APP配置(主要)

APP程序以及中断向量表的偏移设置 前言 通过之前的了解 之前的了解&#xff0c;我们知道实现IAP升级需要两个条件&#xff1a; 1.APP程序必须在 IAP 程序之后的某个偏移量为 x 的地址开始&#xff1b; 2.APP程序的中断向量表相应的移动&#xff0c;移动的偏移量为 x&#xff…

如何制作gif动图gif (多图合成gif、GIF录制软件、视频制作成GIF动图)

文章目录 1 在线制作多图合成gif动画2 GIF录制软件3 将现有的视频 制作成GIF动图 1 在线制作多图合成gif动画 在线制作gif动画链接:https://www.matools.com/gif ①选择需要制作gif动画的图片将其添加 ②调整时间间隔&#xff0c;图片宽高等设置 ③一键生成gif ④下载到本…

两种风格的纯CSS3加载动画

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>加载动画</title><style>.loader {w…

蓝桥杯每日一题2023.9.27

4408. 李白打酒加强版 - AcWing题库 题目描述 题目分析 对于这题我们发现有三个变量&#xff0c;店&#xff0c;花&#xff0c;酒的数量&#xff0c;对于这种范围我们使用DP来进行分析。 dp[i][j][k]我们表示有i个店&#xff0c;j朵花&#xff0c;k单位酒的集合&#xff0c…

数据挖掘note(赵老师语录)

&#xff08;一&#xff09; 数据挖掘一般分为机器学习和统计学习&#xff0c;大数据学的课程一般是关于机器学习&#xff0c;我们学的浅&#xff0c;主要关于统计学习&#xff0c;示意图如下所示&#xff1a; 这是一个大数据时代&#xff0c;但是数据挖掘的利用率不足0.5%&am…

MySQL 索引的作用、索引结构及执行流程介绍(索引篇 一)

索引介绍 MySQL索引&#xff08;index&#xff09;是一种用于加快数据库中数据搜索和查询的数据结构。它类似于书籍的目录&#xff0c;可以帮助数据库快速定位和访问特定数据&#xff0c;而无需扫描整个数据表。 索引的作用和缺点 1. 加快数据搜索&#xff1a;通过使用索引&…

linux下离线安装telnet

安装过程概要&#xff1a; &#xff08;一&#xff09;互联网端下载rpm包&#xff1b; &#xff08;二&#xff09;上传到服务器root目录下&#xff1b; &#xff08;三&#xff09;安装telnet服务和测试&#xff1a; 详细内容&#xff1a; &#xff08;一&#xff09;互联…

Redis与分布式-主从复制

接上文 常用中间件-OAuth2 1.主从复制 启动两个redis服务器。 修改第一个服务器地址 修改第二个redis 然后分别启动 redis-server.exe redis.windows.conf) 查看当前服务器的主从状态&#xff0c;打开客户端&#xff1a;输入info replication命令来查看当前的主从状态&am…

601-体育馆的人流量

文章目录 601-体育馆的人流量1. 题目2. 思路3. 解决4. 运行结果 601-体育馆的人流量 1. 题目 2. 思路 思路&#xff1a;查询Stadium表中人流量超过100的记录&#xff0c;将查询结果与自身的临时表连接&#xff0c;再使用where获得满足条件的记录 查询Stadium表中人流量超过10…

【数据分享】2023年我国行政村(社区)点位数据(免费获取\shp格式\excel格式)

行政村&#xff08;社区&#xff09;点位数据是我们各项研究中经常使用到的数据&#xff0c;在之前的文章中我们分享过2022年度的行政村&#xff08;社区&#xff09;点位数据&#xff08;可查看之前的文章获悉详情&#xff09;。本次我们带来的是2023年的全国范围的行政村&…

iOS自动化测试方案(一):MacOS虚拟机保姆级安装Xcode教程

文章目录 一、环境准备二、基础软件三、扩展&#xff1a;usb拓展插件 一、环境准备 1、下载VMware虚拟机的壳子&#xff0c;安装并注册软件(可以百度注册码)&#xff0c;最新版本&#xff1a;v17 2、下MacOS系统iOS镜像文件&#xff0c;用于vmware虚拟机安装&#xff0c;当前镜…

Linux(CentOS/Ubuntu)——安装nginx

如果确定你的系统是基于CentOS或RHEL&#xff0c;可以使用以下命令&#xff1a; ①、安装库文件 #安装gcc yum install gcc-c#安装PCRE pcre-devel yum install -y pcre pcre-devel#安装zlib yum install -y zlib zlib-devel#安装Open SSL yum install -y openssl openssl-de…

【力扣每日一题】2023.9.27 餐厅过滤器

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目挺长&#xff0c;估计中等难度是给在了阅读理解上。 简单来说就是给我们一堆餐厅的信息&#xff0c;每个餐厅拥有五个属性&#xff…

HarmonyOS/OpenHarmony原生应用-ArkTS万能卡片组件Badge

可以附加在单个组件上用于信息标记的容器组件。该组件从API Version 7开始支持。 支持单个子组件。子组件类型&#xff1a;系统组件和自定义组件&#xff0c;支持渲染控制类型&#xff08;if/else、ForEach和LazyForEach&#xff09;。 一、接口 方法1&#xff1a; Badge(value…

宁德时代Inside,中国智驾Outside!

随着华为Mate 60系列的未发先售&#xff0c;问界新M7的朋友圈疯狂刷屏到今日刘德华惊喜现身的“华与华”发布会&#xff0c;余承东的一句“遥遥领先”彻底出圈。 华为的“遥遥领先”&#xff0c;早已不止步于智能手机领域。在刚刚结束的华为秋季全场景新品发布会上&#xff0c…

那么国内比较好用的ai写作助手?

在过去的几年里&#xff0c;人工智能&#xff08;AI&#xff09;已经取得了巨大的进步&#xff0c;其中之一就是AI写作助手。这些工具基于先进的自然语言处理技术&#xff0c;可以生成多种类型的文本&#xff0c;包括文章、博客、广告文案、新闻稿等。它们不仅可以提供高质量的…

laravel设置与获取header请求头

laravel设置与获取header请求头 设置 <?phpnamespace App\Http\Controllers\Text;use Illuminate\Http\Request; use App\Http\Controllers\Controller;class TextController extends Controller {public function TextCC(Request $request){$token $request->header(j…

JAXB(Java Architecture for XML Binding)下载、使用

简介 JAXB&#xff08;Java Architecture for XML Binding&#xff09;就是XML数据绑定的java架构。JAXB可以根据XML Schema生成java类&#xff0c;也能根据java类生成XML Schema&#xff0c;能将XML数据unmarshall到Java内容树&#xff0c;也能将Java内容树持久化为XML数据。…