# 结构性测试

结构性测试

*西南科技大学计算机科学与技术学院*

2018-2019学年 第2学期

*《软件测试技术》实验报告*

实验名称: 结构性测试

组号
专业 学号 姓名
信安1604 5120160140 刘力铭

报告时间: 2019-5-20

任课教师: 潘 娅

成 绩:

一、实验目的

1、能熟练应用白盒测试方法(逻辑覆盖) 进行测试用例设计

2、评价测试覆盖率,对测试用例进行优化设计

3、熟悉代码静态分析方法和工具

二、实验内容

1、题目内容描述(指定程序代码测试):

(1)分别以语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖、路径覆盖、基路径测试

方法设计测试用例。
(2)使用 JUnit 编写测试用例,并采用参数化设置测试多种覆盖。

(3)使用 EclEmma 查看测试覆盖率。

2、测试用例的设计、实现与执行

【详细测试用例见源码,请单独在对分易上提交java源码文件】

程序流程图和控制流图如下:

# 结构性测试

(1)语句覆盖

用例编号 用例类名称 测试方法 测试数据组数 执行(P/F)
1 语句覆盖类路径为1-2-3-4-5-6-8-9-10 等价类、边界值、特殊值 x=5,y=6,z=6,预测结果=1 P

【可在此附上实验过程截图,同时请注明截图内容】

1号测试用例正确的截图和源代码显示情况:

# 结构性测试
# 结构性测试
(2)判定覆盖

在上述程序段中,x>3取真值时记为2T,x>3取假值时即x<=3记为2F;

z<10取真值时记为3T,z<10取假值时即z>=10记为3F;

x4取真值时记为6T,x4取假值时即x!=4记为6F;

y>5取真值时记为7T,y>5取假值时即y<=5记为7F;

用例编号 用例类名称 测试方法 测试数据组数 执行(P/F)
2 判定覆盖类分支为2T-3T-6T-7T 等价类、边界值、特殊值 x=4,y=6,z=7,预测结果=1 P
3 判定覆盖类分支为2F-3F-6F-7F 等价类、边界值、特殊值 x=1,y=4,z=10,预测结果=0 P

2,3号测试用例正确的截图和源代码显示情况:

# 结构性测试
# 结构性测试

(3)条件覆盖

在上述程序段中,x>3取真值时记为2T,x>3取假值时即x<=3记为2F;

z<10取真值时记为3T,z<10取假值时即z>=10记为3F;

x4取真值时记为6T,x4取假值时即x!=4记为6F;

y>5取真值时记为7T,y>5取假值时即y<=5记为7F;

用例编号 用例类名称 测试方法 测试数据组数 执行(P/F)
4 覆盖条件为2T-3F-6T-7F 等价类、边界值、特殊值 x=4,y=5,z=15,预测结果=0 P
5 覆盖条件为2F-3T-6F-7T 等价类、边界值、特殊值 x=2,y=7,z=5,预测结果=0 P

4、5号测试用例的执行情况(发现源代码的语句都没有执行完):

# 结构性测试
# 结构性测试

(4)判定-条件覆盖

在上述程序段中,x>3取真值时记为2T,x>3取假值时即x<=3记为2F;

z<10取真值时记为3T,z<10取假值时即z>=10记为3F;

x4取真值时记为6T,x4取假值时即x!=4记为6F;

y>5取真值时记为7T,y>5取假值时即y<=5记为7F;

用例编号 用例类名称 测试方法 测试数据组数 执行(P/F)
6 覆盖条件为2F-3F-6F-7F覆盖分支为2F-3F-6F-7F 等价类、边界值、特殊值 x=2,y=5,z=15,预测结果=0 P
7 覆盖条件为2T-3T-6T-7T覆盖分支为2T-3T-6T-7T 等价类、边界值、特殊值 x=4,y=7,z=5,预测结果=2 P

6,7号测试用例正确的截图和源代码显示情况:

# 结构性测试
# 结构性测试

