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()
函数。但我看到了这种方法的缺点。我只是对两种选择都不满意。