我有一个项目,其中有一个模型和其他组件,每个组件都位于 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/