文档介绍:逻辑覆盖法 void DoWork ( int x,int y,int z) { int k=0,j=0; if ( (x>3)&&(z<10) ) { k=x * y-1; j= sqrt(k ); } // 语句块 1 if ( (x==4)||(y>5) ) { j=x * y+10; } //语句块 2 j=j%3; // 语句块 3 } 逻辑覆盖法(续) X>3 && z<10 执行语句块 1执行语句块 2 X==4 || y>5 执行语句块 3 FF TT abd ce语句覆盖?要实现 DoWork 函数的语句覆盖,只需设计一个测试用例就可以覆盖程序中的所有可执行语句。?测试用例输入为: { x=4 、 y=5 、 z=5 } ?程序执行的路径是: abd ?分析: 语句覆盖可以保证程序中的每个语句都得到执行,但发现不了判定中逻辑运算的错误,即它并不是一种充分的检验方法。例如在第一个判定((x>3)&&(z<10)) 中把“&& ”错误的写成了“||”,这时仍使用该测试用例,则程序仍会按照流程图上的路径 abd 执行。可以说语句覆盖是最弱的逻辑覆盖准则。判定覆盖?要实现 DoWork 函数的判定覆盖,需要设计两个测试用例。?测试用例的输入为: { x=4 、 y=5 、 z=5} ; {x=2 、 y=5 、 z=5} ?程序执行的路径分别是: abd ; ace ?分析: 上述两个测试用例不仅满足了判定覆盖,同时还做到语句覆盖。从这点看似乎判定覆盖比语句覆盖更强一些, 但仍然无法确定判定内部条件的错误。例如把第二个判定中的条件 y>5 错误写为 y<5 ,使用上述测试用例,照样能按原路径执行而不影响结果。因此,需要有更强的逻辑覆盖准则去检验判定内的条件。条件覆盖?在实际程序代码中,一个判定中通常都包含若干条件。条件覆盖的目的是设计若干测试用例,在执行被测程序后,要使每个判定中每个条件的可能值至少满足一次。?对 DoWork 函数的各个判定的各种条件取值加以标记。?对于第一个判定( (x>3)&&(z<10) ) : 条件 x>3 取真值记为 T1 ,取假值记为- T1 条件 z<10 取真值记为 T2 ,取假值记为- T2 ?对于第二个判定( (x==4)||(y>5) ) : 条件 x==4 取真值记为 T3 ,取假值记为- T3 条件 y>5 取真值记为 T4 ,取假值记为- T4 条件覆盖?根据条件覆盖的基本思想,要使上述 4个条件可能产生的 8种情况至少满足一次,设计测试用例如下: ce - T1 、-T2 、 -T3 、-T4 ace x=2 、 y=5 、 z=15 bd T1 、 T2 、 T3 、 T4 abd x=4 、 y=6 、 z=5 覆盖分支覆盖条件执行路径测试用例?分析:上面这组测试用例不但覆盖了 4个条件的全部 8种情况,而且将两个判定的 4个分支 b、c、d、e也同时覆盖了,即同时达到了条件覆盖和判定覆盖。条件覆盖?说明:虽然前面的一组测试用例同时达到了条件覆盖和判定覆盖,但是,并不是说满足条件覆盖就一定能满足判定覆盖。如果设计了下表中的这组测试用例,则虽然满足了条件覆盖,但只是覆盖了程序中第一个判定的取假分支 c 和第二个判定的取真分支 d,不满足判定覆盖的要求。 cd T1 、-T2 、 T3 、-T4 acd x=4 、 y=5 、 z=15 cd - T1 、 T2 、 -T3 、 T4 acd x=2 、 y=6 、 z=5 覆盖分支覆盖条件执行路径测试用例判定/条件覆盖?判定/条件覆盖实际上是将判定覆盖和条件覆盖结合起来的一种方法,即:设计足够的测试用例,使得判定中每个条件的所有可能取值至少满足一次,同时每个判定的可能结果也至少出现一次。?根据判定/条件覆盖的基本思想,只需设计以下两个测试用例便可以覆盖 4个条件的 8种取值以及 4个判定分支。 ce - T1 、-T2 、 -T3 、-T4 ace x=2 、 y=5 、 z=15 bd T1 、 T2 、 T3 、 T4 abd x=4 、 y=6 、 z=5 覆盖分支覆盖条件执行路径测试用例判定/条件覆盖?分析:从表面上看,判定/条件覆盖测试了各个判定中的所有条件的取值,但实际上,编译器在检查含有多个条件的逻辑表达式时,某些情况下的某些条件将会被其它条件所掩盖。因此,判定/条件覆盖也不一定