【问题标题】:How to use coverage analysis with Cython如何使用 Cython 进行覆盖分析
【发布时间】:2016-06-14 07:04:38
【问题描述】:

我正在尝试使用 pytest-cov 和 coveralls.io 对一些 Cython 代码运行覆盖率分析。我已经构建了启用跟踪的扩展模块,并在以下链接的帮助下运行了分析:

http://docs.cython.org/src/tutorial/profiling_tutorial.html

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

但是,我得到了一些我无法解释的结果。尽管代码中的代码正常,但代码中的许多 def/cdef/cpdef 行似乎都显示为未运行。结果甚至不一致,因为有些行看起来不错。

示例报告:https://coveralls.io/files/1871744040

我不知道我是否说错了什么,这是否是一个错误,或者我只是没有正确解释结果。

在上面的例子中,get_cost 方法看起来没问题,但是上面属性的 __set__ 方法没有被调用,尽管函数中的行已经被调用了。

更新:似乎问题出在 Cython 类上。如果该类是用def 而不是cdef 定义的,那么问题就消失了。我想目前还没有完全支持。

【问题讨论】:

  • 为仍在研究此问题的人提供的更新:正在讨论的 Cython 问题是here

标签: code-coverage cython


【解决方案1】:

如果 Cython 跟踪工具似乎没有按预期工作,应该可以使用 gcov 进行 cython 代码的覆盖率分析。这样就可以验证生成的 C 代码的某行是否被执行。

用一个简单的main.pyx

import mymod

def main():
    mymod.test()

mymod.pyx

def test():
    return 42

然后

cython --embed main.pyx
cython mymod.pyx

gcc -O1 -fPIC -fprofile-arcs -ftest-coverage -Wall -I/usr/include/python2.7 -c -o main.o main.c
gcc main.o -fprofile-arcs -lpython2.7 -lgcov -o main
gcc -O1 -fPIC -fprofile-arcs -ftest-coverage -Wall -I/usr/include/python2.7 -c -o mymod.o mymod.c
gcc -shared mymod.o -fprofile-arcs -lgcov -lpython2.7 -o mymod.so

创建了一个可执行文件。执行./main 后,main.gcdamymod.gcdagcov 创建。

【讨论】:

  • 此方法是否以 .c 而不是 .pyx 的形式呈现覆盖范围?
  • @Snorfalorpagus 作为替代方案,以防 cython 跟踪似乎有问题。如果使用了两种覆盖方法,则应该可以确定 cython 跟踪是否未按预期工作。在这种情况下,编写错误报告可能会很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-02
  • 2018-10-04
  • 1970-01-01
  • 2010-12-29
  • 2021-08-22
  • 1970-01-01
相关资源
最近更新 更多