本周感冒。身体不舒服。写完这个,去更新组博客。可能之后还会有更新。
黑盒测试的用例上周已经说过。
下面说说白盒测试。
首先,谈谈覆盖这个事。
- 语句覆盖是指选择足够的测试用例,使得运行这些测试用例时,被测程序的每一个语句至少执行一次,其覆盖标准无法发现判定中逻辑运算的错误;
- 判定覆盖<又叫分支覆盖率>是指选择足够的测试用例,使得运行这些测试用例时,每个判定的所有可能结果至少出现一次,但若程序中的判定是有几个条件联合构成时,它未必能发现每个条件的错误;
- 条件覆盖是指选择足够的测试用例,使得运行这些测试用例时,判定中每个条件的所有可能结果至少出现一次,但未必能覆盖全部分支;
- 判定/条件覆盖是使判定中每个条件的所有可能结果至少出现一次,并且每个判定本身的所有可能结果也至少出现一次;
- 修正条件判定覆盖满足条件与判定覆盖,并且需要确定每个条件能够影响到包含的判定的结果。
- 条件组合覆盖是使每个判定中条件结果的所有可能组合至少出现一次,因此判定本身的所有可能解说也至少出现一次,同时也是每个条件的所有可能结果至少出现一次;
- 路径覆盖是每条可能执行到的路径至少执行一次;
其中语句覆盖是一种最弱的覆盖,判定覆盖和条件覆盖比语句覆盖强,满足判定/条件覆盖标准的测试用例一定也满足判定覆盖、条件覆盖和语句覆盖,条件组合覆盖是除路径覆盖外最强的,路径覆盖也是一种比较强的覆盖,但未必考虑判定条件结果的组合,并不能代替条件覆盖和条件组合覆盖。
不论那种覆盖方法,都不能保证程序的正确性。
我们尝试了在window平台Dev 5.6.1的环境下和VS2010的环境下对C++代码的白盒测试。但苦于没有找到合适开源(免费)的测试软件。
比较好的商用软件有Parasoft C++ Test、Visual Unit 等等,但是需要付费。试用版可能只能演示示例,不清楚能不能完成功能。
所以最终,我们小组选择了对我为了论证实践而改写的符合本次项目要求的JAVA项目作为测试对象。
使用了JUnit 做单元测试,并且用ecLemma记录了代码覆盖率。
经过不断改进,我们通过12个白盒测试用例,达到了代码语句覆盖率98.1%
其中对基础的Fraction分数类达到了100%的覆盖,而对Calculator有一处冗余的异常处理的设计没能覆盖到(此处之前已经会把异常拦截返回结果,不会运行到此处)
我们达到的覆盖率标准是语句覆盖,因为我们的实现中每个分支从结果上都得到了执行,所以也达到了分支覆盖。
但其他的几个级别的覆盖则不能轻易看出是否达到。
从实现角度说,这给了我们一个教训,每一个判断条件尽可能地轻量化,让条件分散开就可以用语句覆盖率来逼近路径覆盖等高层次覆盖率的情况了。
事实上,我们的实现中每一个分支中的语句都比较少,从语句覆盖中可以得到比较好的结果。
先写到这了。