如何让pytest在已安装的模块中发现并运行doctests?

时间:2018-03-13 11:16:11

标签: python testing pytest doctest tox

我正在添加单元测试和一种“遗留”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。但是,有没有一种方法可以在不首先构建文档的情况下执行此操作?

3 个答案:

答案 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布局时,这不应该成为问题,因为测试通常不会分散在存储库中。