我想测试大型软件(特别是 Odoo 插件)中单个软件包的覆盖范围。我无法控制测试的整体设置。在加载模块之前破解 Odoo 来启动覆盖率收集是不值得的——在常规硬件上运行所有 Odoo 测试大约需要 20 分钟;所以我想选择性地测试一些自定义模块的覆盖率。
我在用着setUpModule
and 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__
据报道,方法没有被覆盖,但它的主体却很受欢迎。前 3 行(类定义、其文档字符串和init定义)被报告遗漏。显所有文档字符串(大约占源代码的 10%)被报告丢失。
如何指示覆盖率省略顶级定义并仅计算类或函数(方法)的主体?