我想使用一些用Python编写的(单元)测试来获取Cython模块的覆盖率信息。我现在所掌握的是测试本身,即通过运行py.test执行测试的哪几行。虽然看起来不错,但我更希望覆盖.pyx文件,即我的测试涵盖了C / Python接口(interface)的哪些行。

我已经找到了一些信息,但无法使其在我的项目中运行:

http://blog.behnel.de/posts/coverage-analysis-for-cython-modules.html

https://medium.com/@dfdeshom/better-test-coverage-workflow-for-cython-modules-631615eb197a

How to use coverage analysis with Cython

这是有问题的代码:https://github.com/SCIP-Interfaces/PySCIPOpt/tree/coverage

最佳答案

这里的当前答案包括两个部分:

  • pytest配置
  • coverage.py配置

  • 让我们从pytest配置开始。当前,在coverage分支上,存在带有以下行的.travis.yml文件:py.test --cov tests,它告诉pytest-cov向您显示tests目录的覆盖范围,您不需要。
    您可以改为运行py.test tests --cov或更改setup.cfg,而完全不传递tests

    然后,您将获得setup.cfg文件,其中包含:
    [tool:pytest]
    testpaths =
        tests
    

    .coverage文件中,您需要:
    [run]
    plugins = Cython.Coverage
    source = src/pyscipopt
    omit =
        tests
        *__init__.py
    

    单独指定paths已过时,我已将其删除。这样coverage.py知道应该只检查src/pyscipopt目录的覆盖范围。

    这些更改之后,我得到的输出是:
    ---------- coverage: platform darwin, python 3.6.4-final-0 -----------
    Name                          Stmts   Miss Branch BrPart  Cover
    ---------------------------------------------------------------
    src/pyscipopt/Multidict.py       17     17     10      0     0%
    src/pyscipopt/conshdlr.pxi      301    129      0      0    57%
    src/pyscipopt/expr.pxi          168     57      0      0    66%
    src/pyscipopt/heuristic.pxi      44     18      0      0    59%
    src/pyscipopt/lp.pxi            235    177      0      0    25%
    src/pyscipopt/pricer.pxi         52     24      0      0    54%
    ---------------------------------------------------------------
    TOTAL                           817    422     10      0    48%
    

    这看起来像您想要的正确输出,但是我确实看到scip.pyx文件丢失了。您还可以查看related issue on github。我不会做进一步的调查,因为它回答了您的问题,我想您将可以在这里找到所有遗失的东西。

    关于python - 使用py.test和coverage.py覆盖Cython模块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48505458/

    10-13 00:44