如何使用有状态的Python模块正确实现测试隔离?
|
我正在从事的项目是包装为Python软件包的业务逻辑软件。这个想法是,各种脚本或应用程序将导入它,对其进行初始化,然后再使用它。
当前,它具有用于初始化并设置各种内容的顶级init()方法,一个很好的示例是它使用db连接设置SQLAlchemy并存储SA会话以供以后访问。它被存储在我的项目的子包中(即myproj.model.Session,因此其他代码在导入模型后可以得到有效的SA会话)。
长话短说,这使我的包裹成为有状态的包裹。我正在为该项目编写单元测试,这种稳定的行为带来了一些问题:
测试应该隔离,但是我程序包的内部状态打破了隔离
我无法测试主要的init()方法,因为其行为取决于状态
未来的测试将需要针对具有已知模型状态(例如,预先填充的sqlite内存数据库)的(尚未编写)控制器部分运行
我应该以某种方式重构我的软件包,因为当前结构不是最佳(可能)实践(tm)? :)
我应该把它留在那儿,每次设置/拆卸整个东西吗?如果我要实现完全隔离,那就意味着在每个测试中都将完全擦除并重新填充数据库,这不是很过分吗?
这个问题确实在整个代码和测试结构上,但是对于我来说,使用鼻子1.0进行测试有什么价值?我知道Isolate插件可能会对我有所帮助,但是我想在测试套件中做一些奇怪的事情之前先弄清楚代码。
没有找到相关结果
已邀请:
3 个回复
掀辟髓观粟
薄扩络拜
函数,该函数设置并返回一个实例,同时用返回对现有实例的引用的函数替换自身。然后,每个测试都可以调用相同的函数,但是仅对第一个函数进行设置。 这样可以省去为每个测试执行冗长的设置过程的时间,但有时会产生奇怪的情况,即测试失败或通过,具体取决于之前运行的测试。我们有解决这种问题的方法-无论状态如何,很多测试都应该做同样的事情,并且我们可以尝试在某些测试之前重置对象的状态。您可能会发现类似的折衷方案。
缔恃钨