如何使用覆盖率对sphinxdoc扩展进行单元测试(在PyCharm中)?

2024-10-02 20:32:07 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我写了很多sphinxdoc扩展,例如这个(作为一个例子,因为它是最简单的一个):

from docutils import nodes
from docutils.statemachine import StringList
from sphinx.util.compat import Directive

class SvnRevisionDirective(Directive):
    """Directive to display subversion revision of the path.
    """
    has_content = True
    required_arguments = 1
    optional_arguments = 1
    final_argument_whitespace = False
    option_spec = {}

    def run(self):
        path = self.arguments[0]
        # rev = svntools.Revision(path)
        rev = 42
        paragraph = nodes.paragraph()
        self.state.nested_parse(
            StringList([
                '**Revision:** r%d' % rev
            ]), 0, paragraph)
        return [paragraph]

def setup(app):
    """Directive framework code.
    """
    app.add_directive('svnrevision', SvnRevisionDirective)

在将扩展的路径添加到文档的conf.py中的extensions后,可以使用如下方式:

^{pr2}$

并将产生:

修订版:r42

为了测试它是否正常工作,我可以创建一个tests/testproj目录,并用docs目录、conf.py文件和包含该指令的index.rst文件填充,并使用:

import os
import pytest
DIRNAME = os.path.dirname(__file__)

@pytest.mark.django_db
def test_svnrevision(monkeypatch):
    testprojdir = os.path.join(DIRNAME, 'testproj')
    monkeypatch.setenv('PYTHONPATH', testprojdir, os.pathsep)
    monkeypatch.setenv('DJANGO_SETTINGS_MODULE', 'testingapp.settings')
    monkeypatch.chdir(DIRNAME)
    cmd = 'sphinx-build -bhtml -a -E testproj/docs testproj/build'
    os.system(cmd)

但是这使得测试和代码之间有很大的距离,并且不能提供代码覆盖范围,至少在PyCharm下运行时没有。在

我想要更直接的,类似于:

def test_svnrevision():
    rst = """
        .. svnrevision:: mypackage/__init__.py
    """
    svndirective = SvnRevisionDirective(...., rst, ...)
    result = svndirective.run()
    assert result.___ == '**Revision:** 42'

这可能吗?在


Tags: pathfromimportselfosdefrevrevision
1条回答
网友
1楼 · 发布于 2024-10-02 20:32:07

如果您使用的是unittest或nose,那么可以尝试使用sphinx-testing模块,这在PyPI上是可用的。在

{基于py的单元测试}。在

从sphinx1.6.1开始,您可以使用pytest插件sphinx.testing.fixtures,如{a3}所述。虽然这个特性还处于试验阶段,但与下面描述的另一个相比,它似乎是更好的选择。在

对于Sphinx<;=1.6.0的pytest测试,无法直接重用Sphinx测试夹具。您可以尝试将contest.pypath.pyutil.py文件从^{} directory复制到您自己的项目中,并对util.py文件进行一点修改,使其在没有自定义sphinx runner(run.py文件)的情况下正常工作:

+# code from run.py
+testroot = os.path.dirname(__file__) or '.'
+# find a temp dir for testing and clean it up now
+os.environ['SPHINX_TEST_TEMPDIR'] = \
+    os.path.abspath(os.path.join(testroot, 'build')) \
+    if 'SPHINX_TEST_TEMPDIR' not in os.environ \
+    else os.path.abspath(os.environ['SPHINX_TEST_TEMPDIR'])
+
 rootdir = path(os.path.dirname(__file__) or '.').abspath()
 tempdir = path(os.environ['SPHINX_TEST_TEMPDIR']).abspath()

+# code from run.py
+print('Temporary files will be placed in %s.' % tempdir)
+if tempdir.exists():
+    tempdir.rmtree()
+tempdir.makedirs()
+

然后,您可以按照Sphinx单元测试中看到的相同方式编写单元测试。在

相关问题 更多 >