我正在开发的这个项目是一个封装为Python包的业务逻辑软件。这个想法是,各种脚本或应用程序将导入它,初始化它,然后使用它。如何正确使用有状态的Python模块实现测试隔离?
它目前有一个顶级init()方法来完成初始化并设置各种东西,一个很好的例子是它使用db连接设置SQLAlchemy并存储SA会话以供以后访问。它被存储在我的项目的一个子包中(即myproj.model.Session,所以其他代码可以在导入模型后得到一个工作的SA会话)。
长话短说,这使得我的软件包成为一个有状态的软件包。我在写单元测试项目,这stafeful行为带来了一些问题:
- 测试应该孤立的,而是我的包的内部状态,打破这个隔离
- 我无法测试的主要init()方法因为它的行为取决于状态
- 将来的测试将需要对运行(还没有写)与众所周知的模型状态控制部分(如预填充sqlitein-memory db)
我应该以某种方式重构我的包装e因为目前的结构不是最佳(可能)实践(tm)? :)
我应该把它放在那个位置,每次都设置/拆卸整个事物吗?如果我要实现完全隔离,这意味着在每次测试中完全擦除并重新安装db,是不是过度杀伤?
这个问题是真的在整体代码&测试结构,但它为什么值得使用nose-1.0我的测试。我知道Isolate plugin可能可以帮助我,但我希望在测试套件中做出奇怪的事情之前就能获得代码。