Python模块单元测试的最佳文件结构组织?
很遗憾,我发现Python中的单元测试有太多种写法,而且通常没有很好地记录下来。
我在寻找一种“终极”的结构,希望能满足以下大部分要求:
- 能够被测试框架发现,包括:
pytest
nosetests
tox
- 测试代码应该放在模块文件之外,并且放在与模块不同的目录中(方便维护),最好是在包的根目录下有一个
tests/
目录。 - 应该可以直接执行一个测试文件(测试代码需要知道它要测试的模块在哪里)。
请提供一个做假测试的示例测试文件,说明文件名和目录。
1 个回答
19
这是我一直在使用的方法:
目录结构
# All __init__.py files are empty in this example.
app
package_a
__init__.py
module_a.py
package_b
__init__.py
module_b.py
test
__init__.py
test_app.py
__init__.py
main.py
main.py
# This is the application's front-end.
#
# The import will succeed if Python can find the `app` package, which
# will occur if the parent directory of app/ is in sys.path, either
# because the user is running the script from within that parect directory
# or because the user has included the parent directory in the PYTHONPATH
# environment variable.
from app.package_a.module_a import aaa
print aaa(123, 456)
module_a.py
# We can import a sibling module like this.
from app.package_b.module_b import bbb
def aaa(s, t):
return '{0} {1}'.format(s, bbb(t))
# We can also run module_a.py directly, using Python's -m option, which
# allows you to run a module like a script.
#
# python -m app.package_a.module_a
if __name__ == '__main__':
print aaa(111, 222)
print bbb(333)
module_b.py
def bbb(s):
return s + 1
test_app.py
import unittest
# From the point of view of testing code, our working modules
# are siblings. Imports work accordingly, as seen in module_a.
from app.package_a.module_a import aaa
from app.package_a.module_a import bbb
class TestApp(unittest.TestCase):
def test_aaa(self):
self.assertEqual(aaa(77, 88), '77 89')
def test_bbb(self):
self.assertEqual(bbb(99), 100)
# Simiarly, we can run our test modules directly as scripts using the -m option,
# or using nose.
#
# python -m app.test.test_app
# nosetests app/test/test_app.py
if __name__ == '__main__':
unittest.main()