在打包Python模块时,测试应放在哪里?
我有一个模块,它在一个命名空间里。那测试和测试所依赖的数据应该放在这个命名空间里,还是放在顶层,也就是setup.py所在的地方呢?
./company/__init__.py
./company/namespace/__init__.py
./company/namespace/useful.py
./company/namespace/test_useful.py
./company/namespace/test_data/useful_data.xml
./setup.py
或者
./company/__init__.py
./company/namespace/__init__.py
./company/namespace/useful.py
./test_useful.py
./test_data/useful_data.xml
./setup.py
这个问题是不是在问测试是否应该被安装呢?
3 个回答
我个人会创建一个名为 tests
的单独包,作为主包的子包,原因有几个:
如果
tests
和根包在同一级,有可能你或者其他用户会错误配置setup.py
,不小心把一个全局包命名为tests
。这样会造成很多困惑和麻烦,直到你意识到发生了什么。把它放在主模块下就能解决这个问题,因为它现在在一个(希望是)全球唯一的命名空间下。我不喜欢把测试模块放在用户包里,因为测试工具需要在生产代码中查找。这对大多数人来说可能没问题。但如果你是硬件测试工程师,你可能在生产代码中经常使用“测试”这个词,而不想让单元测试工具把这些内容也算进去。如果所有测试都集中在一个地方,和生产代码分开,那就简单多了。
我可以进一步把我的测试文件夹细分为不同类型的测试,比如
unit
(单元测试)、functional
(功能测试)和integration
(集成测试)。我的功能测试通常依赖一些奇怪的专有硬件、数据,或者运行得比较慢。所以在开发时,我可以很方便地只运行快速的单元测试文件夹。有时候,把测试放在和被测试内容相同的包结构中也很方便。
总的来说,我认为在考虑大家的建议后,自己思考什么对你特定的问题领域最好是很重要的。“最佳实践”是一个很好的起点,但不是终点,用来发展一个过程。
这个示例项目把测试文件放在了模块外面。
它的文件夹结构是这样的:
├── data
│ └── data_file
├── MANIFEST.in
├── README.rst
├── sample
│ ├── __init__.py
│ └── package_data.dat
├── setup.cfg
├── setup.py
└── tests
├── __init__.py
└── test_simple.py
相关链接:打包指南:https://packaging.python.org/en/latest/
小提示:不要去看“打包的搭车者指南”。这个指南自2010年就没有更新过了!
(不要把这两个页面搞混了。“Python的搭车者指南”是一本非常不错的书。)
根据《打包指南》,你应该把测试模块放在你要测试的模块里面。
这里有个例子:
TowelStuff/
bin/
CHANGES.txt
docs/
LICENSE.txt
MANIFEST.in
README.txt
setup.py
towelstuff/
__init__.py
location.py
utils.py
test/
__init__.py
test_location.py
test_utils.py
这样做的话,你的模块在发布的时候会连同测试一起发布,用户可以用这些测试来确认它在他们的环境中能正常工作。
详细内容请查看http://the-hitchhikers-guide-to-packaging.readthedocs.org/en/latest/creation.html。