如何从模块内部运行 Pytest
在 Python 中,pytest
是一个强大的测试框架,用于编写和运行测试用例。通常我们会在命令行中运行 pytest
,但是有时你可能希望从模块或脚本的内部运行 pytest
,比如为了自动化测试或集成到某个工作流程中。
1、问题背景
当你从模块内部运行 Pytest 时,Pytest 似乎会缓存测试。对模块或测试的任何更改都会被忽略。由于在 iPad 上编写 Python,因此无法从命令行运行 Pytest,只能使用 pytest.main() 来运行测试。这个问题已经广泛搜索,但只能找到一个相似的问题,建议从命令行运行 Pytest。
2、解决方案
Pytest 不会缓存任何内容。每个 Python 解释器实例仅读取一个文件一次。虽然有一个内置的 reload,但它几乎从不做你希望它做的事情。因此,如果运行以下代码:
import pytest
...
while True:import my_nifty_appmy_nifty_app.be_nifty()pytest.main()
即使 my_nifty_app.py 在磁盘上发生更改,它也将被只读取一次。实际上需要的是类似这样的代码:
exit_code = pytest.main()
sys.exit(exit_code)
这将结束解释器的该实例,这是确保重新读取源文件唯一的方法。
代码例子:
import pytest# 定义测试函数
def test_function():assert True# 定义一个包含测试函数的模块
module = """
def test_function():assert True
"""# 从模块内部运行 Pytest
exec(module)
pytest.main()# 对模块进行更改
module = """
def test_function():assert False
"""# 再次从模块内部运行 Pytest
exec(module)
pytest.main()# 现在,测试应该失败
要从模块内部运行 pytest
,可以使用 pytest.main()
方法。这是一个 Python 接口,允许你以编程方式运行测试。
步骤:
-
安装
pytest
:
确保已安装pytest
。如果没有安装,可以通过以下命令安装:pip install pytest
-
从模块内部调用
pytest.main()
:通过调用
pytest.main()
,你可以从 Python 脚本中运行测试。你可以传递命令行选项给pytest.main()
来控制运行的测试文件或参数。示例 1:从模块内部运行
pytest
创建一个简单的测试文件
test_sample.py
,并编写测试用例:# test_sample.pydef test_addition():assert 1 + 1 == 2def test_subtraction():assert 2 - 1 == 1
然后在另一个模块或脚本中运行
pytest.main()
来执行测试:# run_tests.pyimport pytestdef run_tests():# 运行所有测试pytest.main()if __name__ == "__main__":run_tests()
当你运行
run_tests.py
时,它会从内部执行pytest
,并自动运行当前目录下的所有测试文件(以test_
开头或以_test
结尾的文件)。python run_tests.py
输出将显示测试结果,如同你从命令行运行
pytest
一样。 -
指定测试文件或目录:
你可以通过传递参数来指定要运行的测试文件或目录。例如,指定某个特定的测试文件运行:
# run_tests.pyimport pytestdef run_tests():# 只运行指定的测试文件pytest.main(["test_sample.py"])if __name__ == "__main__":run_tests()
-
传递 pytest 选项:
pytest.main()
支持接受命令行选项作为参数。例如,如果你想启用详细模式(-v
)或者只显示失败信息(--maxfail=1
),可以传递这些选项。# run_tests.pyimport pytestdef run_tests():# 使用命令行选项运行测试:启用详细模式并设置最大失败次数pytest.main(["-v", "--maxfail=1", "test_sample.py"])if __name__ == "__main__":run_tests()
-
处理
pytest.main()
返回值:pytest.main()
返回一个整数,表示测试运行的结果:- 0:所有测试都通过。
- 1:有测试失败。
- 2:测试执行被中断。
- 3:内部错误。
- 4:命令行用法错误。
你可以根据这个返回值做进一步的处理:
# run_tests.pyimport pytestdef run_tests():result = pytest.main(["-v", "test_sample.py"])if result == 0:print("All tests passed.")else:print(f"Tests failed with code {result}")if __name__ == "__main__":run_tests()
完整示例
以下是一个完整的示例,展示了如何从模块内部运行 pytest
,并传递自定义参数:
# run_tests.pyimport pytestdef run_tests():# 运行测试,启用详细模式,并且指定只运行 test_sample.pyresult = pytest.main(["-v", "test_sample.py"])if result == 0:print("All tests passed.")else:print(f"Tests failed with code {result}")if __name__ == "__main__":run_tests()
其他注意事项
- 避免递归调用:当从模块内部运行
pytest
时,要避免直接在测试文件中调用pytest.main()
,否则可能导致递归调用,因为pytest
运行时也会加载测试文件。 - 虚拟环境和依赖管理:确保在正确的虚拟环境中运行
pytest
,以避免依赖冲突。
通过这些步骤,你可以在 Python 脚本中方便地调用和控制 pytest
,从而实现自动化测试或集成测试的需求。
相关文章:

