我想测试大型软件(特别是Odoo插件)中单个软件包的覆盖范围。我无法控制测试的总体设置。在加载模块之前,对Odoo进行黑客攻击以启动coverage收集是不值得的-在常规硬件上运行所有Odoo测试大约需要20分钟;所以我想选择性地测试一些自定义模块的覆盖范围。
我正在这样使用setUpModule
和tearDownModule
:
_coverage = Coverage(
source=[
'odoo.addons.xhg_autrement_prices.models',
],
config_file=_join('.coveragerc'),
auto_data=True,
data_file=_join('.coverage'),
)
def setUpModule():
_coverage.start()
def tearDownModule():
from test.support import captured_stderr
_coverage.stop()
_coverage.save()
with captured_stderr() as stderr:
total = _coverage.report(skip_covered=True, file=sys.stderr)
report = stderr.getvalue()
fail_under = _coverage.get_option('report:fail_under')
assert not fail_under or total >= fail_under, \
f"Coverage not reached. total: {total}; expected: {fail_under}\n{report}"
但是,当测试设备调用setUpModule
时,Odoo已经加载了被测模型模块。
因此,coverage.py将定义某些函数(或类)的行报告为未命中。例如,在以下类别中:
class SumAggregator(SimpleAggregator):
'''Aggregate by sum.'''
def __init__(self, start: Result = 0) -> None:
self.start = start
def __call__(self, results: Iterable[Result], env: Environment) -> Result:
return sum(results, self.start)
报告了定义__call__
方法的行未覆盖,但其内容被点击。报告缺少前三行(类定义,其文档字符串和 init 定义)。据报告所有文档字符串(约占源代码的10%)被遗漏了。
如何指示覆盖范围省略顶级定义并仅计算类或函数(方法)的主体?