VcTester与常见C/C++语言覆盖测试工具一样,提供多种覆盖率统计,已涵盖语句覆盖、分支覆盖、条件分支覆盖、MCDC覆盖。本文讲解VcTester的插装实现原理、描述该工具的覆盖率使用特点。
VcTester是基于函数调用进行覆盖统计的,比如下面被测语句:
int i = printf(”I am here”);
源码经过插装改造,变为:
int i = (hit_(),printf(”I am here”));
上面借助逗号表达式,在不影响原语句的语法含义前提下插入hit_调用,hit_函数运行过程中自动记录该行语句是否已运行。
除了hit_函数,VcTester还对if语句的条件表达式中插入if_0与if_1函数,if_0用来记录判断结果为FALSE的情况,if_1用来记录判断为TRUR的情况。类似的,针对while与for语句,插装函数是while_0、while_1、for_0、for_1,另外,针对组合子条件,插入cond_0与cond_1函数,针对MCDC覆盖统计,还插入resetMcdc_函数。
VcTester的插装不仅支持覆盖率统计,单步调试功能也由插装来支持,VcSmith或VcTester在某一行语句设断点支持单步停住,就是在上述hit_函数中实现的。
首先,VcTester针对CSE脚本也提供覆盖率统计,即,大家用脚本编写测试用例,这样的脚本也可以当作被测代码进行调试与测试。CSE脚本的覆盖率统计与分析在共享版VcSmith已提供,可免费使用。
其次,VcTester可配置按脚本代码的覆盖率(即LICC与LDCC)方式统计,还是按C/C++的覆盖方式进行统计。这两者实际是基于同一原理,都是分析函数主调与被调关系实现统计的,若按C/C++方式统计额外附加一点转换即可,我们在Option对话框中将“Translate to Statement Coverage and Condition/Decision Coverage”选择框置上,如下图:
然后,VcTester支持的覆盖率统计还可灵活配置,配置包括“例外被测函数列表”(Except definition)与“例外被调函数列表”(Except function call),前者决定特定被测函数不纳入测试统计,比如某些特定的异常处理函数,因为实现逻辑简单,但模拟出异常实现覆盖测试的代价很高,就可以把这些异常处理函数定义到“例外被测函数列表”。
这一特点使VcTester覆盖统计具备一种柔性,对在各种类型风格的代码都维持确定的质量标准,还适应在不同阶段(如原型阶段、联调阶段、测试阶段)分别按不同质量标准进行控制。
CSE脚本风格与C/C++风格的覆盖统计还可统一起来,只需配置按LICC与LDCC的方式(即脚本方式)统计覆盖率,然后在“例外被调函数列表”(Except function call)指定哪些插装函数不作统计,即定制各种类别的覆盖率。比如缺省情况下针对C/C++统计的是条件判定覆盖率,如果配置if_0、if_1、while_0、while_1、for_0、for_1、cond_0、cond_1不统计,把这些函数定义到例外被调函数列表,系统对C/C++代码就只统计hit_,统计结果就变成语句覆盖,如果只排除cond_0与、cond_1则得到判定覆盖。上述这些配置对脚本的覆盖统计不产生影响。
当CSE软件在V1.6以后版本支持混合编程后,上述脚本与C/C++合一的覆盖率统计显得比较有价值,产品代码可以用CSE脚本来写,以调试与测试,自动翻译成C/C++代码,产品研发过程中,脚本形式的产品代码与C/C++形式的产品代码会长时间并存。
采用持续集成开发模式的项目,代码往往写一点、调一点、测一点,依次不停的做迭代。该方式要求测试工具对测试过程评估要更加“过程化”,要适应对每一步迭代过程的研发质量做出评价。
在VcTester工具的Option对话框可定义代码过程质量的通过标准(请参考见VcSmith与VcTester使用手册)。VcTester提供一种红绿灯通行机制,在主界面右上角设计3个红绿灯,如下图:
分别表示当前测试的状态、覆盖率与测试程度情况,如果当前测试未通过,最左边的标志灯会亮红灯,这时用户应先解决问题,如果代码覆盖率或用例覆盖度没达标,中间或右边的标志灯会亮黄灯,用户应加强测试,直至这两个标志灯都变绿色。遵循红绿灯机制的基本规则就是:
让3个绿灯时时亮起,亮绿灯是常态,亮红灯是暂态。
如果团队每位成员都很好的遵守这个规则,就能保证软件开发一直按照确定质量标准平稳向前推进,研发进度与风险都在受控范围内。
参考文献:
1. ezTester,《VcSmith使用手册》
2. ezTester,《VcTester使用手册》
================ END ==========================
本专题相关的文章:
第4代白盒测试方法介绍--理论篇
第4代白盒测试方法介绍--VcTester实践篇
第4代白盒测试方法通俗释义
第4代白盒测试方法之“为什么要做白盒测试”
第4代白盒测试方法之“企业如何推行白盒测试”
第4代白盒测试方法之“实施白盒测试的几个误区”
第4代白盒测试方法之“如何选择嵌入式白盒测试工具”
第4代白盒测试方法实践之“VcTester持续集成框架的应用价值”
第4代白盒测试方法实践之“使用VcTester实施持续集成的组织管理模式”
第4代白盒测试方法实践之“如何在VcTester集成自动构建功能”
第4代白盒测试方法实践之“使用VcTester构造持续集成及每日构建平台”
第4代白盒测试方法实践之“内存泄露检查工具VLD如何与VcTester配合使用”
第4代白盒测试方法实践之“如何将Pclint嵌入到VcTester中使用”