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

Sno*_*gus 6 code-coverage cython

我正在尝试使用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问题消失了.我想还没有完全支持.

J.J*_*ala 2

如果 Cython 跟踪工具似乎未按预期工作,则应该可以将其用于gcovcython 代码的覆盖率分析。通过这种方式,我们可以验证生成的 C 代码的某一行是否被执行。

用一个简单的main.pyx

import mymod

def main():
    mymod.test()
Run Code Online (Sandbox Code Playgroud)

mymod.pyx

def test():
    return 42
Run Code Online (Sandbox Code Playgroud)

进而

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
Run Code Online (Sandbox Code Playgroud)

创建了一个可执行文件。执行./main main.gcda后,为gcov创建了mymod.gcda