Python 使用py.test和Coverage.py覆盖Cython模块

Python 使用py.test和Coverage.py覆盖Cython模块,python,code-coverage,cython,coverage.py,Python,Code Coverage,Cython,Coverage.py,我想使用一些用Python编写的(单元)测试来获取Cython模块的覆盖率信息。我现在看到的是测试本身的覆盖范围,即运行py.test执行哪些测试行。虽然看起来不错,但我更愿意了解.pyx文件的内容,也就是说,我的测试涵盖了C/Python接口的哪些行 我已经找到一些信息,但无法为我的项目运行: 这是问题代码:这里的当前答案有两部分: pytest配置 coverage.py配置 让我们从pytest配置开始。当前在您的coverage分支上有一个.travis.yml文件,该文件有以

我想使用一些用Python编写的(单元)测试来获取Cython模块的覆盖率信息。我现在看到的是测试本身的覆盖范围,即运行
py.test
执行哪些测试行。虽然看起来不错,但我更愿意了解
.pyx
文件的内容,也就是说,我的测试涵盖了C/Python接口的哪些行

我已经找到一些信息,但无法为我的项目运行:


这是问题代码:

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

  • pytest配置
  • coverage.py配置
让我们从pytest配置开始。当前在您的
coverage
分支上有一个
.travis.yml
文件,该文件有以下行:
py.test--cov tests
,它告诉pytest cov显示您不想要的
tests
目录的覆盖范围。 您可以运行
py.test测试--cov
,也可以更改
setup.cfg
而根本不通过
测试

然后,您将拥有
setup.cfg
文件,其中包含:

[tool:pytest]
testpaths = 
    tests
.coverage
文件中,您需要:

[run]
plugins = Cython.Coverage
source = src/pyscipopt
omit =
    tests
    *__init__.py
单独指定
路径
已过时,我已将其删除。这样
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
文件。你也可以看一本书。我不打算进一步调查,因为它回答了您的问题,我认为您可以从这里开始了解缺少的任何内容。

最好看一个简单的示例:cython函数、单元测试、您的安装文件、您安装扩展的方式以及您如何运行测试。“无法让它运行”可能意味着很多事情。幸运的是,我不得不将代码恢复到以前的状态(仅包括测试),因为我无法为codecov生成XML报告。不过,我确实得到了相同的表,其中显示了不同的.pxi文件的覆盖率结果。你有没有收到任何错误,或者它就是不起作用?这太奇怪了,在这个阶段它应该可以正常工作。是的,我得到了这个错误:
TypeError:“NoneType”对象在
Cython/Coverage.py中是不可编辑的。您是否能够在使用
py.test--cov
生成覆盖率报告后立即运行
coverage xml
?如果我运行
py.test--cov--cov report xml
,我也会遇到同样的错误。您可以尝试使用
py.test--cov--junitxml=C:\path\to\out\u report.xml
我刚才试过,但codecov似乎无法处理这些xml文件。它抱怨说,尽管上传了
coverage.xml
,但在报告中没有找到任何文件。