《软件测试和质量管理》实验报告一
一、目的和要求
1、掌握白盒测试技术,并能应用白盒测试技术设计测试用例;
2、能用Junit实施测试。
二、实验内容
说明:程序段
void DoWork(int x,int y,int z){
1 int k=0,j=0;
2 if(( x>3 ) && ( z<10 ))
3 {
4 k=x*y-1;
5 j=sqrt(k);
6 }
7 if(( x= =4 ) || ( y>5 ))
8 j=x*y+10;
9 j=j%3;
10 return j;
11 }
中每行开头的数字(1~11)是对每条语句的编号。
(1)分别以语句覆盖、判定覆盖、条件覆盖和路径覆盖方法设计测试用例,并写出每个测试用例的执行路径(用题中给出的语句编号表示)。
(2)编写Java类,调用该方法,并用Junit测试工具编写测试代码进行测试。
三、测试用例的编写
3.1 构造程序流程图
对上述程序进行白盒测试,首先需要绘制出程序流程图。程序流程图可以用来描述程序的任何结束,对代码结构分析提供直观的帮助。现用题中给出的语句编号来表示程序流程图,具体如下左图所示,化简后程序流程图为下右图所示。
3.2 分析程序流程图
(1)判定
编号2和7语句为判定,分别记为M、N,即:M = {x>3 && z<10}、N = {x==4 || y>5}。
(2)条件
对于M:x>3取真为T1,取假为F1;z<10取真为T2,取假为F2;
对于N:x==4取真为T3,取假为F3;y>5取真为T4,取假为F4。
(3)路径
程序模块共有4条不同的路径,分别为:
P1 (1-2-3-4-5-6-7-8-9) == M && N
P2 (1-2-3-4-5-6-7-9) == M && ~N
P3 (1-2-7-8-9) == ~M && N
P4 (1-2-7-9) == ~M && ~N
3.3 基于逻辑的覆盖方法设计测试用例
(1)语句覆盖
语句覆盖的基本思想是度量被测代码中每个可执行语句是否被执行到。本段测试代码中,可执行语句包括了编号1、4、5、8、9语句。故仅需测试一次判定取值均为真即可完成语句的全部覆盖,即遍历路径P1 (1-2-3-4-5-6-7-8-9)。
表1 语句覆盖测试用例表
测试用例 | 判定取值 | 条件取值 | 覆盖路径 |
输入:x=4,y=7,z=8 输出:j=2 | T,T | T1,T2,T3,T4 | P1 (1-2-3-4-5-6-7-8-9) |
(2)判定覆盖
判定覆盖的基本思想是设计若干用例,运行被测程序,使得程序中的每个判断的取真和取假分支至少经历一次,即判断真假值均曾被满足。本段测试代码中包括了M、N两个判定,故判断覆盖需要满足上述两个判定各取一次真值和假值。
表2 判定覆盖测试用例表
测试用例 | 判定M的取值 | 判定N的取值 | 覆盖路径 |
输入:x=5,y=4,z=8 输出:j=1 | T | F | P2 (1-2-3-4-5-6-7-9) |
输入:x=4,y=1,z=11 输出:j=2 | F | T | P3 (1-2-7-8-9) |
(3)条件覆盖
条件覆盖的基本思想是设计若干测试用例,执行被测程序以后,要使每个判断中每个条件的可能取值至少满足一次。在本段测试代码中M、N两个判断中共有4个条件:x>3、z<10、x==4、y>5,故条件覆盖需要满足上述4个条件的真假值至少满足一次。
表3 条件覆盖测试用例表
测试用例 | 条件取值 | 具体取值条件 | 覆盖路径 |
输入:x=4,y=7,z=8 输出:j=2 | T1,T2,T3,T4 | x>3,z<10,x=4,y>5 | P1 (1-2-3-4-5-6-7-8-9) |
输入:x=2,y=2,z=12 输出:j=0 | F1,F2,F3,F4 | x<=3,z>=10,x≠4,y<=5 | P4 (1-2-7-9) |
(4)路径覆盖
基本路径覆盖的基本思想是设计所有的测试用例,来覆盖程序中所有可能的、独立的执行路径。在本段测试代码中共有4条路径:P1 (1-2-3-4-5-6-7-8-9)、P2 (1-2-3-4-5-6-7-9)、P3 (1-2-7-8-9)、P4 (1-2-7-9)。故路径覆盖需要覆盖到这4条路径。
表4 路径覆盖测试用例表
测试用例 | 判定取值 | 条件取值 | 覆盖路径 |
输入:x=4,y=7,z=8 输出:j=2 | T,T | T1,T2,T3,T4 | P1 (1-2-3-4-5-6-7-8-9) |
输入:x=5,y=4,z=8 输出:j=1 | T,F | T1,T1,F1,F2 | P2 (1-2-3-4-5-6-7-9) |
输入:x=4,y=1,z=11 输出:j=2 | F,T | T1,F2,T3,F4 | P3 (1-2-7-8-9) |
输入:x=2,y=2,z=12 输出:j=0 | F,F | F1,F2,F3,F4 | P4 (1-2-7-9) |
四、测试结果的分析
针对DoWork函数,此次实验使用junit5、hamcrest1.3测试工具,利用白盒测试中基于逻辑的覆盖方法,绘制程序流程图并设计测试用例,完成语句覆盖、判定覆盖、条件覆盖、路径覆盖四种测试方法。
对于语句覆盖,输入x=4,y=7,z=8,输出j=2,覆盖所有语句且结果正确。
对于判定覆盖,输入x=5,y=4,z=8,输出j=1;输入x=4,y=1,z=11,输出j=2;覆盖2个判定的所有取值情况且结果正确。
对于条件覆盖,输入x=4,y=7,z=8,输出j=2;输入x=2,y=2,z=12,输出j=0;覆盖4个条件所有的取值情况且结果正确;
对于路径覆盖,输入x=2,y=4,z=9,输出j=0;输入x=5,y=4,z=9,输出j=1;输入x=4,y=4,z=11,输出j=2;输入x=4,y=6,z=9,输出j=1;覆盖所有路径且结果正确。
四种测试方法全部正确,故测试通过。
五、测试文档的撰写
- 测试背景:《软件测试和质量管理》实验课程——白盒测试
- 测试平台:
- 操作系统:Windows 10;
- 开发工具:Eclipse 2022-12(4.26.0);
- 测试工具:junit5、hamcrest1.3
- 测试内容:DoWork代码段测试
- 测试风险:版本风险:无、设计风险:无、开发风险:无
- 测试结果:通过无误
- 测试代码:
package com.softtest.baihe.test;
import static org.junit.jupiter.api.Assertions.*;
import com.softtest.baihe.*;
import org.junit.jupiter.api.Test;
class EXP1Test {
private EXP1 exp1;
public EXP1Test() {
exp1 = new EXP1();
}
// 语句覆盖
@Test
public void Exam1StmtCoverTest() {
assertEquals(exp1.DoWork(4, 7, 8), 2);
}
// 判定覆盖
@Test
public void Exam1DeciCoverTest() {
assertEquals(exp1.DoWork(5, 4, 8), 1);
assertEquals(exp1.DoWork(4, 1, 11), 2);
}
// 条件覆盖
@Test
public void Exam1ConCoverTest() {
assertEquals(exp1.DoWork(4, 7, 8), 2);
assertEquals(exp1.DoWork(2, 2, 12), 0);
}
// 路径覆盖
@Test
public void Exam1PathCoverTest() {
assertEquals(exp1.DoWork(4, 7, 8), 2);
assertEquals(exp1.DoWork(5, 4, 8), 1);
assertEquals(exp1.DoWork(4, 1, 11), 2);
assertEquals(exp1.DoWork(2, 2, 12), 0);
}
}
六、心得与体会
本次实验,我利用白盒测试中基于逻辑的覆盖方法,绘制程序流程图并应用白盒测试技术设计测试用例,应用Junit实施语句覆盖、判定覆盖、条件覆盖、路径覆盖,掌握了白盒测试技术和Junit的使用。
在实验前,我事先复习了基于逻辑的覆盖测试方法,并针对实验给定的DoWork代码段进行结构分析,找出所有路径;然后使用语句覆盖、判定覆盖、条件覆盖、路径覆盖的覆盖方法设计了四种测试用例,并针对每种覆盖方式,逐一填表。例如路径覆盖中,先确定所有路径,然后再根据路径查看其判断和条件的情况,最后给出输入情况,算出输出;同理可以确定其他三种覆盖方式,核心在于先确定其需要覆盖的内容,然后再扩充填表,最后确定测试用例。
设计完测试用例后,便通过Eclipse进行测试代码撰写。这里需要注意文件命名和代码规范问题,理论课上老师强调被测试类和测试类的命名,且测试类需要一一对应被测试类,这样便于检查和使用,本次实验根据四种测试方法需要有四个测试类。
其次是Juint和hamcrest的使用,Hamcest提供了一套匹配符Matcher,这些匹配符更接近自然语言,可读性高,更加灵活。本次实验,我尝试了全新的断言语法asserEquals和assertThat的使用,结合Hamcest提供的匹配符,就可以轻松地实现所有测试,这使日后实际项目开发的代码测试更加方便高效。