如何从模块内部运行 Pytest

news2024/12/27 21:37:06

在 Python 中,pytest 是一个强大的测试框架,用于编写和运行测试用例。通常我们会在命令行中运行 pytest,但是有时你可能希望从模块或脚本的内部运行 pytest,比如为了自动化测试或集成到某个工作流程中。在这里插入图片描述

1、问题背景

当你从模块内部运行 Pytest 时,Pytest 似乎会缓存测试。对模块或测试的任何更改都会被忽略。由于在 iPad 上编写 Python,因此无法从命令行运行 Pytest,只能使用 pytest.main() 来运行测试。这个问题已经广泛搜索,但只能找到一个相似的问题,建议从命令行运行 Pytest。

2、解决方案

Pytest 不会缓存任何内容。每个 Python 解释器实例仅读取一个文件一次。虽然有一个内置的 reload,但它几乎从不做你希望它做的事情。因此,如果运行以下代码:

import pytest
...
while True:
    import my_nifty_app
    my_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 接口,允许你以编程方式运行测试。

步骤:

  1. 安装 pytest
    确保已安装 pytest。如果没有安装,可以通过以下命令安装:

    pip install pytest
    
  2. 从模块内部调用 pytest.main()

    通过调用 pytest.main(),你可以从 Python 脚本中运行测试。你可以传递命令行选项给 pytest.main() 来控制运行的测试文件或参数。

    示例 1:从模块内部运行 pytest

    创建一个简单的测试文件 test_sample.py,并编写测试用例:

    # test_sample.py
    
    def test_addition():
        assert 1 + 1 == 2
    
    def test_subtraction():
        assert 2 - 1 == 1
    

    然后在另一个模块或脚本中运行 pytest.main() 来执行测试:

    # run_tests.py
    
    import pytest
    
    def run_tests():
        # 运行所有测试
        pytest.main()
    
    if __name__ == "__main__":
        run_tests()
    

    当你运行 run_tests.py 时,它会从内部执行 pytest,并自动运行当前目录下的所有测试文件(以 test_ 开头或以 _test 结尾的文件)。

    python run_tests.py
    

    输出将显示测试结果,如同你从命令行运行 pytest 一样。

  3. 指定测试文件或目录

    你可以通过传递参数来指定要运行的测试文件或目录。例如,指定某个特定的测试文件运行:

    # run_tests.py
    
    import pytest
    
    def run_tests():
        # 只运行指定的测试文件
        pytest.main(["test_sample.py"])
    
    if __name__ == "__main__":
        run_tests()
    
  4. 传递 pytest 选项

    pytest.main() 支持接受命令行选项作为参数。例如,如果你想启用详细模式(-v)或者只显示失败信息(--maxfail=1),可以传递这些选项。

    # run_tests.py
    
    import pytest
    
    def run_tests():
        # 使用命令行选项运行测试:启用详细模式并设置最大失败次数
        pytest.main(["-v", "--maxfail=1", "test_sample.py"])
    
    if __name__ == "__main__":
        run_tests()
    
  5. 处理 pytest.main() 返回值

    pytest.main() 返回一个整数,表示测试运行的结果:

    • 0:所有测试都通过。
    • 1:有测试失败。
    • 2:测试执行被中断。
    • 3:内部错误。
    • 4:命令行用法错误。

    你可以根据这个返回值做进一步的处理:

    # run_tests.py
    
    import pytest
    
    def 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.py

import pytest

def run_tests():
    # 运行测试,启用详细模式,并且指定只运行 test_sample.py
    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 时,要避免直接在测试文件中调用 pytest.main(),否则可能导致递归调用,因为 pytest 运行时也会加载测试文件。
  • 虚拟环境和依赖管理:确保在正确的虚拟环境中运行 pytest,以避免依赖冲突。

通过这些步骤,你可以在 Python 脚本中方便地调用和控制 pytest,从而实现自动化测试或集成测试的需求。

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

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

相关文章

网络爬虫-数美滑块验证码

仅供研究学习使用。 今天带来的是数美滑块验证码的逆向 目标站 --> 传送门 解决此类验证码 首先要解决滑动距离的判定 无论是使用selenium还是使用协议的方式来破解 都绕不开滑动距离的识别 滑动距离可以参考以前我博客上的方式,或者找一找开源的一些算法&am…

秋招突击——8/6——万得数据面试总结

文章目录 引言正文面经整理一1、讲一下java的多态,重载,重写的概念,区别2、说一下Java的数组,链表的结构,优缺点3、创建java线程的方式有哪些,具体说说4、创建线程池呢、每个参数的意义5、通过那几种方式保…

java基础(5)继承与多态

目录 ​编辑 1.前言 2.正文 2.1继承 2.1.1继承概念 2.1.2继承语法 2.1.3子类访问父类 2.1.4super关键字 2.2多态 2.2.1多态概念 2.2.2多态条件 2.2.3重写 2.2.4向上转型与向下转型 2.2.5为什么要使用多态 3.小结 1.前言 哈喽大家好啊,今天继续来为大…

汽车开发流程管理工具赋能安全与质量

随着数字化、人工智能、自动化系统及物联网技术的迅速发展,工程驱动型企业正面临重大转型挑战,亟需加速并深化其变革步伐。众多企业正试图通过采用基于模型的系统工程(MBSE)、产品线工程(PLE)、ASPICE、安全、网络安全、软件定义汽车、敏捷和精益开发实践…

微信小程序上传组件封装uploadHelper2.0使用整理

