如果你正在编写一个库或应用程序,那么单元测试文件应该放在哪里?
将测试文件与主应用程序代码分开是很好的,但将它们放在应用程序根目录中的“tests”子目录中是很尴尬的,因为这会使导入将要测试的模块变得更加困难。
这里是否存在最佳实践?
如果你正在编写一个库或应用程序,那么单元测试文件应该放在哪里?
将测试文件与主应用程序代码分开是很好的,但将它们放在应用程序根目录中的“tests”子目录中是很尴尬的,因为这会使导入将要测试的模块变得更加困难。
这里是否存在最佳实践?
当前回答
我也倾向于把我的单元测试放在文件本身中,正如Jeremy Cantrell上面所指出的,尽管我倾向于不把测试函数放在主体中,而是把所有东西都放在一个文件中
if __name__ == '__main__':
do tests...
块。这最终会将文档添加到文件中,作为如何使用您正在测试的python文件的“示例代码”。
我应该补充一点,我倾向于编写非常紧凑的模块/类。如果你的模块需要大量的测试,你可以把它们放在另一个测试中,但即使这样,我仍然会补充:
if __name__ == '__main__':
import tests.thisModule
tests.thisModule.runtests
这让任何阅读源代码的人都知道到哪里去寻找测试代码。
其他回答
对于文件module.py,单元测试通常应该被称为test_module.py,遵循python命名约定。
test_module.py有几个常用的存放位置:
和module.py在同一个目录下。 在../tests/test_module.py中(与代码目录处于同一级别)。 在tests/test_module.py中(代码目录下的一级)。
我更喜欢#1,因为它很容易找到测试并导入它们。无论您使用什么构建系统,都可以轻松地配置为运行以test_开头的文件。实际上,用于测试发现的默认单元测试模式是test*.py。
如果测试很简单,就把它们放在文档字符串中——大多数Python测试框架都可以使用它:
>>> import module
>>> module.method('test')
'testresult'
对于其他更复杂的测试,我将它们放在../tests/test_module.py或tests/test_module.py中。
我使用tests/目录,然后使用相对导入导入主要应用程序模块。在MyApp/tests/foo.py中,可能有:
from .. import foo
导入MyApp。foo模块。
在c#中,我通常将测试分离到单独的程序集中。
在Python中——到目前为止——我倾向于编写doctests,其中测试位于函数的文档字符串中,或者将它们放在模块底部的if __name__ == "__main__"块中。
只有一个测试文件
如果只有1个测试文件,建议将其放在顶级目录中:
module/
lib/
__init__.py
module.py
test.py
在CLI下运行测试
python test.py
许多测试文件
如果有很多测试文件,将其放在tests文件夹中:
module/
lib/
__init__.py
module.py
tests/
test_module.py
test_module_function.py
# test_module.py
import unittest
from lib import module
class TestModule(unittest.TestCase):
def test_module(self):
pass
if __name__ == '__main__':
unittest.main()
在CLI下运行测试
# In top-level /module/ folder
python -m tests.test_module
python -m tests.test_module_function
使用单元测试发现
单元测试发现将在包文件夹中找到所有测试。
在tests/文件夹中创建__init__.py
module/
lib/
__init__.py
module.py
tests/
__init__.py
test_module.py
test_module_function.py
在CLI下运行测试
# In top-level /module/ folder
# -s, --start-directory (default current directory)
# -p, --pattern (default test*.py)
python -m unittest discover
参考
用于测试布局的pytest良好实践 unittest
单元测试框架
鼻子 nose2 pytest