Coverage.py/Cython - 无法使用unittest

时间:2016-04-01 23:40:15

标签: python cython coverage.py python-coverage

我有一个项目,在Cython库中有一个模型和其他组件。我已经创建了单元测试并且可以通过覆盖范围运行那些正常但我只获得测试代码本身的覆盖信息(而不是测试代码所调用的库)。我试图在coverage中使用调试跟踪操作,但它没有显示任何读取任何库代码的尝试(我没有获取跟踪或不跟踪的条目)。我有linetrace,CYTHON_TRACE = 1,并且Cython.coverage插件的.coveragerc项全部打开。我试图将model.c代码复制到\但这似乎没有帮助。

这是(部分)项目结构:

\model.pyd
\setup.py
\src\models\windows\model.pyx
\src\models\windows\model.c
\src\models\submodel.pxi
\tests\models\test_model.py

windows \ model.pyx中的代码包含来自\ src \ models的许多独立于平台的代码片段,如下所示:

include '..\\submodel.pxi'

setup.py从\ _和

运行
python setup.py build_ext --inplace

看起来像这样:

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
from Cython.Compiler.Options import directive_defaults

import numpy

# Needed for line_profiler - disable for production code
directive_defaults['linetrace'] = True
directive_defaults['binding'] = True

setup(
  ext_modules = cythonize([
    Extension("model",
              ["src\models\windows\model.pyx"]
              #,extra_compile_args = ["-O3"]
              # CYTHON_TRACE required for coverage and line_profiler.  Remove for release.
              ,define_macros=[('CYTHON_TRACE', '1')] 
              )
    ] )
)

单元测试从运行

coverage run -m unittest discover

这是覆盖率报告输出(启用了插件调试)。 test_model在model.pyx和submodel.pxi中运行了很多代码,这里没有报告:

Loaded plugin 'Cython.Coverage': <Cython.Coverage.Plugin object at 0x02F2AA30>
Name                     Stmts   Miss  Cover
--------------------------------------------
test_model.py               40      1    98%
--------------------------------------------
TOTAL                       40      1    98%

每个单元测试都以此代码段开头,从更高的目录中提取pyd文件:

sys.path.append('..\\..\\')
from model import Model
...

我确定这与项目结构有关,我不介意将源文件复制到测试目录中以加载测试工具,但我无法找出正确的组合来制作那发生了。欢迎大家帮忙。

1 个答案:

答案 0 :(得分:2)

当然,在我写完之后,答案基本就是粗心。

修改setup.py不会自动重新编译C代码,并且C代码中没有CYTHON_TRACE=1更新。一旦我删除了所有的C / pyd文件并重新使用它setup.py

如果调试跟踪显示它不包含模块,那将是有帮助的,因为它没有跟踪到pyx / C文件的能力,因为它们没有被检测。