pytest从不同的测试文件独立导入相同的模块

2024-03-02

以下主题模块包含两个函数,其中之一操作全局变量。

mod.py:

def global_setter():
    global x
    x = 123
    print("setter x:", x)


def global_getter():
    print("getter x:", x)

每个功能都有一个测试文件。

测试_1.py

import pytest

import mod


def test_set_x():
    mod.global_setter()
    assert mod.x == 123

测试_2.py

import pytest

import mod


def test_get_x():
    with pytest.raises(NameError):
        mod.global_getter()

如果单独运行这些测试就会通过

$ pytest -s -v test_1.py
========================== test session starts ==========================
platform linux -- Python 3.6.7, pytest-4.3.1, py-1.8.0, pluggy-0.9.0 -- /usr/bin/python3
cachedir: .pytest_cache
rootdir: /mnt/temp/test, inifile:
collected 1 item

test_1.py::test_set_x setter x: 123
PASSED

-

======================= 1 passed in 0.03 seconds ========================
$ pytest -s -v test_2.py
========================== test session starts ==========================
platform linux -- Python 3.6.7, pytest-4.3.1, py-1.8.0, pluggy-0.9.0 -- /usr/bin/python3
cachedir: .pytest_cache
rootdir: /mnt/temp/test, inifile:
collected 1 item

test_2.py::test_get_x PASSED

======================= 1 passed in 0.02 seconds ========================

如果一起运行,第二个测试将失败。

$ pytest -s -v test_1.py test_2.py
========================== test session starts ==========================
platform linux -- Python 3.6.7, pytest-4.3.1, py-1.8.0, pluggy-0.9.0 -- /usr/bin/python3
cachedir: .pytest_cache
rootdir: /mnt/temp/test, inifile:
collected 2 items

test_1.py::test_set_x setter x: 123
PASSED
test_2.py::test_get_x getter x: 123
FAILED

=============================== FAILURES ================================
______________________________ test_get_x _______________________________

    def test_get_x():
        with pytest.raises(NameError):
>           mod.global_getter()
E           Failed: DID NOT RAISE <class 'NameError'>

test_2.py:8: Failed
================== 1 failed, 1 passed in 0.08 seconds ===================

导入模块的状态似乎在测试和测试文件之间流动。

为什么会发生这种情况,有没有办法告诉 pytest 为每个测试文件独立导入模块?如果是这样,有什么方法可以通过最小的改变来实现它?test_功能?上面的玩具示例说明了我在使用具有许多测试的较大代码库时遇到的问题。


这是预期的,因为通过 pytest 运行的所有测试都在单个进程中运行,并且您的第一个测试是通过添加来改变全局状态x到全局命名空间。

