注:转载文章如涉及版权,请通知。原创作品如转载,请注明出处并保持完整。

Test Theory——Coverage Analyze 2: Block Coverage

上一篇 / 下一篇  2009-05-21 14:20:59 / 个人分类:Testing

Block Coverage or Basic Block Coverage 是从 Line Coverage演化而来的。
但是为什么我不把它直接归入Line Coverage一类来说明呢?
有两个原因:
1.Block Coverage对于Line Coverage的补充是非常重要的。
2.Block Coverage中的Block到底怎么计算。

先来说第一个原因:
在Line Coverage那篇中我有指出它的缺点在于对代码结构的不敏感,着重提到了对于if-else语句其中一分支语句(if or else)远远大于另一分支的情形,在这里我将Line Coverage对于几种主要的结构不敏感的情况罗列一下:
1.无法评估if语句中条件错误的情况。这是Line Coverage最严重的短板。
因为对于一个源文件来说,if语句实在是太频繁了。
2.do-while语句无论如何都会执行一次,而这对于Line Coverage来说因为着和无分支语句是没有什么区别的。
3.Line Coverage无法知道循环是否已经达到终止条件,而这对于C,C++,Java来说这肯定会影响到那些使用break语句的循环。
4.Line Coverage完全对逻辑操作符的不敏感。如(||and&&).
5.Line Coverage不能区别那些连续的Switch语句标签。
6.Line Coverage不能准确的对待if-else语句其中一分支语句(if or else)远远大于另一分支的情形。

Ok,对于Block Coverage 来说,它很好的消除了第六种情况的发生。
我们看看著名的单元测试工具Parasoft C++ Test中对于Block和Block Coverage的描述:
Block:A sequence of non-branching statements; a linear sequence of code with no control flow route branchings.
Block Coverage:Similar to Line Coverage, except that with Block Coverage the unit of measured code is a basic block. Indicates how many basic blocks in the source code were reached by the control flow at least once.

现在我们来说第二个原因:
Block到底如何计算?
其实,我们说Block覆盖率是针对目标码而言,而不是源代码。这在Line Coverage中有提到过。一个Block是说一个机器码片段的基本控制流的单个进和单个出。因此,一个调用语句的使用可以看作是一个Blcok结束的标志。

Example:
int main()
{
1:    BasicClass A;
2:    int i = 10;
3:    if (i)
4:    {
5:       i = A.function();
6:    }
7:    return i;
}


在上面的例子中,你觉得会有几个Block?
一相当部分的人会觉得是3个。其实不然。
第一行中BasicClass类对构造函数和析构函数(之后)的调用,第5行中对function()的调用以及i返回值的分配。

其实,对于实际的测试工作中,我们没必要太担心对于Block的识别,而是关心对于自动化工具对于覆盖率的统计结果,然后我们根据结果来进行相应的提高。

因为我们无法手工去统计代码的覆盖率,如果以后有必要我会增加自动化工具对于覆盖率统计的一些原理。




TAG:

 

评分:0

我来说两句

charlie.chow

charlie.chow

积极,乐观,淡定

日历

« 2024-04-24  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 8985
  • 日志数: 36
  • 建立时间: 2009-05-17
  • 更新时间: 2009-06-19

RSS订阅

Open Toolbar