我正在添加单元测试和一种“遗留”Python包。一些模块包含嵌入在docstrings中的自己的doctests。我的目标是运行这些doctests和新的专用单元测试。
关注this Q&A(“如何运行py.test运行doctests以及普通测试目录?”)我正在使用pytest
选项pytest
。从源存储库运行时,src
确实从tox
目录下的Python模块中发现了嵌入式doctests。
但是,我的目标是测试源代码分发的构建和安装,然后根据安装的包测试所有内容。为此,我使用sdist
自动执行构建repo/
src/
my_package/
__init__.py
module_a.py
module_b.py
...
tests/
test_this.py
test_that.py
requirements.txt
setup.py
tox.ini
(源代码分发)tarball,在虚拟环境中安装以及针对已安装版本运行测试的过程。为了确保它是安装的版本而不是源测试库中导入的版本,我遵循建议--doctest-modules
,存储库现在看起来像这样:
tests
(import my_package
下的测试脚本导入了src/my_package
中的软件包,这会触及已安装的版本,因为存储库布局确保tox
目录不在模块搜索中路径。)
在[tox]
envlist = py27,py36,coverage-report
[testenv]
deps =
-rrequirements.txt
commands =
coverage run -p -m pytest --
[pytest]
addopts = --doctest-modules
配置文件中,相关部分看起来像
src/my_package
到目前为止,测试运行正常,并且从tox
下的模块中获取了文档测试,而不是从tox
虚拟环境中安装的软件包中获取。
我对此设置的疑问如下:
pytest
似乎确保您安装的内容就是您在源存储库中所拥有的内容,但确实如此?doc
以一种干净的方式从已安装的模块中实际运行doctests?我可以想到一些解决方案,例如在pytest
目录中构建专用文档树,并让--doctest-glob
使用{{1}}选项找到其中的doctests。但是,有没有一种方法可以在不首先构建文档的情况下执行此操作?答案 0 :(得分:0)
pytest
从当前目录收集测试(除非您指示它传递显式目录)。使用tox.ini
中的tox substitutions添加安装目录。即,要么通过目录:
[testenv]
deps =
-rrequirements.txt
commands =
coverage run -p -m pytest {envsitepackagesdir}/my_package
或更改目录:
[testenv]
changedir = {envsitepackagesdir}/my_package
deps =
-rrequirements.txt
commands =
coverage run -p -m pytest --
答案 1 :(得分:0)
我找到了自己问题的答案。
引用pytest
issue #2042:
目前
doctest-modules
从根本上与测试不兼容 因结帐对模块中的模块搜索而导致已安装的软件包 使用site-packages
截至目前,该解决方案尚不存在。
答案 2 :(得分:0)
这是我解决导入不匹配的方法:
$ pytest tests/ --doctest-modules --pyargs myrootpkg <other args>
这里的问题是,一旦您开始明确指定源路径(在这种情况下,通过--pyargs
),就必须同时将所有其他源路径(在本示例中为tests/
)指定为{{ 1}}将停止扫描rootdir。不过,在使用pytest
布局时,这不应该成为问题,因为测试通常不会分散在存储库中。