如何从模块内部运行 Pytest
在 Python 中,pytest 是一个强大的测试框架,用于编写和运行测试用例。通常我们会在命令行中运行 pytest,但是有时你可能希望从模块或脚本的内部运行 pytest,比如为了自动化测试或集成到某个工作流程中。 1、问题背景 当你从模块…...

oracle数据库---基本查询(单表查询、多表查询、子查询、分页查询、oracle内置函数、行列转换、集合运算)
思维导图 单表查询 数据准备 -- 练习的表如果存在 请先删除 -- 如果不存在直接创建 drop table t_owners;--业主表 create table t_owners (id number primary key,name varchar2(30),addressid number,housenumber varchar2(30),watermeter varchar2(30),adddate date,owner…...

web API基础
作用和分类 作用: 就是使用 JS 去操作 html 和浏览器 分类: DOM (文档对象模型)、 BOM (浏览器对象模型) 什么是DOM DOM (Document Object Model) 译为文档对象模型,是 HTML 和 XML 文档的编程接口。 HTML DOM 定义了访问和操作 …...

【C++】创建TCP服务端
实现了一个基本的 TCP 服务器,可以接受多个客户端连接,然后持续接收客户端发送的信息, 最后将接收到的信息再发送回客户端 。 源码 头文件(TCPServerTest.h) #include <iostream> #include <winsock2.h&g…...

每天练打字6:今日状况——常用字后五百击键3第2遍已完成,赛文速度93.56
今日跟打:763字 (截至当前) 总跟打:120408字 记录天数:2467天 (实际没有这么多天,这个是注册账号的天数) 平均每天:48字 本周目标完成进度: 练习常用单字后5…...

rk3568创建基于Ubuntu18.04交叉编译遇到的坑
尽管配置过rk3288,觉得rk3568也不会有啥问题,但还是掉坑了。 一、安装依赖库 安装完ubuntu后,先进行升级 sudo apt update sudo apt upgrade然后安装依赖库 $ sudo apt-get install repo git-core gitk git-gui gcc-arm-linux-gnueabihf u-…...

对“一个中心,三重防护”中安全管理中心的理解
安全管理中心 本控制项为网络安全等级保护标准的技术部分。本项主要包括系统管理、审计管理、安全管理和集中管控四个控制点,其中的集中管控可以说是重中之重,主要都是围绕它来展开的。 28448基本要求中安全管理中心 8.1.5 安全管理中心 8.1.5.1 系统…...

jmeter用csv data set config做参数化1
在jmeter中,csv data set config的作用非常强大,用它来做批量测试和参数化非常好用。 csv data set config的常用配置项如下: Variable Names处,写上源文件中的参数名,用于后续接口发送请求时引用 Ignore first line…...

软件分享 丨eSearch 截图软件
在日常的工作和学习中,截图是一项非常常见且重要的操作。无论是记录重要的信息、制作教程,还是与他人分享有趣的内容,一款好用的截图软件都能让我们的效率大大提高。今天,就给大家分享一款功能强大的截图软件 - eSearch。 一、强…...

pytorh学习笔记——cifar10(一)生成数据
CIFAR(Canadian Institute For Advanced Research)是一个用于图像识别研究的数据集。CIFAR数据集包含多个子数据集,最常用的是CIFAR-10和CIFAR-100。 CIFAR-10数据集包含60000张32x32彩色图像,分为10个类别,每…...

pikachu靶场SSRF-curl测试报告
目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、实现ssrf攻击 四、源代码分析 五、结论 一、测试环境 1、系统环境 渗透机:本机(127.0.0.1) 靶 机:本机(127.0.0.1) 2、使用工具/软件 测试网址:…...

Java项目-基于Springboot的农机电招平台项目(源码+说明).zip
作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 开发运行环境 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/…...

Systemd:简介
1号进程 Systemd是linux系统的守护进程,它要管理正在运行的 Linux 主机的许多方面,包括挂载文件系统、管理硬件、处理定时器以及启动和管理生产性主机所需的系统服务。 $ ps -u -p 1 USER PID %CPU %MEM VSZ RSS TTY STAT START TI…...

Snapshot包和Release包区别
Snapshot包和Release包区别 Snapshot包: 代表开发中的版本,可能不稳定。 经常更新,包含最新的功能和修复。 通常用于测试和开发阶段。 Release包: 代表稳定的、经过全面测试的版本。 版本号通常是固定的,适合生产环…...

最近网站频繁跳转到黑产网站,怀疑是51.la统计代码的问题
最近我的几个网站,都出现了一个问题,就是访问的时候会莫名其妙的跳转到黑产网站。 通过排查了网页代码,发现网页都有一个共同点,就是使用了51.la统计。为什么会怀疑是51la统计代码问题?因为我的网页只有统计代码外没有…...

【python_修改PPT中字体,run.font.name只对英文生效怎么办?】
python_修改PPT中字体,run.font.name只对英文生效怎么办? 参考:使用pptx_ea_font库设置中文字体 from pptx import Presentation from pptx.util import Pt from pptx_ea_font import set_font# 打开现有的 PPT 文件 prs Presentation(D:\…...

【web】JDBC
项目连接数据库 右侧导航栏找到databsae 如果没有驱动,先下载驱动 填写数据库用户名密码 勾选对应的表即可 JDBC代码流程 1,配置信息 2,加载驱动 从MySQL Connector/J 5.1版本开始,推荐使用com.mysql.cj.jdbc.Driver这个新的驱动类。 3,链接数据库…...

MATLAB代码介绍:一段轨迹的指纹定位,KNN,三维,四个锚点(附源代码,可复制粘贴)
文章目录 产品介绍:三维指纹定位 KNN MATLAB 模型概述源代码运行结果功能亮点代码结构应用场景结论产品介绍:三维指纹定位 KNN MATLAB 模型 概述 本 MATLAB 代码实现了一种基于 KNN(K-Nearest Neighbors)算法的三维指纹定位系统,利用四个基站(锚点)信号强度进行移动终…...

XML Schema 复合空元素
XML Schema 复合空元素 XML Schema 是一种用于定义 XML 文档结构和内容的语言。在 XML Schema 中,元素可以被定义为简单类型或复杂类型。简单类型元素不能包含其他元素或属性,而复杂类型元素可以包含其他元素、属性或两者都有。复合空元素是一种特殊类型…...

Java面向对象编程基础(二)
Java面向对象编程基础二 一、package与import关键字的使用1.说明2.包的作用3.JDK中主要的包4. import5.import关键字的使用 二、封装性1.为什么要封装?2.如何封装?3.作用4.权限修饰符的权限大小5.案例 三、构造器1 构造器的使用说明2 案例: 四、实例变量赋值过程1 …...

[PHP]重复的Notice错误信息
<?php $a []; var_dump($a[name]);执行结果: 原因: display_errors和error_reporting都打开了Notice错误信息...

2024年第四届“网鼎杯”网络安全大赛-赛前模拟训练
文章目录 网络安全(WEB)签到题WEB01WEB02 二进制漏洞安全(PWN)PWN01潜在的安全漏洞分析攻击步骤exp 逆向工程(REVERSE)REVERSE01代码分析重构密码 密码学(CRYPTO)CRYPTO01CRYPTO02 杂…...

AI金融攻防赛:YOLO理论学习及赛题进阶思路(DataWhale组队学习)
引言 大家好,我是GISer Liu😁,一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年10月学习赛的AI金融攻防赛学习总结文档。本文主要讲解如何在金融场景凭证篡改检测中应用YOLO算法。我们将从模型概述、数据准备、训练流程以及模…...

Spring Security 基础配置详解(附Demo)
目录 前言1. 基本知识2. Demo3. 实战 前言 基本的Java知识推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)【Java项目】实战CRUD的功能整理(持续更新) 1. 基本知识 HttpSecurity 是 Spri…...

