本节演示比较复杂的情形,被测试代码如下图,功能是删除C++代码中的注释。
首先根据功能设计了以下用例,看起来已经相当完整了:
执行测试后,代码窗口部分未覆盖标示如下图:
打开用例设计器,如下图,待满足条件所表达的意义是:'/'后就是字符串结束符'\0',因此,把近似用例的输入改为"int
a;/",再把输出改为:"int a;/",点击执行并下一个。此用例会报告了一个错误。
现在,用例设计器更新如下图。待满足条件表示:'/'后不是'/',已满足条件已规定:'/'后也不是'*'或'\0',综合起来看,'/'应该是一个除号,而不是注释符,这是一个容易忽略的特殊输入。把输入改为"int
a = c/d;",输出也改为"int a = c/d;",点击执行并下一个。
现在,用例设计器如下图,已满足条件有: cmmSin == true || cmmMul == true cmmSin == false 已满足条件表达的意思是:cmmSin和cmmMul至少有一个为true,且cmmSin为false,因此cmmMul必定为true。 待满足条件为cmmMul == false,与已满足条件冲突,因此,当前面对一个不可覆盖的逻辑单位。点击标记为删除。
现在,用例设计器如下图,已满足条件有: cmmMul == true,表示已经进入多行注释; ch == '*',表示读到了多行注释结束符"*/"的'*'。 待满足条件为next !='/',表示'*'后面不是'/',即可能是一个乘号。这又是一个极易忽略的输入。把输入改为"int
a;/*comment 1*2 = 2 */\n",输出改为"int a;\n",点击执行并下一个。
还有两个分支和一些路径未覆盖,继续设计用例,对比已满足条件和待满足条件,可以发现,这些分支和路径都不可覆盖,点击标记为删除。 |