对于放置Python单元测试的最佳位置是否有共识?
单元测试是否应包含在与正在测试的功能相同的模块中(当模块单独运行时执行(if __name__ == '__main__'
等)),或者将单元测试包含在不同模块中更好?
也许两种方法的组合最好,包括每个模块中的模块级测试,并添加更高级别的测试,将多个模块中包含的功能作为单独的模块(可能在/ test子目录中?)。
如果测试包含在单独的模块中,我认为测试发现更简单,但如果他/她必须记住在修改测试模块时更新附加测试模块,则会给开发人员带来额外的负担。 / p>
我有兴趣了解人们对组织单元测试的最佳方式的看法。
答案 0 :(得分:11)
tests/
子目录中,用于大型项目。这对于您正在创建的项目最有效。
有时您使用的库会确定测试的位置,就像Django一样(您将测试放在models.py
,tests.py
或tests/
子目录中应用程序)。
如果没有现有限制,那就是个人偏好。对于一小组模块,将单元测试放在您正在创建的文件中可能更方便。
对于任何超过几个模块的内容,我在包中的tests/
目录中单独创建测试。将测试代码与实现混合在一起会为读取代码的人增加不必要的噪音。
答案 1 :(得分:11)
使用__main__
技巧并没有多大意义。假设您的模块中有多个文件,并且它不再起作用,因为您不想在测试模块时单独运行每个源文件。< / p>
此外,在安装模块时,大多数情况下您不想安装测试。您的最终用户不关心测试,只有开发人员应该关心。
不,真的。将您的测试放在tests/
,将您的文档放在doc
中,并为make test
准备一个Makefile。任何其他方法都只是中间解决方案,仅对特定的小模块有效。
答案 2 :(得分:10)
就个人而言,我在源目录中创建了一个tests /文件夹,并尝试或多或少地使用单元测试等价物镜像我的主要源代码层次结构(根据经验,有1个模块= 1个单元测试模块)。 / p>
请注意,我使用nose,其理念与unittest的理念略有不同。
答案 3 :(得分:4)
我通常将测试代码保存在单独的模块中,并将模块/包和测试发布在单个发行版中。如果用户使用setup.py
安装,他们可以从测试目录运行测试,以确保一切都在他们的环境中工作,但只有模块的代码最终在Lib/site-packages
下。
答案 4 :(得分:3)
除了测试之外,可能还有其他原因要使用if __name__ == '__main__'
检查。将测试保留在其他模块中会使该选项对您开放。另外 - 如果您重构模块的实现并且您的测试在另一个未编辑的模块中 - 您知道在对重构代码运行测试时没有更改测试。
答案 5 :(得分:1)
我通常将它们放在一个名为 test / 的单独文件夹中。我个人没有使用if __name__ =='__ main__'检查,因为我使用nosetests并且它自己处理测试检测。
答案 6 :(得分:0)
if __name__ == '__main__'
等对于小型测试非常有用。