如何从模块内部运行 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 …...
告别Excel!用QT的QTableWidget打造你的第一个桌面端数据管理工具(附完整源码)
从Excel到专业桌面应用:基于QT的QTableWidget数据管理系统实战 在数据处理领域,Excel长期占据主导地位,但当数据量增长到数千行、需要复杂业务逻辑或多人协作时,电子表格的局限性就暴露无遗。许多开发者都面临过这样的困境&#x…...
Redis持久化:从AOF到RDB,如何实现数据不丢失?耐
Qt是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本笔记将重点介绍QSpinBox数值微调组件的常用方法及灵活应用。…...
Horizon UAG网关配置避坑指南:从OVF导入到外网访问,一次搞定所有疑难杂症
Horizon UAG网关配置实战:从部署到外网访问的深度排错手册 每次看到Horizon UAG网关服务器状态变红,IT运维人员的心跳都会跟着加速。这不是简单的配置错误,而是整个虚拟桌面基础设施对外服务能力的警报。本文将带您深入UAG配置的核心痛点&…...
如何用Python+Neo4j构建医疗知识图谱?从数据清洗到因果推断实战
医疗知识图谱实战:用PythonNeo4j实现药品副作用因果推断 在医疗AI领域,知识图谱正成为连接海量医学数据与临床决策的桥梁。当一位患者同时服用多种药物时,如何准确预测潜在的药物相互作用?当流行病学研究发现某种症状与基因突变相…...
PyCharm虚拟环境配置避坑指南:为什么你的模块导入有提示但运行报错?
PyCharm虚拟环境配置避坑指南:为什么你的模块导入有提示但运行报错? 作为Python开发者,PyCharm的智能提示功能是我们日常开发的重要助力。但你是否遇到过这样的情况:明明在虚拟环境中安装了模块,代码运行时一切正常&am…...
从机翼到机身:聊聊固定翼无人机气动力的那些事儿(附Python简易计算脚本)
从机翼到机身:聊聊固定翼无人机气动力的那些事儿(附Python简易计算脚本) 当你第一次把亲手组装的固定翼无人机送上天空时,是否遇到过这些状况:明明油门给足了却爬升乏力,转弯时总感觉机身不听使唤ÿ…...
揭秘哈苏HNCS:如何用色彩科学重塑摄影艺术
1. 哈苏HNCS:色彩科学的革命性突破 第一次用哈苏相机拍人像时,我盯着屏幕愣了三秒——模特的肤色就像透过清晨薄雾看到的真实肌肤,连颧骨处细微的红晕过渡都像被阳光自然晕染开的。这种震撼体验背后,是哈苏HNCS自然色彩解决方案在…...
AppleRa1n:轻松绕过iOS 15-16激活锁的图形化工具
AppleRa1n:轻松绕过iOS 15-16激活锁的图形化工具 【免费下载链接】applera1n icloud bypass for ios 15-16 项目地址: https://gitcode.com/gh_mirrors/ap/applera1n 还在为忘记Apple ID密码而无法使用自己的iPhone或iPad而烦恼吗?或者你购买了一…...
ROS usb_cam像素格式终极指南:从YUV、MJPEG到源码修改,彻底告别警告和花屏
ROS usb_cam像素格式终极指南:从YUV、MJPEG到源码修改,彻底告别警告和花屏 当你在ROS中调用UVC摄像头时,是否遇到过图像花屏或终端不断弹出"deprecated pixel format"警告?这些问题往往源于对像素格式的误解或配置不当。…...
两大顶刊被新锐分区降为2区!那一区都是些什么神仙期刊?(附材料领域1-4区名单)
随着部分高校开始认可新锐分区,领域内顶级期刊被降2区,合金及金属材料领域的研究人员都坐不住了。今年最引发讨论的,无疑是这些“熟面孔”:Acta MaterialiaCorrosion Science顶刊降区及网友评论1 Acta Materialia《Acta Materiali…...
