pytest:为什么要使用src布局?

时间:2018-10-31 01:36:50

标签: python pytest

我正在遵循pytest文档中所示的 non-src 布局:

setup.py
mypkg/
    ...
tests/
    __init__.py
    foo/
        __init__.py
        test_view.py
    bar/
        __init__.py
        test_view.py

医生说:

  

现在pytest将以tests.foo.test_viewtests.bar.test_view的形式加载模块,从而使您可以使用相同名称的模块。但这现在引入了一个微妙的问题:为了从tests目录中加载测试模块,pytest将存储库的根添加到sys.path中,这增加了现在{{1} }也是可导入的。如果您要使用tox之类的工具在虚拟环境中测试软件包,则会出现问题,因为您要测试软件包的已安装版本,而不是存储库中的本地代码。

     

在这种情况下,强烈建议使用mypkg布局,其中应用程序根软件包位于根目录的子目录中。

但是tox说它将对sdist打包,安装和测试。

这就是我不明白的地方:

  

...因为要测试软件包的已安装版本,而不是存储库中的本地代码,因此需要测试...

我认为在开发过程中的大部分时间里,我们要测试的来自存储库的本地代码。这通常是开发或夜间分支,而不是我们系统上可能安装的稳定分支。

我做了一些实验。我创建了一个软件包src,安装了它的稳定分支,然后在开发分支中修改了一些代码以破坏测试。如果没有将mypkg放在mypkg目录下,则pytest将测试本地代码,因为它可以在本地路径上找到src包,并且测试将中断如预期的那样。但是,如果将mypkg放在mypkg目录下,则pytest会测试已安装的代码,因为它只能在其中找到src,而测试不会应该休息一下。

因此,只有 non-src 布局可以正常工作。即使使用tox,它也可以按预期工作:tox将sdist并将其安装在一个隔离的环境中,该环境不受本地路径中的mypkg的影响。因此,tox确实在测试本地代码,而不是已安装的代码。这就是我们的期望。

鉴于 non-src 布局正常工作,为什么文档会说这是细微的问题强烈建议使用 src 布局?

编辑。没想到这会是debate

0 个答案:

没有答案