我正在遵循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_view
和tests.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。