Python单元测试应放在单独模块中吗?

21 投票
7 回答
7191 浏览
提问于 2025-04-15 13:54

关于Python单元测试放在哪里,大家有没有什么共识呢?

单元测试应该和被测试的功能放在同一个模块里吗?比如说,当这个模块单独运行时(像是用if __name__ == '__main__'这样的方式),测试也会一起执行。还是说,把单元测试放在不同的模块里更好呢?

也许两种方法结合起来是最好的选择:在每个模块里放一些模块级别的测试,同时再创建一些更高级的测试,这些测试是用来检查多个模块中的功能,可以放在一个单独的模块里(可能放在一个/test的子目录下?)。

我觉得如果测试放在不同的模块里,发现测试会更简单,但这样开发者就得记得在修改被测试的模块时,也要更新额外的测试模块,这样会增加一些负担。

我很想知道大家对组织单元测试的最佳方式有什么看法。

7 个回答

10

我个人会在我的源代码目录里创建一个tests/文件夹,并尽量让这个文件夹里的结构和我的主源代码结构相似。一般来说,我会遵循一个原则:每个模块对应一个单元测试模块。

需要注意的是,我使用的是nose,它的理念和unittest有点不同。

15

是的,确实应该使用一个单独的模块。

使用 __main__ 的方法其实没什么意义。想象一下,你有多个文件在你的模块里,这样就不太好用了,因为你不想在测试模块的时候单独运行每个源文件

而且,在安装一个模块的时候,大多数情况下你并不想安装测试代码。最终用户并不关心这些测试,只有开发者才需要关注。

真的,应该把你的测试放在 tests/ 文件夹里,把文档放在 doc 文件夹里,并准备一个 Makefile 来执行 make test。其他的方法只是临时解决方案,只适合特定的小模块。

13
  1. 如果你在用一个库,可能需要指定单元测试应该放在哪里,
  2. 对于小项目,可以把测试放在模块本身里,或者
  3. 对于大项目,可以在你的包里创建一个 tests/ 子目录来放测试。

这其实是看哪个方式对你正在做的项目最合适。

有时候,你使用的库会决定测试放在哪里,比如在Django中,你的测试可以放在 models.pytests.py 或者你的应用里的 tests/ 子目录中。

如果没有特别的要求,那就看个人喜好了。对于少量模块,把单元测试放在你创建的文件里可能更方便。

但如果模块多了,我会在包里单独创建一个 tests/ 目录来放测试。把测试代码和实现代码混在一起,会让阅读代码的人感到困扰。

撰写回答