我正在从事的项目是一个包装成 Python 包的业务逻辑软件。这个想法是各种脚本或应用程序将导入它,初始化它,然后使用它。
它目前有一个顶级的 init() 方法来进行初始化并设置各种东西,一个很好的例子是它使用数据库连接设置SQLAlchemy并存储 SA 会话以供以后访问。它被存储在我的项目的子包中(即 myproj.model.Session,因此其他代码可以在导入模型后获得有效的 SA 会话)。
长话短说,这使我的包成为一个有状态的包。我正在为该项目编写单元测试,这种 stafeful 行为带来了一些问题:
- 测试应该是隔离的,但是我的包的内部状态打破了这种隔离
- 我无法测试主要的 init() 方法,因为它的行为取决于状态
- 未来的测试将需要针对具有众所周知的模型状态的(尚未编写的)控制器部分运行(例如,预填充的sqlite in-memory db)
我应该以某种方式重构我的包,因为当前结构不是最佳(可能)实践(tm)吗?:)
我应该把它留在那里并每次都设置/拆除整个事情吗?如果我要实现完全隔离,这意味着在每次测试中完全擦除并重新填充数据库,这不是矫枉过正吗?
这个问题实际上是关于整体代码和测试结构的,但是为了我的测试,我使用nose-1.0是值得的。我知道Isolate 插件可能对我有帮助,但我想在测试套件中做奇怪的事情之前得到代码。