如果你正在编写一个库或应用程序,那么单元测试文件应该放在哪里?
将测试文件与主应用程序代码分开是很好的,但将它们放在应用程序根目录中的“tests”子目录中是很尴尬的,因为这会使导入将要测试的模块变得更加困难。
这里是否存在最佳实践?
如果你正在编写一个库或应用程序,那么单元测试文件应该放在哪里?
将测试文件与主应用程序代码分开是很好的,但将它们放在应用程序根目录中的“tests”子目录中是很尴尬的,因为这会使导入将要测试的模块变得更加困难。
这里是否存在最佳实践?
当前回答
对于文件module.py,单元测试通常应该被称为test_module.py,遵循python命名约定。
test_module.py有几个常用的存放位置:
和module.py在同一个目录下。 在../tests/test_module.py中(与代码目录处于同一级别)。 在tests/test_module.py中(代码目录下的一级)。
我更喜欢#1,因为它很容易找到测试并导入它们。无论您使用什么构建系统,都可以轻松地配置为运行以test_开头的文件。实际上,用于测试发现的默认单元测试模式是test*.py。
其他回答
根据我用Python开发测试框架的经验,我建议将Python单元测试放在一个单独的目录中。维护对称的目录结构。这将有助于只打包核心库,而不打包单元测试。下面是通过原理图实现的。
<Main Package>
/ \
/ \
lib tests
/ \
[module1.py, module2.py, [ut_module1.py, ut_module2.py,
module3.py module4.py, ut_module3.py, ut_module.py]
__init__.py]
通过这种方式,当您使用rpm打包这些库时,您可以只打包主库模块(仅)。这有助于可维护性,特别是在敏捷环境中。
我也倾向于把我的单元测试放在文件本身中,正如Jeremy Cantrell上面所指出的,尽管我倾向于不把测试函数放在主体中,而是把所有东西都放在一个文件中
if __name__ == '__main__':
do tests...
块。这最终会将文档添加到文件中,作为如何使用您正在测试的python文件的“示例代码”。
我应该补充一点,我倾向于编写非常紧凑的模块/类。如果你的模块需要大量的测试,你可以把它们放在另一个测试中,但即使这样,我仍然会补充:
if __name__ == '__main__':
import tests.thisModule
tests.thisModule.runtests
这让任何阅读源代码的人都知道到哪里去寻找测试代码。
如果测试很简单,就把它们放在文档字符串中——大多数Python测试框架都可以使用它:
>>> import module
>>> module.method('test')
'testresult'
对于其他更复杂的测试,我将它们放在../tests/test_module.py或tests/test_module.py中。
When writing a package called "foo", I will put unit tests into a separate package "foo_test". Modules and subpackages will then have the same name as the SUT package module. E.g. tests for a module foo.x.y are found in foo_test.x.y. The __init__.py files of each testing package then contain an AllTests suite that includes all test suites of the package. setuptools provides a convenient way to specify the main testing package, so that after "python setup.py develop" you can just use "python setup.py test" or "python setup.py test -s foo_test.x.SomeTestSuite" to the just a specific suite.
我们使用
app/src/code.py
app/testing/code_test.py
app/docs/..
在每个测试文件中,我们插入../src/ sys.path。这不是最好的解决办法,但很有效。我认为如果有人提出类似java中的maven之类的东西,给你提供标准的约定,无论你在做什么项目,都可以工作,那就太好了。