如何指导覆盖率.py省略顶层定义,只计算方法的主体?

2024-04-23 11:55:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我想测试一个软件包在大量软件(特别是Odoo插件)中的覆盖率。我无法控制测试的整体设置。在加载模块之前对Odoo进行黑客攻击以启动覆盖率收集是不值得的——在常规硬件上运行所有Odoo测试大约需要20分钟;因此我想有选择地测试一些定制模块的覆盖率。你知道吗

我是这样使用setUpModuletearDownModule

_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加载。你知道吗

所以,覆盖率.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行(类定义、其docstring和init定义)报告丢失。值得注意的是,所有docstring(约占源代码的10%)都报告丢失。你知道吗

如何指示coverage忽略顶级定义而只计算类或函数(方法)的主体?你知道吗


Tags: 模块odooselfreport定义defstderrcoverage