(5)条件组合覆盖

在上述程序段中,x>3取真值时记为2T,x>3取假值时即x<=3记为2F;

z<10取真值时记为3T,z<10取假值时即z>=10记为3F;

x4取真值时记为6T,x4取假值时即x!=4记为6F;

y>5取真值时记为7T,y>5取假值时即y<=5记为7F;

编号 具体条件组合 覆盖条件 判定取值
1 x>3 2T 第一个判定取真分支
2 x<=3 2F 第一个判定取假分支
3 z<10 3T 第二个判定取真分支
4 Z>=10 3F 第二个判定取假分支
5 x==4 6T 第三个判定取真分支
6 x!=4 6F 第三个判定取假分支
7 y>5 7T 第四个判定取真分支
8 y<=5 7F 第四个判定取假分支
用例编号 用例类名称 测试方法 测试数据组数 执行(P/F)
8 覆盖条件为2T-3T-6T-7T覆盖分支为2T-3T-6T-7T 等价类、边界值、特殊值 x=4,y=6,z=5,预测结果=1 P
9 覆盖条件为2T-3F-6F-7F覆盖分支为2T-3F-6F-7F 等价类、边界值、特殊值 x=4,y=5,z=15,预测结果=0 P
10 覆盖条件为2F-3T-6F-7T覆盖分支为2F-3T-6F-7T 等价类、边界值、特殊值 x=2,y=6,z=5,预测结果=1 P
11 覆盖条件为2F-3F-6F-7F覆盖分支为2F-3F-6F-7F 等价类、边界值、特殊值 x=2,y=5,z=15,预测结果=0 P

8,9,10,11号测试用例正确的截图和源代码显示情况:

# 结构性测试
# 结构性测试

(6)路径覆盖

在上述程序段中,x>3取真值时记为2T,x>3取假值时即x<=3记为2F;

z<10取真值时记为3T,z<10取假值时即z>=10记为3F;

x4取真值时记为6T,x4取假值时即x!=4记为6F;

y>5取真值时记为7T,y>5取假值时即y<=5记为7F;

用例编号 用例类名称 测试方法 测试数据组数 执行(P/F)
12 覆盖路径为1-2-3-4-5-6-8-9-10 等价类、边界值、特殊值 x=4,y=6,z=6,预测结果=1 P
13 覆盖路径为1-2-6-7-8-9-10 等价类、边界值、特殊值 x=3,y=6,z=6,预测结果=1 P
14 覆盖路径为1-2-3-6-7-9-10 等价类、边界值、特殊值 x=5,y=5,z=10,预测结果=0 P

12,13,14号测试用例正确的截图和源代码显示情况:

# 结构性测试
# 结构性测试

(7)基路径覆盖

在上述程序段中,x>3取真值时记为2T,x>3取假值时即x<=3记为2F;

z<10取真值时记为3T,z<10取假值时即z>=10记为3F;

x4取真值时记为6T,x4取假值时即x!=4记为6F;

y>5取真值时记为7T,y>5取假值时即y<=5记为7F;

用例编号 用例类名称 测试方法 测试数据组数 执行(P/F)
15 独立路径为1-2-3-4-5-6-8-9-10 等价类、边界值、特殊值 x=4,y=6,z=6,预测结果=1 P
16 独立路径为1-2-3-4-5-6-7-8-9-10 等价类、边界值、特殊值 x=5,y=6,z=1,预测结果=1 P
17 独立路径为1-2-3-4-5-6-7-9-10 等价类、边界值、特殊值 x=5,y=2,z=5,预测结果=0 P
18 独立路径为1-2-3-6-7-9-10 等价类、边界值、特殊值 x=5,y=5,z=10,预测结果=0 P
19 独立路径为1-2-6-7-8-9-10 等价类、边界值、特殊值 x=3,y=6,z=6,预测结果=1 P

15,16,17,18,19号测试用例正确的截图和源代码显示情况:

# 结构性测试
# 结构性测试

