# 结构性测试
结构性测试
*西南科技大学计算机科学与技术学院*
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);
}
}