gpt4 book ai didi

python - pytest:测试子包的导入

转载 作者:行者123 更新时间:2023-12-01 06:26:46 26 4
gpt4 key购买 nike

我想做以下事情。在我的项目 a 中,我有一个带有实例 fac=Fac() 的工厂类 Fac,某些类在其中注册。这些类位于子包 a.b 中。

如果我执行普通的import a,则不会导入子包a.b,也不会注册任何类,因此fac.registered_classes是一个空列表。

导入子包b后,fac.registered_classes被子包b中的类填充。

为了不让用户感到困惑,我添加了这一行

在包a__init__.py中导入.b

现在,我想使用 pytest 编写一个测试,如果 fac.registered_classes 不为空,则基本上可以通过;所以没有人会不小心删除我的 __init__.py 中的那一行。我们将该测试称为 test_import_b

不同的测试当然也会测试子包b的功能,从而显式导入b本身。

但是,测试运行期间的所有导入似乎都可用于所有测试。如果在 __init__.py 中删除导入行,则仅运行单个测试 test_import_b 就会失败,但如果同时运行所有测试,则不会再失败。

我应该做什么才能使我的测试设置正常工作?

最佳答案

这是正确的 py.test 和 Python 行为。模块主体级代码在导入模块时运行。 Python 虚拟机维护每个进程的导入模块。

我不认为有一个好的解决方案可以实现您想要的行为。我想到了两种策略

  • 永远不要仅在模块导入时隐式注册任何内容 - 通过函数调用显式注册所有内容,例如使用 init()

  • 在明确需要导入并运行寄存器的测试中,在测试开始时导入它或制作一个执行导入的装置

例如

def test_boohoo():
import a.b
# Test goes here

关于python - pytest:测试子包的导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60102898/

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