在打包Python模块时,测试应放在哪里?

30 投票
3 回答
19589 浏览
提问于 2025-04-16 13:53

我有一个模块,它在一个命名空间里。那测试和测试所依赖的数据应该放在这个命名空间里,还是放在顶层,也就是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 个回答

4

我个人会创建一个名为 tests 的单独包,作为主包的子包,原因有几个:

  • 如果 tests 和根包在同一级,有可能你或者其他用户会错误配置 setup.py,不小心把一个全局包命名为 tests。这样会造成很多困惑和麻烦,直到你意识到发生了什么。把它放在主模块下就能解决这个问题,因为它现在在一个(希望是)全球唯一的命名空间下。

  • 我不喜欢把测试模块放在用户包里,因为测试工具需要在生产代码中查找。这对大多数人来说可能没问题。但如果你是硬件测试工程师,你可能在生产代码中经常使用“测试”这个词,而不想让单元测试工具把这些内容也算进去。如果所有测试都集中在一个地方,和生产代码分开,那就简单多了。

  • 我可以进一步把我的测试文件夹细分为不同类型的测试,比如 unit(单元测试)、functional(功能测试)和 integration(集成测试)。我的功能测试通常依赖一些奇怪的专有硬件、数据,或者运行得比较慢。所以在开发时,我可以很方便地只运行快速的单元测试文件夹。

  • 有时候,把测试放在和被测试内容相同的包结构中也很方便。

总的来说,我认为在考虑大家的建议后,自己思考什么对你特定的问题领域最好是很重要的。“最佳实践”是一个很好的起点,但不是终点,用来发展一个过程。

46

这个示例项目把测试文件放在了模块外面。

它的文件夹结构是这样的:

├── 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的搭车者指南”是一本非常不错的书。)

18

根据《打包指南》,你应该把测试模块放在你要测试的模块里面。

这里有个例子:

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

撰写回答