代码覆盖率和三元运算符

11

假设有一个位于 module.py 中的待测试函数:

def f(a, b):
    return (a - b) if a > b else 1 / 0

同时,我们在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)

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

pytest test_module.py --cov=. --cov-branch --cov-report html

这份报告声称覆盖了100%的分支,并且所有“部分”分支都已经覆盖:

enter image description here

但是,很明显我们根本没有涉及到else 1 / 0部分。

有没有一种改进报告的方法可以查看三元运算符中未被覆盖的部分?


3
与关键字版本不同,if/else 的运算符版本不是控制结构而是布尔运算。实际的控制结构隐藏在操作的实现中,超出了覆盖范围的视线之外。我认为将其实现到 coverage 包中是一个好主意。 - Klaus D.
1个回答

14

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

https://github.com/nedbat/coveragepy/issues/509 是与此相关的问题。


既然Python 3.7已经发布预览版,那么引用的问题不应该重新打开吗?(我问这个问题是因为我看到你是维护者)。另外,“打开”并不等于“立即解决”,但这肯定是一个重要的功能,对吧? - Axel
1
最好在问题页面上讨论问题,不是吗? - Ned Batchelder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接