覆盖范围检测用于确定单个测试的完整性。玩笑和业力都提供了此功能:
覆盖率是已执行的代码的比例。例如,已经执行了多少行,执行了多少个分支,执行了多少个功能以及执行了多少个语句。
覆盖率的总数分为行覆盖范围,分支覆盖范围,功能覆盖范围,声明覆盖范围等。
看来这很棒。执行后,您可以知道涵盖了哪些代码。实际上,实施原则相对简单。我相信,在阅读本文后,您会感到“只是吗?”
开玩笑和卡拉马都是基于伊斯坦布尔的报道。让我们探索伊斯坦布尔的实施原则。
测试代码如下:
我们执行伊斯坦布尔的仪器命令:
仪器是指插入堆的函数,即,在函数透明的功能中添加一些代码。
为什么要插入桩?阅读生成的代码后,您了解。
让我们格式化并替换变量名称。
这是切换代码。在每个语句中,每个函数,每个分支,计数,s,f,b属性。
上面还有一个代码:
初始化全局变量AAA,记录以下信息:
看到这里,我们可能可以理解覆盖范围的原则。它是为每个语句,函数和分支插入计数代码,该代码记录在全局对象中。
为了不与其他全局变量冲突,该对象的名称是随机生成的。例如,这是更改为AAA的简化。
我们知道覆盖率是插入计数代码。那你怎么堆呢?
功能桩基于AST,找到语句,功能,分支和插入的AST AST,将桩代码插入前方。
伊斯坦布尔也这样做。
以下是Isstanbul的源代码(只需查看以红线标记的位置):
正是通过Esprima(JS解析器)作为AST解析,然后插入AST堆。
桩代码分为两个部分,一个是全局对象的代码,一个是每个分支,语句和功能的计数代码。
让我们看一下:
伊斯坦布尔初始化统计的全局封面对象:
堆积时,您将在此Coverstate中记录信息:
最后,将封面变成字符串到代码:
特定的分支,语句和功能AST插入桩如何?
一堆不同的AST,也就是说,根据遍历过程中的类型进行不同的治疗:
然后,将特定堆插入AST的一部分:
声明插入堆:
功能插入桩:
看到这一点,我们知道该函数插入桩的实现原理是遍历AST,以及将计数代码插入不同位置的AST。
但是有些学生可能会说我通常在插入堆后不会手动生成代码?使用开玩笑 - 覆盖自动运行测试用例,然后给出覆盖范围数据。
伊斯坦布尔是如何制造透明堆的?
阅读了上一篇《启用钩子》的朋友知道nodejs的模块被分为负载,扩展名['。JS'],并编译。
我们只需要重写扩展步骤['。JS']以实现透明的代码转换。
伊斯坦布尔也一样:
通过修改扩展名['。JS']方法。在这里,插入了函数。之后,执行的代码是在转换之后,开发人员无法感知它。
开玩笑和业力都基于伊斯坦布尔实现了覆盖范围检测。覆盖统计原理是插入桩的功能。基于AST的语句,功能和分支,插入了代码的数量,并通过要求挂钩实现透明的转换。在执行代码后,可以获取统计信息,并可以计算覆盖范围。
阅读后,您认为:
这是覆盖范围检测的实现吗?