Python项目目录结构/ pytest麻烦

时间:2014-11-07 15:21:29

标签: python path pytest

这应该是世界上最简单的问题,但即使经过广泛的搜索和修补,我仍然在找到一个正确的问题时遇到了很大的麻烦。建立目录结构并管理正确运行pytest等的方法。

让我说我有一个名为apple的程序。

|- README.md
|- apple
|   |-- __init__.py
|   |-- apple.py
| - tests
|   |-- test_everything.py

apple.py包含一些功能,例如,我们可以调用一个eat()test_everything.py文件包含一些测试,例如assert eat()=="foobar"。好那么容易,但随后开始有趣:

  • 苹果目录中的__init__.py怎么样?对吗?空或应该在里面?
  • 最佳做法是从根目录中调用py.test吗?或py.test tests
  • 许多项目在他们的测试目录中都有一个__init__.py,但在py.test文档中明确说明这是错误的。那么为什么上帝为什么
  • test_everything.py文件顶部的内容:import applefrom apple import *?或其他完全
  • 您是否按eat()apple.eat()
  • 调用了这些功能
  • 有些人甚至建议在python中操纵os.path.dirname

这应该很简单,但我已经看到了上述的所有组合,甚至没有谈到tox和无数其他工具。但是有一点点错误,你会被抛出一些ImportError: No module named 'apple'或其他一些时髦的错误。

什么是"权利"办法? github等上的建议和现有代码遵循极为不同的约定。对于经验丰富的中档编码器,这应该更容易。

2 个答案:

答案 0 :(得分:15)

  1. 苹果目录中的__init__.py怎么样?对吗?空或应该在里面?
  2. 是的,没错。最常见的是空洞。如果您将foo = 42放入其中,则可以稍后执行from apple import foo,如果您将from apple.apple import foo放入apple.py,则需要__init__.py。虽然看起来很方便,但你应该谨慎使用它。

    1. 最好从根目录调用py.test吗?还是py.test测试?
    2. py.test应该能够找到你的测试,但请看下面..

      1. 许多项目在他们的测试目录中都有一个tests/conftest.py,但在py.test文档中明确说明这是错误的。那么为什么上帝为什么
      2. 因此,您可以在提供常见测试功能的测试中导入文件。在py.test中,通过在名为from apple import apple的文件中创建夹具可以更好地实现。

        1. test_everything.py文件顶部的内容是:导入苹果还是来自apple import *?或其他完全
        2. apple.eat()

          1. 你是通过eat()还是apple.eat()调用函数?
          2. README.md

            1. 有些人甚至建议在python
            2. 中操作os.path.dirname

              这似乎非常脆弱。我建议

              (a)将环境变量PYTHONPATH设置为指向README.md或更好的文件夹

              (b)创建一个setup.py文件(与from setuptools import setup setup(name='apple', packages=['apple']) 文件处于同一级别),这里只是最小的一个:

              python setup.py develop
              

              像这样运行文件:

              apple

              现在no module named apple全局可用,您再也不应该看到setup.py问题,即您可以从根文件夹或测试文件夹运行py.test。

              您可以在https://python-packaging-user-guide.readthedocs.org/en/latest/index.html

              的Python包装用户指南中阅读有关{{1}}的更多信息

答案 1 :(得分:2)

我安排了一个有效here的例子。

我认为将模块 apple命名为混淆,这可能是混淆的一个原因。 IMO唯一不明显的部分是,如果您没有使用正确的PYTHONPATH distutils软件包来安装setup.py软件包,则必须将apple设置为当前目录。