代码覆盖率和三元运算符

ale*_*cxe 10 python testing code-coverage coverage.py pytest

考虑我们有这个被测函数位于module.py

def f(a, b):
    return (a - b) if a > b else 1 / 0
Run Code Online (Sandbox Code Playgroud)

并且,我们有以下测试用例test_module.py

from unittest import TestCase

from module import f


class ModuleTestCase(TestCase):
    def test_a_greater_than_b(self):
        self.assertEqual(f(10, 5), 5)
Run Code Online (Sandbox Code Playgroud)

如果我们pytest使用启用的“分支覆盖”和 HTML 输出报告运行测试:

pytest test_module.py --cov=. --cov-branch --cov-report html
Run Code Online (Sandbox Code Playgroud)

该报告将声称 100% 的分支覆盖率涵盖所有“部分”分支

在此处输入图片说明

但是,我们显然根本没有涵盖该else 1 / 0部分。

有没有办法改进报告以查看三元运算符未涵盖的部分?

Ned*_*der 10

分支覆盖率只能测量从一行到另一行的分支,因为 Python 的跟踪工具目前仅支持每行跟踪。Python 3.7 引入了一些字节码级别的跟踪,但需要大量工作才能使用它。

https://github.com/nedbat/coveragepy/issues/509是一个关于此的问题。