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

Con*_* Ma 6 python testing doctest pytest tox

我正在添加单元测试和一种“传统”Python 包。一些模块包含嵌入在 docstrings 中的自己的 doctests。我的目标是运行这些文档测试和新的专用单元测试。

下面这个Q&A(“如何让py.test运行文档测试以及正常的测试目录?”)我使用的--doctest-modules选项pytest。当从源存储库运行时,pytest确实从src目录下的 Python 模块中发现了嵌入的 doctests 。

但是,我的目标是测试源发行版是否完全构建和安装,然后针对已安装的包测试所有内容。为此,我正在使用toxwhich 自动构建sdist(源代码分发)tarball 的过程,将其安装在虚拟环境中,并针对已安装的版本运行测试。为了确保它是已安装的版本,而不是源存储库中由测试导入的版本,我遵循本文中的建议存储库现在如下所示:

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
Run Code Online (Sandbox Code Playgroud)

(下面的测试脚本tests将包导入为 in 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 
Run Code Online (Sandbox Code Playgroud)

到目前为止,测试运行良好,并且 doctests 是从 下的模块中提取的src/my_package,而不是从安装在tox虚拟环境中的包中提取的。

我与此设置相关的问题如下:

  • 这真的是一个问题吗?tox似乎确保您安装的是源存储库中的内容,但是是吗?
  • 如何指示pytest以一种干净的方式从已安装的模块实际运行 doctests?我可以想到一些解决方案,例如在doc目录中构建专用文档树,然后pytest使用--doctest-glob选项在其中找到 doctests 。但是有没有一种方法可以在不首先构建文档的情况下做到这一点?

Con*_* Ma 4

我找到了我自己问题的答案。

引用pytest 问题#2042

doctest-modules由于结帐中的模块搜索与来自的模块使用,目前与针对已安装的软件包进行测试从根本上不兼容site-packages

所以到目前为止,解决方案还不存在。