3、bug清单

【报告中分版本罗列简要BUG清单(附BUG截图)】

BUG编号 BUG描述 关联用例编号 BUG等级 修正T/F

【可在此附上实验过程截图及BUG截图,同时请注明截图内容】

4、测试覆盖率分析

【请分析各个类的代码覆盖率情况,静态检查情况等,可以截图说明】

语句覆盖的代码覆盖率:

# 结构性测试

判定覆盖的代码覆盖率:

# 结构性测试

条件覆盖的代码覆盖率:

# 结构性测试

判定-条件覆盖的代码覆盖率:

# 结构性测试

条件组合覆盖的代码覆盖率:

# 结构性测试

路径覆盖的代码覆盖率:

# 结构性测试

基路径覆盖的代码覆盖率:

# 结构性测试

5、思考题:

  • 使用公式 e-n+p/e-n+2p 确定的 McCabe 基路径与实际分析的是否完全一致?

答:完全一致。

  • DD-路径和 MM-路径的区别与联系。

    定义:

    DD-路径:程序图中的一条链,使得: 情况1:由一个节点组成,内度=0。情况2:由一个节点组成,外度=0。 情况3:由一个节点组成,内度≥2或外度≥2。情况4:由一个节点组成,内度=1并且外度=1。 情况5:长度≥1的最大链。

    MM-路径:图G的圈数由V(G)=e-n+p给定,其中: e是G中的边数。n是G中的节点数。 p是G中的组件数。V(G)是图中不同区域的个数。

    区别和联系:

    DD-路径:该测试方法的突出特点,是它们都基于被测程序的源代码,而不是基于定义。

    MM-路径:通过定义加法和标量乘法的概念,强制使其看起来像向量空间:路径加法就是一条路径后接另一条路径,乘法对应于路径的重复。一、测试基路径集合是充分的(它不是)二、向量运算用于程序路径的表达上,没有意义。

6、实验关键代码

源代码:

package lab1_1;

public class Exam11 {

​ public double dowork(int x, int y, int z)

​ {

​ double k = 0, j = 0;

​ if ((x > 3) && (z < 10)) {

​ k = x * y - 1;

​ j = Math.sqrt(k);

​ }

​ if ((x == 4) || (y > 5))

​ j = x * y + 10;

​ j = j % 3;

​ return j;

​ }

}

测试代码:

package lab1_1;

import static org.junit.Assert.*;

import java.util.Arrays;

import java.util.Collection;

import org.junit.After;

import org.junit.Before;

import org.junit.Test;

import org.junit.runners.Parameterized.Parameters;

import org.junit.After;

import org.junit.Assert;

import org.junit.Before;

import org.junit.Test;

import java.util.Arrays;

import java.util.Collection;

import org.junit.Before;

import org.junit.Test;

import org.junit.runner.RunWith;

import org.junit.runners.Parameterized;

import org.junit.runners.Parameterized.Parameters;

import org.junit.Test;

@RunWith(Parameterized.class)

public class Exam11Test {

​ int testA;

​ int testB;

​ int testC;

​ double testExp;

​ public Exam11Test(int a, int b, int c, double exp)

​ {

​ testA = a;

​ testB = b;

​ testC = c;

​ testExp = exp;

​ }

​ @Parameters

​ public static Collection data(){

​ return Arrays.asList(new Object[][]{

​ {4,6,6,1},

​ {5,6,1,1},

​ {5,2,5,0},

​ {5,5,10,0},

​ {3,6,6,1}

​ });

​ }

​ private double DELTA = 1e-15;

​ Exam11 testObject;

​ @Before

​ public void setUp() throws Exception {

​ testObject = new Exam11();

​ }

​ @After

​ public void tearDown() throws Exception {

​ }

​ @Test

​ public void testDowork() {

​ double act=testObject.dowork(testA, testB, testC);

// System.out.print(act);

​ assertEquals(testExp, act, DELTA);

​ }

}