你有几个选择。

  1. 重构您的代码以不使用全局变量。或者至少,将其封装在一个类中,这使得模拟变得容易。
  2. 使用类似的框架pytest-xdist (see 在不同的进程中运行 py.test 测试 https://stackoverflow.com/questions/48234032/run-py-test-test-in-different-process)这确保您的测试在不同的进程中运行。
  3. 在第二次测试之前添加一个固定装置,这会显式地取消设置全局变量x.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pytest从不同的测试文件独立导入相同的模块 的相关文章

  • Python 有不可变列表吗?

    python 有不可变列表吗 假设我希望具有元素有序集合的功能 但又想保证它不会改变 如何实现呢 列表是有序的 但它们可以改变 是的 它被称为一个tuple 所以 而不是 1 2 这是一个list并且可以突变 1 2 is a tuple并
  • Python:如果满足条件,则循环遍历一个字典并在新字典中创建键/值对

    我想将一个字典的值与第二个字典的值进行比较 如果值满足特定条件 我想创建第三个字典 其中的键和值对将根据匹配情况而变化 这是一个显示我的问题的人为示例 编辑 对所有返回感到抱歉 但堆栈溢出无法识别单个返回 并且在一行上运行 3 4 行 使代
  • c++11 正则表达式比 python 慢

    嗨我想了解为什么以下代码使用正则表达式进行分割字符串分割 include
  • Native TF 与 Keras TF 性能比较

    我使用本机和后端张量流创建了完全相同的网络 但在使用多个不同参数进行了多个小时的测试后 仍然无法弄清楚为什么 keras 优于本机张量流并产生更好 稍微但更好 的结果 Keras 是否实现了不同的权重初始化方法 或者执行除 tf train
  • Python 正则表达式从文本中提取域

    我有以下正则表达式 r a zA Z0 9 a zA Z0 9 61 a zA Z0 9 a zA Z 2 6 当我将其应用于文本字符串时 比方说 这是 www website1 com 这是 website2 com 我得到 www we
  • 如何将数据从 JavaScript 发送到 Python

    我正在 jinja2 和 python2 7 上使用 GAE 进行 Web 开发 我可以从Python获取数据 但我无法将数据从 JavaScript 发送到 Python 这是 JavaScript 代码 function toSave
  • python:numpy 运行脚本两次

    当我将 numpy 导入到 python 脚本中时 该脚本会执行两次 有人可以告诉我如何阻止这种情况 因为我的脚本中的所有内容都需要两倍的时间 这是一个例子 usr bin python2 from numpy import print t
  • 如何使用Peewee查询多个相似的数据库?

    我遇到了使用 Peewee 查询多个数据库的问题 我有 2 个现有的 mysql 数据库 让我们将它们命名为 A 和 B 结构相似 因为它是两个 Bugzilla 数据库 我使用 Pwiz 生成模型 modelsA py 和 modelsB
  • 统计Sweep算子的Python实现

    我正在学习一些用书中缺失的数据进行统计的技术 缺失数据的统计分析作者 利特尔和鲁宾 对于处理单调无响应数据来说 一个特别有用的函数是扫频操作员 详情见第 148 151 页 我知道 R 模块gmm有swp函数可以做到这一点 但我想知道是否有
  • pandas groupby 并转换为 json 列表

    我有一个如下所示的 pandas 数据框 idx f1 f2 f3 1 a a b 2 b a c 3 a b c 87 e e e 我需要将其他列转换为基于索引列的字典列表 所以 最终结果应该是 idx features 1 f1 a f
  • 将具有多个时区的 pandas 列转换为单个时区

    Problem 我在 pandas DataFrame 中有一个列 其中包含带有时区的时间戳 此列中有两个不同的时区 我需要确保只有一个 这是该列末尾的输出 260003 2019 05 21 12 00 00 06 00 260004 2
  • 无法使用 wxPython 打开在 folium 中生成的本地 HTML 文件

    我目前正在尝试将 GPS 坐标绘制为地图上的标记 并在 wxPython 中显示结果 我使用 folium 绘制坐标标记并生成 HTML 文件 import folium fmap folium Map 43 5321 172 6362 z
  • 如何在 FastAPI Swagger API 中按方法类型对方法进行排序?

    如何在 FastAPI Swagger 自动文档中设置 API 方法的排序顺序 我希望所有方法按类型分组 GET POST PUT DELETE 这个答案 https stackoverflow com questions 24951268
  • 在解析器/子解析器的开头使用 argparse.REMAINDER

    我想实现一个 arg 解析器 它允许我将单元测试作为子命令之一运行 盲目地将参数传递给 unittest main 例如 foo py unittest args to pass to unittest main 以及其他子命令 foo p
  • AppEngine 警告 - OpenBLAS 警告 - 无法确定该系统上的 L2 缓存大小

    我尝试在 GC AppEngine 上部署应用程序 部署过程中没有错误 但应用程序无法运行 仅显示加载页面 日志中唯一一个奇怪的原始日志 OpenBLAS WARNING could not determine the L2 cache s
  • 如何单独捕获这些异常?

    我正在编写一个与 Quickbooks 交互的 Python 程序 连接到 Quickbooks 时 根据问题的不同 我可能会遇到以下两个常见异常之一 pywintypes com error 2147352567 Exception oc
  • 检查图像中是否有太薄的区域

    我正在尝试验证雕刻机的黑白图像 更多的是剪贴画图像 不是照片 我需要考虑的主要事情之一是区域的大小 或线条的宽度 因为机器无法处理太细的线条 所以我需要找到比给定阈值更细的区域 以此图为例 竖琴的琴弦可能太细而无法雕刻 我正在阅读有关 Ma
  • Python struct.pack() 'struct.error: bad char in struct format' 尝试保存字节顺序时

    我正在尝试打包一个字符串和字符串的长度 fmt
  • 如何将动态数据传递给装饰器

    我正在尝试编写一个基本的 CRUD 控制器类来执行以下操作 下列的 class BaseCrudController model field validation template dir expose self template dir
  • 如何使用多阶段构建减小 python (docker) 图像大小?

    我正在寻找一种使用 python 和 Dockerfile 创建多阶段构建的方法 例如 使用以下图像 第一张图片 安装所有编译时要求 并安装所有需要的 python 模块 第二张图片 将所有已编译 构建的包从第一个映像复制到第二个映像 而不

随机推荐

  • 不是 Stata 版本 5-12 .dta 文件

    我正在尝试使用我的电脑中的现有数据 dta file 我正在尝试使用以下命令在 R 中打开它 library foreign mydata lt read dta file C Users me Desktop data raw dta 但
  • 如何制作一个一次接受一个值的排列函数?

    我正在寻找一个函数 它接受区间 0 1 N 中的 1 个数字 并返回同一区间中的排列值 0 1 2 3 4 5 和 f x 的示例如下 f 0 5 f 1 1 f 2 0 f 3 4 f 4 2 f 5 3 根据我的研究 理解 这是一个循环
  • 在命令行上过滤 Logcat 日志

    public static final TAG Legendry Eagle 问题 我想查看日志 Legendry Eagle 从命令行 I tried adb logcat s Legendry Eagle adb logcat s
  • 求近似规则的点网格子集的周长

    让我们考虑一组接近规则的二维网格 这些网格与相邻网格相邻 相邻网格具有一个或多个相同的顶点 这里是10个网格的样本 顶点坐标 经度 纬度 如下 A lt lon lat 1 2 1 85 30754 27 91250 2 85 32862
  • Powershell 对 Excel 工作簿进行多个 SQL 查询

    首先 如果这是一个重复的问题 我深表歉意 我搜索了又搜索 但没有找到任何可以解决我所遇到的问题的内容 我的目标是使用 7 个 Powershell 脚本 将 SQL 查询中的 CSV 输出到 1 个 Excel 工作簿中 每个 CSV 位于
  • VS.NET默认为私有类

    为什么 Visual Studio 在 C 中将新类声明为私有 我几乎总是把它们转为公开的 我是疯子吗 我不确定为什么要这样做 但为了让 Visual Studio 默认将该类创建为 Public 您需要执行以下操作 进入 Program
  • 在 xcode 4.5.1 上链接库 OpenCV 2.4.2

    我已经按照此处的说明安装了带有 macports 的 opencv 使用 Xcode 为 OS X Lion Mountain Lion 编译 OpenCV 2 3 1 https stackoverflow com questions 8
  • HttpApplication 不退出

    我有一个单页应用程序 前端使用 Angular js 后端使用 Web api2 还使用 Castle Windsor 和 SignalR 我在服务器上使用 C 组件来维护服务器状态 因此 在 Application Start 上 我将温
  • 将文件上传器添加到 Joomla 管理组件

    我根据 Joomla 指南制作了 Joomla 管理组件 http docs joomla org Developing a Model View Controller Component 2 5 Developing a Basic Co
  • 如何将我使用(DT)数据表创建的表保存为高质量图像?

    我创建了一个可以在我的 查看器 中查看的数据表 如果我使用导出来复制图像或保存为 png 它的质量往往会很低吗 我最好的选择是截取图像并将其粘贴到我的工作文档中 我在其中输入报告 但我知道必须有更好的方法 对我能做什么有什么建议吗 您可以使
  • 部署战争问题

    下面的错误是什么意思 我使用 eclipse 并将 web 项目导出为 war 文件 我部署到 weblogic 时出现我不明白的错误消息 Message icon Error Unable to access the selected a
  • 如何避免 javonet 中数组中基元的自动装箱

    根据中的例子https www javonet com java devs guides working with net arrays and collections from java with javonet https www ja
  • 无法检测adb版本,退出值:0xc0000135

    我使用的android studio最新版本 HEXM 已安装在我的电脑中 android虚拟设备未创建其显示未知问题 好的 所以我使用 genymotion 模拟器 但 android studio 没有检测到它 无法检测adb版本 退出
  • 标题中单个单词的颜色与组的颜色相匹配

    我最近在 经济学人 上看到了一张折线图 其中标题包含彩色单词以匹配折线图中使用的组的颜色 https www economist com blogs graphicdetail 2018 04 daily chart 1 我想知道如何使用
  • Golang SQL 查询变量替换

    我有 sql 查询需要变量替换才能更好地消耗我的go kit https github com go kit kit服务 I have dep org作为我的休息服务一部分的用户输入 例如 dep abc and org def 我尝试过一
  • “未捕获的引用错误:JQueryValidatorUI 未定义”?

    使用 jquery validation ui 插件时 未捕获的 ReferenceError JQueryValidatorUI 未定义 也未捕获类型错误 对象 对象对象 没有方法 验证 这是我的脚本顺序
  • 如何在JUNG中添加具有相同标签(但端点不同)的两条边?

    如何添加具有相同标签但端点不同的两条边 例如 我想添加两条具有相同标签 label1 的边 一条从顶点 v 1 到顶点 v 2 另一条从顶点 v 2 到 v 3 部分代码是 g addEdge label1 v 1 v 2 g addEdg
  • 如何将 javascript 对象发送到远程 CFC 组件

    我创建了一个 javascript 对象 var spanglist one q1 two q2 three q3 four q4 我创建 ajax jquery 对象以将数据发送到 CFC ajax url gridly componen
  • Angularjs:ReferenceError:范围未定义

    我是 Angularjs 的初学者 在理解模块和范围方面有一些困难 我不断收到范围未定义的错误 但我不明白为什么 首先 我将控制器链接到设置路线的位置 但由于控制器内的函数是在提交按钮上调用的 因此单击我将其拿走 我试过把它放回去 但这没有
  • pytest从不同的测试文件独立导入相同的模块

    以下主题模块包含两个函数 其中之一操作全局变量 mod py def global setter global x x 123 print setter x x def global getter print getter x x 每个功能