Python单元测试应放在单独模块中吗?
关于Python单元测试放在哪里,大家有没有什么共识呢?
单元测试应该和被测试的功能放在同一个模块里吗?比如说,当这个模块单独运行时(像是用if __name__ == '__main__'
这样的方式),测试也会一起执行。还是说,把单元测试放在不同的模块里更好呢?
也许两种方法结合起来是最好的选择:在每个模块里放一些模块级别的测试,同时再创建一些更高级的测试,这些测试是用来检查多个模块中的功能,可以放在一个单独的模块里(可能放在一个/test的子目录下?)。
我觉得如果测试放在不同的模块里,发现测试会更简单,但这样开发者就得记得在修改被测试的模块时,也要更新额外的测试模块,这样会增加一些负担。
我很想知道大家对组织单元测试的最佳方式有什么看法。
7 个回答
我个人会在我的源代码目录里创建一个tests/文件夹,并尽量让这个文件夹里的结构和我的主源代码结构相似。一般来说,我会遵循一个原则:每个模块对应一个单元测试模块。
需要注意的是,我使用的是nose,它的理念和unittest有点不同。
是的,确实应该使用一个单独的模块。
使用 __main__
的方法其实没什么意义。想象一下,你有多个文件在你的模块里,这样就不太好用了,因为你不想在测试模块的时候单独运行每个源文件。
而且,在安装一个模块的时候,大多数情况下你并不想安装测试代码。最终用户并不关心这些测试,只有开发者才需要关注。
真的,应该把你的测试放在 tests/
文件夹里,把文档放在 doc
文件夹里,并准备一个 Makefile 来执行 make test
。其他的方法只是临时解决方案,只适合特定的小模块。
- 如果你在用一个库,可能需要指定单元测试应该放在哪里,
- 对于小项目,可以把测试放在模块本身里,或者
- 对于大项目,可以在你的包里创建一个
tests/
子目录来放测试。
这其实是看哪个方式对你正在做的项目最合适。
有时候,你使用的库会决定测试放在哪里,比如在Django中,你的测试可以放在 models.py
、tests.py
或者你的应用里的 tests/
子目录中。
如果没有特别的要求,那就看个人喜好了。对于少量模块,把单元测试放在你创建的文件里可能更方便。
但如果模块多了,我会在包里单独创建一个 tests/
目录来放测试。把测试代码和实现代码混在一起,会让阅读代码的人感到困扰。