Python pytest:导入子包的测试

Python pytest:导入子包的测试,python,pytest,python-import,Python,Pytest,Python Import,我想做以下几件事。在我的项目a中,我有一个带有实例Fac=Fac()的工厂类Fac,其中某些类注册到。这些类位于子包a.b中 如果我执行简单的导入a,则不会导入子包a.b,不会注册任何类,因此fac.registered\u classes是一个空列表 导入子包b后,子包b中的类将填充已注册的类 为了不让用户感到困惑,我添加了一行 在包a的\uuuuu init\uuuuuuuuuuuuupy中导入.b 现在,我想用pytest编写一个基本通过的测试,如果fac.registered\u cla

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

如果我执行简单的导入a,则不会导入子包
a.b
,不会注册任何类,因此
fac.registered\u classes
是一个空列表

导入子包
b
后,子包
b
中的类将填充已注册的类

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

在包
a
\uuuuu init\uuuuuuuuuuuuupy
中导入.b

现在,我想用
pytest
编写一个基本通过的测试,如果
fac.registered\u class
不是空的;所以没有人会意外地删除我的
\uuuu init\uuuuuuy.py
中的那一行。让我们调用该测试
test\u import\u b

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

但是,似乎在测试运行期间的所有导入都可用于所有测试。 如果在
\uuuu init\uuuuuuuuupy
中删除了导入行,则仅运行单个测试
测试导入b
时失败,如果同时运行所有测试,则不再失败


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

这是正确的py.test和Python行为。导入到模块时,将运行模块正文级别代码。Python虚拟机为每个进程维护导入的模块

我不相信有一个好的解决方案来实现你想要的行为。我想到了两个策略

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

  • 在显式需要导入并运行register的测试中,在测试开始时导入它,或者制作一个执行导入的fixture

例如

def test_boohoo():
进口a.b
#测试在这里进行

我明白了,它以某种方式解决了问题。另一方面,它包含了我故意没有实现的功能。我想,用户不应该被迫自己执行注册步骤。你可以编写一个库用户可以调用的通用函数
register\u all()
导入的副作用总是能帮助你摆脱一两个麻烦。我不喜欢这种方法,即使它是一个通用调用,这是一个额外的呼叫,从用户的角度来看,这似乎是不必要的。用户永远不必调用
register\u something\u else()
函数。但我看到了这种方法的缺点。我只是对两种选择都不满意。