2016-01-21 36 views
4

我想運行一些使用pytest-cov和coveralls.io的Cython代碼的覆蓋率分析。我得儘可能下面的鏈接的幫助下建設有啓用跟蹤的擴展模塊,並運行分析:如何使用覆蓋分析與Cython

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

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

但是,我得到的一些結果我無法解釋。看起來代碼中的許多行都顯示爲未運行,儘管其中的代碼是正確的。由於某些行看起來不錯,結果並不一致。

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

我不知道如果我打電話給做錯事,如果這是一個錯誤,或者如果我只是沒有解釋結果的正確。

coveralls screenshot

在上面的例子中,get_cost方法似乎行,但是對於上述的性質的方法__set__不叫,儘管內已被調用的函數的線。

更新:似乎問題是與Cython類。如果班級的定義爲def而不是cdef,問題就會消失。我想現在還沒有完全支持。

回答

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 

的可執行文件。執行./mainmain.gcdamymod.gcda創建爲gcov

+0

此方法是否以.c而不是.pyx表示覆蓋範圍? – Snorfalorpagus

+0

@Snorfalorpagus作爲一種替代方案,以防在cython追蹤中出現問題。如果使用兩種覆蓋方法,應該可以確定是否按照預期方式進行了網絡跟蹤。在這種情況下編寫錯誤報告可能會很好。 –