一、uploadHelper2.0使用步骤说明 uploadHelper.js ---上传代码封装库 cos-wx-sdk-v5.min.js---腾讯云,对象存储封装库 第一步,下载组件代码,放置到自己的小程序项目中 第二步、 创建上传对象,执行选择图片/视频 var _this th…

【java Web如何开发?】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

讯飞与腾讯云:Android 实时语音识别服务对比选择

在 移动端 接入实时语音识别方面,讯飞和腾讯云都是优秀的选择,但各有其特点和优势。以下是对两者的详细比较: 一、讯飞语音识别 1.1 讯飞实时语音识别介绍 1.1.1 功能特点 1.支持多种语言识别,满足不同语种用户的需求。(普通话/…

Kafka之消费者组与消费者

消费者(Consumer)在Kafka的体系结构中是用来负责订阅Kafka中的主题(Topic),并从订阅的主题中拉取消息后进行处理。 与其他消息中间件不同,Kafka引入一个逻辑概念——消费组(Consumer Group&…

使用excel.js(layui-excel)进行layui多级表头导出,根据单元格内容设置背景颜色,并将导出函数添加到toolbar

本段是菜狗子的碎碎念,解决办法请直接从第二段开始看。layui多级表头的导出,弄了两天才搞定,中途一度想放弃,还好坚持下来了。一开始用的是layui的toolbar里自带的那个导出,但是多级表头没有正常导出,单元格…

FPGA学习(6)-基础语法参数化设计阻塞与非阻塞

目录 1.两种参数化不改变源文件,只改仿真文件的值 2.参数化设计实现模块的重用 2.1不用参数化方法 2.1.1源文件 2.1.2仿真文件 2.1.3仿真波形及实验 2.2 用参数方法 2.2.1调用之前写的led灯闪烁模块,在本源函数中,例化4次调用之前的模…

【pyspark学习从入门到精通7】DataFrames_2

目录 创建 DataFrames 生成我们自己的 JSON 数据 创建 DataFrame 创建临时表 简单的 DataFrame 查询 DataFrame API 查询 SQL 查询 创建 DataFrames 通常,您会通过使用 SparkSession(或在 PySpark shell 中调用 spark)导入数据来创建 …

SpinalHDL之错误集(一)

本文作为SpinalHDL学习笔记第七十六篇,作为错误集使用,类似高中生的错题集,记录使用SpinalHDL过程中遇到的问题,小到语法错误、版本兼容问题,大到SpinalHDL库函数错误等等,持续更新。 SpinalHDL学习笔记总…

记录 ruoyi-vue-plus在linux 部署遇到的问题

整理 linux 文件不要放在 /, 根目录下,要放在 home 文件夹下。docker 启动mysql 容器,映射的 my.cnf 文件不能设置太高权限,权限太高有安全问题,无法读取。 linux 使用注意事项 docker 文件夹 部署在home文件夹下 总结学习到的…

Asp.Net Core 发布 IIS、docker、Azure、文件夹、AAS、ASF、AWM等

发布 微软资料 微软资料 在 IIS 工作进程 (w3wp.exe) 内托管 ASP.NET Core 应用,称为进程内托管模型。 将 Web 请求转发到运行 Kestrel 服务器的后端 ASP.NET Core 应用,称为进程外托管模型。 发布到IIS 》》》Asp.net 之前 》》》 Asp.net Core …

JavaScript 网页设计案例:使用 Canvas 实现趣味打气球小游戏

JavaScript 网页设计案例:使用 Canvas 实现趣味打气球小游戏 在网页设计中,交互性和趣味性是吸引用户的重要因素。借助 JavaScript 和 HTML5 的 canvas 元素,我们可以轻松实现各种动画效果,今天将带你打造一个有趣的 打气球小游戏…

Vxe vue vxe-table 分享实现打印表格以及同时打印两张表

Vxe vue vxe-table 分享实现打印表格以及同时打印两张表 vxe-table 默认情况下支持单表打印。 在有些情况下,页面上同时有几张表,这时需要一次性打印出来。可以利用 Vxe 自带的分页打印功能,实现多张表同时打印。 效果 点击打印后自动调起预…

Redis --- 第四讲 --- 常用数据结构 --- set、zset

一、set类型的基本介绍 谈到一个术语,这个术语很可能有多种含义。Set一个含义是集合,一个含义是设置。 集合就是把一些有关联数据放到一起。 1、集合中的元素是无序的! 2、集合中的元素是不能重复的。 和list类似,集合中的每…

数据治理为何如此简单?

欢迎来文末免费获取数据治理相关PPT和文档 引言 随着大数据技术的迅速发展,企业积累的数据量呈现爆炸式增长。有效的数据管理已经成为企业提高决策效率、增强竞争优势的重要手段。在这样的背景下,数据治理逐渐成为企业数据管理中不可或缺的一环。它不仅…

15分钟学Go 第1天:Go语言简介与特点

Go语言简介与特点 1. Go语言概述 Go语言(又称Golang)是由谷歌于2007年开发并在2009年正式发布的一种开源编程语言。它旨在简单、高效地进行软件开发,尤其适合于网络编程和分布式系统。 1.1 发展背景 多核处理器:随着计算机硬件…

MFC扩展库BCGControlBar Pro v35.1新版亮点:改进网格控件性能

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中,并为您节省数百个开发和调试时间。 BCGControlBar专业版 v35.1已全新发布了,这个版本改进网格控件的性能、增强工具栏编辑器功能等。 …