python - Coverage.py/Cython - 无法使用单元测试追踪复杂项目中的 Cython 库

标签 python cython coverage.py python-coverage

我有一个项目,其中有一个模型和其他组件,每个组件都位于 Cython 库中。我已经创建了单元测试,并且可以通过覆盖率很好地运行这些测试,但我只获得测试代码本身的覆盖率信息(而不是测试代码调用的库)。我尝试在覆盖范围中使用调试跟踪操作,但它没有显示任何读取任何库代码的尝试(我没有得到“跟踪”或“不跟踪”的条目)。我已经打开了 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')] 
              )
    ] )
)

unittests 从\tests\models 运行

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
...

我确信这与项目结构有关,我不介意将源文件复制到测试目录中以加载测试工具,但我不太清楚要制作的正确组合那会发生。欢迎所有帮助。

最佳答案

当然,在我把它全部写完之后,答案是基本的粗心。

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

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

关于python - Coverage.py/Cython - 无法使用单元测试追踪复杂项目中的 Cython 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36367494/

相关文章:

python - super() 在 Python 3 中究竟返回什么?

python - 在python中使用未指定的加密 key 解码加密文本

python - Cython header 指令和 __future__

linux - 如何为 Gitlab 配置 Python coverage.pl 报告

python - 通过 Travis-CI 在测试目录上运行覆盖

pytest - 分析 numba 包装函数的覆盖范围

Python 多处理 : no performance gain with multiple processes

python - Python 的内置打印为什么/如何允许 ">>"运算符?

python - 在 64 位 Windows 上让 cython 与 Enthought Canopy 配合使用的官方方法是什么?

Cython:链接到库和调用函数