CYTHON:生成pyx文件的覆盖范围

时间:2018-06-21 11:19:18

标签: code-coverage cython

我正在尝试为cython模块生成代码覆盖率报告,这是一个面临的问题。

我有一个简单的c ++代码:apple.h和 apple.cpp 文件。 cpp文件很简单:

using namespace std;
namespace mango {
    apple::apple(int key) {
            _key = key;
    };
    int apple::execute()
    {
            return _key*_key;
    };
}

我已经在“ cyApple.pyx ”中为此编写了一个基本的cython代码:

# cython: linetrace=True
from libcpp.list cimport list as clist
from libcpp.string cimport string
from libc.stdlib cimport malloc

cdef extern from "apple.h" namespace "mango" :
    cdef cppclass apple:
            apple(int)
            int execute()
cdef class pyApple:
    cdef apple* aa
    def __init__(self, number):
            self.aa = new apple(number)

    def  getSquare(self):
            return self.aa.execute()

我的 setup.py 文件:

from distutils.core import setup, Extension
from Cython.Build import cythonize

compiler_directives = {}
define_macros = []

compiler_directives['profile'] = True
compiler_directives['linetrace'] = True
define_macros.append(('CYTHON_TRACE', '1'))

setup(ext_modules = cythonize(Extension(
       "cyApple",
       sources=["cyApple.pyx", "apple.cpp"],
       define_macros=define_macros,
       language="c++",
  ), compiler_directives=compiler_directives))

这会生成一个适当的库 cyApple.so 。 我还编写了一个简单的 appletest.py 文件来运行测试用例:

import cyApple, unittest
class APPLETests(unittest.TestCase):
    def test1(self):
            temp = 5
            apple1 = cyApple.pyApple(temp)
            self.assertEqual(25, apple1.getSquare())
suite = unittest.TestLoader().loadTestsFromTestCase(APPLETests)
unittest.TextTestRunner(verbosity=3).run(suite)

测试正常。 问题是我需要获取有关cyApple.pyx文件的代码

当我运行“覆盖率报告-m”时 我只得到测试文件而不是pyx文件的错误和覆盖率。

cyApple.pyx   NotPython: Couldn't parse '/home/final/cyApple.pyx' as Python source: 'invalid syntax' at line 2
Name           Stmts   Miss  Cover   Missing
--------------------------------------------
appletest.py       8      1    88%   9

我试图上网查找并获得帮助,所以我添加了
.coveragerc 文件,其内容为:

[run]
plugins = Cython.Coverage

运行“ coverage运行appletest.py ”时出现错误:

...
... 
...
ImportError: No module named Coverage

我想为我的pyx文件生成简单的代码覆盖率报告。我如何以一种简单的方式做到这一点?

我重新安装了Cython-0.28.3。 现在运行“ coverage run appletest.py”  我收到错误消息:

test1 (__main__.APPLETests) ... Segmentation fault (core dumped)

这是我的 apple.h 文件:

#include<iostream>
namespace mango {
class apple {
public:

    apple(int key);
    int execute();
private:
    int _key;
};
}

1 个答案:

答案 0 :(得分:1)

您必须更新Cython。 documentation指出:

  

自Cython 0.23起,行跟踪(请参见上文)也支持   使用coverage.py工具进行覆盖率报告。