使用py.test和coverage.py进行Cython模块的覆盖率测试

19
我想使用一些用Python编写的(单元)测试来获取Cython模块的覆盖率信息。目前我只能得到测试本身的覆盖率,即通过运行py.test执行了哪些测试行。虽然看起来很好,但我更想得到.pyx文件的覆盖率,即我的测试覆盖了哪些C/Python接口的行。我已经找到了一些信息,但无法在我的项目中运行它。

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

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

如何使用Cython进行覆盖率分析

以下是相关代码: https://github.com/SCIP-Interfaces/PySCIPOpt/tree/coverage


4
很希望能看到一个最简单的例子:包括Cython函数、单元测试、设置文件、扩展安装方式和测试运行方法。"无法运行" 可以有很多含义。请注意不要改变原意。 - ead
1个回答

13

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

  • 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 文件不见了。您也可以查看 GitHub 上的相关问题。我不会进一步调查,因为它回答了您的问题,我认为您将能够根据缺失的内容继续前进。


不幸的是,我不得不将代码恢复到之前的状态(仅覆盖测试),因为我无法为codecov生成XML报告。虽然如此,我确实获得了相同的表格,显示不同.pxi文件的覆盖结果。https://github.com/SCIP-Interfaces/PySCIPOpt/pull/128 - mattmilten
你有收到任何错误信息吗?还是它就是不工作?这很奇怪,它在这个阶段应该是可以正常工作的。 - Ania Warzecha
是的,我从Cython/Coverage.py中得到了这个错误:TypeError: 'NoneType' object is not iterable。你能否在使用py.test --cov生成覆盖率报告后立即运行coverage xml?如果我运行py.test --cov --cov-report xml,我也会得到相同的错误。 - mattmilten
我并没有真正尝试过那个。你可以尝试使用 py.test --cov --junitxml=C:\path\to\out_report.xml - Ania Warzecha
我刚刚尝试了一下,但是似乎codecov无法处理这些xml文件。它抱怨在报告中找不到任何文件,尽管已经上传了coverage.xml文件。 - mattmilten
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接