代码随想录打卡Day1
文章目录 day011 数组理论基础2 二分查找法3 移除元素4 平方数 day01 Java JDK是17.0.11 1 数组理论基础 数组是存放在连续内存空间上的相同类型数据的集合。 数组下标都是从0开始的。 数组内存空间的地址是连续的。 因为数组在内存空间的地址是连续的,所以我们…...

Vue快速创建工程+Element Plus
创建Vue工程 执行命令 npm init vuelatest 执行这两个绿色的命令 执行这个命令启动 npm run dev Element 打开网站https://element-plus.org/zh-CN/ npm install element-plus --save 然后在vscode中打开你的项目工程 // main.ts import { createApp } from vue import Ele…...

汽车管理系统——主界面制作
目录 主界面需要有什么?然后要做什么?添加两个主菜单(声明)下一步应该干什么?能够跳转到文件有哪几个动作?动作如何声明?为什么用选择声明指针,不选择直接声明这个对象? …...

C++ 右值引用深入理解:特性、优化与底层
目录 一、左右值的概念及右值的种类 二、左值引用与右值引用 左值引用给右值取别名: 右值引用给左值取别名: 三、引用的意义及左值引用的场景 四、移动构造: 右值引用在底层里的实现: 一、左右值的概念及右值的种类 在 C …...

C# 文件操作
文章目录 文件系统FileInfo和DirectoryInfo类完成一个文件的拷贝判断一个文件是否存在FileInfo和DirectoryInfo的属性列表FileInfo和DirectoryInfo的方法列表读写文件文件系统 下面的类用于浏览文件系统和执行操作,比如移动,复制和删除文件。 System.MarshalByRefObject 这个…...

FFmpeg 4.3 音视频-多路H265监控录放C++开发三 :安装QT5.14.2, 并将QT集成 到 VS2019中。
一,安装QT, 重点:在安装QT的时候要安装msvc201x版本的组件, 二 , 安装 qt-vs-tools Index of /development_releases/vsaddin/2.8.1 三,需要安装过 windows10 SDK,一般我们在安装vs2019的时候就…...