代码覆盖率vs测试覆盖率: 主体性和有用性

令人惊讶的是,有很多人认为代码覆盖率和测试覆盖率是同一回事。我不知道这种混乱的根源是什么,但是由于人们在互联网上搜寻,似乎是人们面临的一个普遍挑战,人们可能在潜意识中交替地在代码覆盖率和测试覆盖率之间切换。他们不一样。让我用我儿子的玩具之一来解释……

我的儿子安格斯(Angus)拥有他已经有一段时间的推/走玩具。这确实帮助他获得了平衡-他在17个月大的时候就自信地以最快的速度奔跑,这无疑是因为这种推式玩具帮助了他。

无论如何……推式玩具的顶部和侧面都切出了一些异形的孔,并在孔中装有积木。他喜欢这个玩具,过去几个月他看着他玩这个玩具,我意识到它为我提供了一个完美的例子,可以解释代码覆盖率和测试覆盖率之间的差异和主观性。

玩具

这是安格斯玩具的照片:

image

安格斯(Angus)的块状推力玩具可插入孔中

 

从图片中您可以看到红色矩形块。红色方块适合玩具侧面的矩形孔。

使用这个玩具作为类比,如果我们将矩形孔看作与代表要素的代码有关,红色方框代表用户可以输入的与该特定要素有关的数据,则将方框推入该孔将基本上覆盖该代码。可以将其视为100%的代码覆盖率。我们已经将块推入了孔,因此我们已经执行了该功能代码的100%。

但是,如果我们仔细观察一下该块,您会发现实际上有16种不同的方法可以使该块穿过相同的孔。

 

插入块的16种不同方式

image

红色方块的6个边缘…

 

该块有6面,我已在上图中标记了这些面。砌块可以通过多种方式从两侧插入其孔中:

  • 顶面朝上:
    • 边缘1侧插入孔中
    • 边缘2侧插入孔中
    • 边缘3侧插入孔中
    • 边缘4侧插入孔中
  • 底面朝上:
    • 边缘1侧插入孔中
    • 边缘2侧插入孔中
    • 边缘3侧插入孔中
    • 边缘4侧插入孔中

但是除此之外,该块也可以通过以下两种方式分别通过两个方向传递:

  • 外入(意味着您将积木推入孔中,使其降落在玩具内)
  • 由内而外(意味着您将手伸入玩具中,并将积木推入孔中,使积木落在玩具的地板上)。

 

这给了我们总共16种不同的方式,您可以将砌块穿过其制造的孔。

因此,就测试而言,目前有16个已知测试,这意味着我们上面提到的单个初始测试可能会给我们带来100%的代码覆盖率,而实际上只有6.25%的测试覆盖率。

这是这次测试覆盖率的另一个问题:测试覆盖率百分比仅与您已知的测试思路有关到目前为止,我们已经考虑了16个测试,因此您可能会认为运行所有16个已知测试可以为我们提供100%的测试覆盖率……但是不可避免地,还有更多我们尚未想到的测试。

 

以玩具为例。它具有其他形状的孔。并且其中一些其他形状也可以通过先前的矩形孔安装。也从多个方面……

 

image

玩具顶部的立方体孔

 

看到玩具顶部的方孔了吗?装配在该方孔中的立方体块也可插入矩形孔中。该立方体块意味着还有另外48种可能的方法可以使第二个块穿过矩形孔。

您可以清楚地看到,覆盖率百分比指标在此极为主观,并且会根据明确知道的信息及时地完全依赖该快照。实际上,他们并没有告诉您有关软件质量或测试质量的任何信息。

如果您和我分别在相同的时间,相同的时间段内测试完全相同的功能,那么我们的测试覆盖率数字很可能会有所不同,因为我们将考虑并发现不同的测试思路,并且由于我们过去的经验,信念和偏见不同,他们都将对我们没有想到的其他未知测试想法不了解。

如果偶然,我们确实得到了相同的覆盖率数字,那绝对不意味着我们的测试是相同的–我们的测试将完全不同。这种情况只会进一步混淆问题和主观性,并且很好地再次强调了覆盖率指标不能告诉我们应用程序的质量或测试的质量,甚至不能告诉我们所测试的内容。

 

代码覆盖有一件事是有用的

 

代码覆盖是很有用的-它告诉你应用程序的哪些区域根本没有被任何断言测试覆盖。这是一种风险,是在邀请人们去调查那些未经测试的领域。

因此百分比可能不重要,但是关于哪些代码根本没有被执行的信息是一个有用的启发。

您使用代码覆盖率和测试覆盖率度量吗?你是如何使用它们的?我很乐意听到更多关于“为什么”或“为什么不”,以及你是否觉得它们有价值的内容。请在下方留言!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值