• 软件测试逻辑覆盖相关理解


    判定、条件、用例

    for(int i=2;i<=n && k==1;i++){
        if(m%i==0){
            break;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    上述代码意为当 k = 1 k=1 k=1 时,找到 [ 2 , n ] [2,n] [2,n] 区间内 m m m 的第一个因数,以此为例

    判定与条件

    判定,如ifforwhile等判定语句块

    条件(逻辑条件),而一个逻辑判断语句就对应了一个基础条件

    若干基础条件可以通过与、或、非等逻辑连接词组成复合条件

    注意,题目问满足覆盖所需的逻辑条件时,根据题意来自己判断是基础条件还是复合条件

    • 如上述代码的逻辑判断子语句i<=nk==1m%i==0

    • 如满足上述代码的100%判定覆盖所需的逻辑条件i<=n 且 k=1i>n 或 k≠1m%i=0m%i≠0

    • 如满足上述代码的100%条件覆盖所需的逻辑条件i<=ni>nk=1k≠1m%i=0m%i≠0

    也就是说,有 n n n基础条件 n n n基础条件构成 m m m复合条件

    • 要满足100%判定覆盖则最多 2 m 2m 2m 个逻辑条件
    • 要满足100%条件覆盖则最多 2 n 2n 2n 个逻辑条件

    测试用例

    测试用例是指一组变量的具体取值,一个测试用例可能可以同时满足多个逻辑条件

    需要看清楚题目问的是100%覆盖所需的逻辑条件还是最少的测试用例,一个测试用例可能可以同时满足多个逻辑条件

    如满足上述代码的100%条件覆盖的其中一组测试用例是

    • {n=2、m=3、k=1} :满足i<=n 且 k=1m%i=0m%i≠0
    • {n=0、m=3、k=1} :满足i>n 或 k≠1

    如满足上述代码的100%条件覆盖的其中一组测试用例是

    • {n=2、m=3、k=1}:满足i<=nk=1m%i=0m%i≠0
    • {n=0、m=3、k=0}:满足i>nk≠1

    所需逻辑条件的数量与最少测试用例数量并无直接关系……因为一个测试用例可能可以满足若干逻辑条件

    真题例子

    void cal( int n ) { 
        int g, s, b, q; 
        if ( ( n > 1000 ) && ( n < 2000 ) ) { 
            g = n % 10; 
            s = n % 100 / 10; 
            b = n / 100 % 10; 
            q = n / 1000; 
    
            if( ( q + g ) == ( s + b ) ) { 
                printf("%-5d", n); 
            } 
        } 
    
       return; 
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    image-2022622213325

    逻辑覆盖

    本文关于逻辑覆盖部分写的较为简陋,详细的可以查看这篇文章

    《白盒测试用例设计方法》

    https://blog.csdn.net/tianlin151/article/details/115665358

    逻辑覆盖包括以下:

    • 语句覆盖(Statement Coverage, SC)
    • 判定覆盖(Decision Coverage, DC)
    • 条件覆盖(Condition Coverage,CC)
    • 判断条件覆盖(Condition/ Decision Coverage, CDC)
    • 条件组合覆盖(Multiple Condition Coverage, MCC)
    • 路径覆盖(Path Coverage, PC)
    void f(double x, double y, double z){
        double num1, num2;//语句块1
        if(x>=0 && y!=0){
            num1=sqrt(x)/y;//语句块2
            printf("num1 is %f\n",num1);//语句块2
        }
        else{
            printf("num1 is invalid\n");//语句块3
        }
        if(z>=0){
            num2=z;//语句块4
            printf("num2 is %f\n",num2);//语句块4
        }
        else{
            num2=-z;//语句块5
            printf("num2 is %f\n",num2);//语句块5
        }
        printf("end of calculation\n");//语句块6
        printf("goodbye\n");//语句块6
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    上述代码意为依次计算 x y \frac{\sqrt{x}}{y} yx ∣ z ∣ |z| z,流程图如下,后文以此为例

    image-20220622223059015

    • if(x>=0 && y!=0)判定,记为P1
    • if(z>=0)判定,记为P2
    • x>=0条件,记为C1
    • y!=0条件,记为C2
    • z>=0条件,记为C3

    语句覆盖

    设计测试用例,是对程序中每条语句至少被执行一次。

    对于上例来说100%语句覆盖就是需要语句块1、语句块2、语句块3、语句块4、语句块5、语句块6均至少被执行一次

    判定覆盖(分支覆盖)

    设计测试用例,使得程序中的每个判断的”真“和”假“都至少被执行一次。即:程序中的每个分支至少执行一次。

    对于例子来说100%判定覆盖就是需要P1、P2各自都至少真一次和假一次

    可达到100%判定覆盖的其中一组测试用例的满足情况:

    • 测试用例1:同时满足P1真、P2真
    • 测试用例2:同时满足P1假、P2假

    条件覆盖

    设计测试用例,使得判定中的每个条件至少有一次取真值,有一次取假值。

    对于例子来说100%条件覆盖就是需要C1、C2、C3各自都至少真一次和假一次

    可达到100%条件覆盖的其中一组测试用例的满足情况:

    • 测试用例1:同时满足C1真、C2真、C3真
    • 测试用例2:同时满足C1假、C2假、C3假

    判定-条件覆盖

    设计测试用例,使得被测试程序中的每个判断本身的判定结果(真假)至少满足一次,同时,每个逻辑条件的可能值(真假)也至少被满足一次。即同时满足100%判定覆盖和100%条件覆盖的标准。

    对于例子来说100%判定-条件覆盖就是需要P1、P2、C1、C2、C3各自都至少真一次和假一次

    可达到100%判定-条件覆盖的其中一组测试用例的满足情况:

    • 测试用例1:同时满足C1真、C2真、P1真、C3真、P2真
    • 测试用例2:同时满足C1假、C2假、P1假、C3假、P2假

    条件组合覆盖

    设计测试用例,使得被测试程序中的每个判定中条件结果的所有可能组合至少执行一次。

    也就是说,有 n n n基础条件,每个基础条件都有一真一假2种情况,相互组合就会有 2 n 2^n 2n 个测试用例

    可达到100%条件组合覆盖的其中一组测试用例的满足情况:

    • 测试用例1:C1 真、C2真、C3真
    • 测试用例2:C1 真、C2真、C3假
    • 测试用例3:C1 真、C2假、C3真
    • 测试用例4:C1 真、C2假、C3假
    • 测试用例5:C1 假、C2真、C3真
    • 测试用例6:C1 假、C2真、C3假
    • 测试用例7:C1假、C2假、C3真
    • 测试用例8:C1 假、C2假、C3假

    路径覆盖

    设计测试用例,覆盖程序中所有可能的路径。

    对于例子来说就是需要路径a、b、c、d、e、f、g、h、i、j、k均至少走一次

  • 相关阅读:
    Golang数组
    Swoole系列(3) - 服务端 (异步风格)
    浅谈Java学习以及学习路线图
    自学——网络安全——黑客技术
    Maven的基础使用
    【SwiftUI模块】0008、SwiftUI-自定义启动闪屏动画-App启动闪屏曲线路径动画
    [附源码]计算机毕业设计springboot学生宿舍维修管理系统
    deepin换阿里镜像源
    git 项目带分支迁移到另一个 git 服务器
    视频剪辑中生成花字特效的代码案例详述
  • 原文地址:https://blog.csdn.net/weixin_42077074/article/details/125417848