代码覆盖范围不包括动态导入的包/模块

时间:2015-11-14 10:30:33

标签: python code-coverage nose coverage.py test-coverage

我使用以下命令运行测试:

nosetests --with-coverage --cover-html --cover-package mypackage

我希望更新覆盖率报告,即使开发人员将新的未经测试的代码添加到包中。

例如,假设开发人员向程序包添加了一个新模块,但忘记为其编写测试。由于测试可能无法导入新模块,因此代码覆盖率可能无法反映未覆盖的代码。显然,这是在代码审查阶段可以预防的事情,但是甚至可以更早地抓住它。

我的解决方案是编写一个简单的测试,动态导入顶级包下的所有模块。我使用以下代码片段来执行此操作:

import os
import pkgutil

for loader, name, is_pkg in pkgutil.walk_packages([pkg_dirname]):
    mod = loader.find_module(name).load_module(name)

动态导入这样的子包和子模块不会被nose中的代码覆盖率插件拾取。

有人能建议更好的方法来实现这类事吗?

1 个答案:

答案 0 :(得分:0)

问题似乎是在顶级包下动态导入所有包/模块的方法。

使用定义的方法here似乎有效。关键区别在于使用... ageChart.AddSeries( chartType: "column", xValue: data.Select(person => person.Age), yValues: data.Select(person => person.Date)); 而不是importlib。但是,pkgutil是在python 2.7和3.1中引入的,所以这个解决方案不适合旧版本的python。

我已将原始代码段更新为使用importlib而非__import__方法。这似乎也可以解决问题。

ImpLoader.load_module