gpt4 book ai didi

python - pytest:重置单个文件之间的模拟

转载 作者:行者123 更新时间:2023-12-04 16:45:30 31 4
gpt4 key购买 nike

编辑:虽然真正感谢任何测试建议,但我特别想知道 pytest 是否可以为我强制隔离,而不是依靠自己总是记得清理模拟。
是否pytest支持在单个 Python 文件之间“重置”进程状态,或者以其他方式将测试文件相互隔离?
我们的 CI 曾经在单个文件上调用 pytest,如下所示:

pytest file1.py
pytest file2.py
...
它现在为所有文件调用一次 pytest,如下所示:
pytest file1.py file2.py ...
当一些测试文件(例如 file1.py)执行模块级模拟时,我们遇到了麻烦。例如(简化):
def setup_module():
patch("path.to.some.module.var", Mock()).start()
(没有对应的 teardown_module 。)
当一次一个地对文件调用 pytest 时,这可以正常工作。但是当它针对多个文件运行时,先前执行的测试代码所做的任何模拟都会保留到后续的测试代码中。有没有办法在文件之间“重置”这种状态?例如,pytest 是否支持在单独的进程中调用每个文件的测试的方法? (查看 pytest 文档,但没有发现类似的内容。)
现在,我们正在添加 teardown_module()调用 patch.stopall() 的函数,但是如果 pytest 的附加安全性隐式地将我们的测试文件彼此隔离,那就太好了。

最佳答案

执行此操作的标准方法可能是使用带有上下文管理器的 fixture 而不是设置/拆卸构造:

@pytest.fixture(scope="module", autouse=True)
def patch_var():
with mock.patch("path.to.some.module.var"):
yield
这将在测试超出模块范围后结束修补。
它与不太方便的效果相同:
@pytest.fixture(scope="module", autouse=True)
def patch_var():
patcher = mock.patch("path.to.some.module.var")
patcher.start()
yield
patcher.stop()
请注意,如果您使用 start,您有责任停止自己修补。在构造的修补程序对象上。使用上下文管理器或补丁装饰器(如果应用于单个测试)进行补丁总是更安全。
更新:
据我所知,如果在同一测试运行中执行,则无法无条件地将测试模块彼此完全隔离。这就是 fixture 范围的概念。
fixture 应始终使用自动清理编写。对于修补,您使用上下文管理器(如上所示)为您进行清理,其他事情您必须在 yield 之后自行清理。 .如果您想对整个测试运行进行全局更改,请使用 session 范围的装置。如果要隔离测试模块,请使用模块范围的固定装置,对于测试类或单个测试隔离,您可以使用类或功能范围的固定装置。

关于python - pytest:重置单个文件之间的模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63528777/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com