邓松软件测试实验指导书(20140907采用)

更新时间:2023-05-16 04:49:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

软件测试实验指导书

编制人:邓 松

江西财经大学软通学院2014.5

实验一 书写测试计划(6学时) 2 实验二 白盒测试(2学时) 12 实验三 JUnit测试框架的使用(4学时) 36 实验四 黑盒测试(2学时) 50 实验五 集成测试(2学时) 62 实验六 QTP综合测试(8学时) 74 实验七 Load Runner认识实验(4学时) 18 实验八 TestDirector错误报告与管理(2学时) 26

实验一 测试计划(6学时)

一、实验目的

1. 掌握测试计划的内容和编制。 2. 通过给定案例练习编写测试计划。

二、基本知识

1. 具有微软Windows和office Word的使用经验 2. 熟悉软件测试的基本知识 3. 熟悉测试计划的概念和内容 4. 了解案例的功能和使用步骤。

三、实验设备及环境

1. Windows操作系统 2. Office Word应用软件 3. 案例系统软件

4. 系统软件需求分析说明书和开发计划

四、实验内容

班级管理系统测试计划

1. 需求描述(学生考勤情况管理、学生学习记录、学生活动情况、班级

活动情况管理、住宿情况管理、各位班干部工作事项汇报子系统(工作完成情况可用仪表盘表示)等)。请各位同学细化各项目功能,使用原型法完成相应软件。

2. 测试计划标识符

FR201011-001-ST

3. 引言

1) 目标

班级管理系统测试计划的目标是:

1. 找出班级管理系统功能的缺陷;

2. 找出班级管理系统中对特殊数据处理的漏洞; 3. 找出班级管理系统运行过程中的BUG; 4. 找出班级管理系统登陆权限的差错; (此处学生填写相应目标)

2) 背景

a. 待开发软件系统的名称:班级管理系统;

b. 本项目任务提出者:《软件质量保证与测试》的授课教师 用户:班级信息管理人员,班级学生; c. 参考资料: 《软件工程》

《软件测试方法与技术》 d. 本系统的主要功能有:

学生信息管理功能:方便学生信息的查询,增加,删除,修改; 课程管理:管理员可通过编写表格的形式修改课程等相关的信息;

成绩管理:管理员可通过数据库中的学生成绩信息进行修改,增加;

学分管理:管理员对班级学生的荣誉情况,获奖信息,活动培训等学分机制的数量统计。

班级信息管理功能:管理员可通过此功能对班级信息进行查询,修改,增加,删除;

班干配备管理:管理员根据班级干部平日工作考察评比分配班干任免;

班级活动管理:管理员配合组织委员对一定时间内的班级集体活动作出计划和安排;

班级卫生管理:管理员配合勤工委员对班级寝室卫生考察并以表格的形式表现各个寝室卫生的具体情况。

(填写)

3) 范围

所选择的测试用例基本上能够检查到所有合法与不合法的输入和

输出;

局限性在于数据库设计存在的缺陷,可能存在学号相同但是其他信息完全一致的情况出现。 (此处学生填写相应内容)

4) 引用文档

(暂空)

4. 测试依据

GB/T

5. 方法

6. 测试项通过准则 7. 暂停准则和恢复要求 8. 测试交付项 9. 测试任务 10. 环境要求 11. 职责

12. 人员配备、培训要求和资源配置 13. 进度

登陆界面,班级管理员系统和学生信息系统的测试; 学生课程信息系统的检测;

14. 风险和应急

实验二 白盒测试(2学时)

实验目的

(1) 掌握结构性测试技术,并能应用结构性测试技术设计测试用例;

(2) 对测试用例进行优化设计;

背景知识

结构性测试是知道产品内部工作过程,检测产品内部动作是否按照规格说明书的规定正常进行。结构性测试允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。

一、 逻辑覆盖

结构性测试力求提高测试覆盖率。逻辑覆盖是对一系列测试过程的总称,它是在使用白盒测试法时,选用测试用例执行程序逻辑路径的方法。

逻辑覆盖按覆盖程度由低到高大致分为以下几类:

(1) 语句覆盖:设计若干测试用例,使程序中每一可执行语句至少执行一次; (2) 判断覆盖:设计用例,使程序中的每个逻辑判断的取真取假分支至少经历一

次;

(3) 条件覆盖:设计用例,使判断中的每个条件的可能取值至少满足一次; (4) 判断/条件覆盖:设计用例,使得判断中的每个条件的所有可能结果至少出现

一次,而且判断本身所有可能结果也至少出现一次;

(5) 条件组合覆盖。设计用例,使得每个判断表达式中条件的各种可能组合都至

少出现一次;显然,满足⑤的测试用例也一定是满足②、③、④的测试用例。

(6) 路径覆盖。设计足够的测试用例,使程序的每条可能路径都至少执行一次。 如果把路径覆盖和条件组合覆盖结合起来,可以设计出检错能力更强的测试数据用例。

二、 基本路径测试

如果把覆盖的路径数压缩到一定限度内,例如,程序中的循环体只执行零次和一次,就成为基本路径测试。它是在程序控制流图的基础上,通过分析控制构造的环路复杂性,

导出基本可执行路径集合,从而设计测试用例的方法。

设计出的测试用例要保证在测试中,程序的每一个可执行语句至少要执行一次。 ① 程序的控制流图

控制流图是描述程序控制流的一种图示方法。基本控制构造的图形符号如图所示。符号○称为控制流图的一个结点,一组顺序处理框可以映射为一个单一的结点。控制流图中的箭头称为边,它表示了控制流的方向,在选择或多分支结构中分支的汇聚处,即使没有执行语句也应该有一个汇聚结点。边和结点圈定的区域叫做区域,当对区域计数时,图形外的区域也应记为一个区域。

图3-.1 控制流图的各种图形符号

如果判定中的条件表达式是复合条件时,即条件表达式是由一个或多个逻辑运算符(OR,AND,NAND,NOR)连接的逻辑表达式,则需要改复合条件的判定为一系列只有单个条件的嵌套的判定。例如对应图3-2. (a) 的复合条件的判定,应该画成如图3-2. (b) 所示的控制流图。 条件语句 if a OR b 中条件a和条件b各有一个只有单个条件的判定结点。

图3-2 复合逻辑下的控制流图

② 计算程序环路复杂性

进行程序的基本路径测试时,程序的环路复杂性给出了程序基本路径集合中的独立路径条数,这是确保程序中每个可执行语句至少执行一次所必需的测试用例数目的上界。

所谓独立路径,是指包括一组以前没有处理的语句或条件的一条路径。如在图3-3(b)所示的控制流图中,一组独立的路径是:

path1:1 - 11

path2:1 - 2 - 3 - 4 - 5 - 10 - 1 - 11 path3:1 - 2 - 3 - 6 - 8 - 9 - 10 - 1 - 11 path4:1 - 2 - 3 - 6 - 7 - 9 - 10 - 1 - 11

路径path1,path2,path3,path4组成了图3-3 (b) 所示控制流图的一个基本路径集。只要设计出的测试用例能够确保这些基本路径的执行,就可以使得程序中的每个可执行语句至少执行一次,每个条件的取真分支和取假分支也能得到测试。基本路径集不是唯一的,对于给定的控制流图,可以得到不同的基本路径集。

(a) 程序流程图 (b) 控制流图

图3-3 程序流程图与对应的控制流图

通常环路复杂性可用以下三种方法求得。 将环路复杂性定义为控制流图中的区域数。

设E为控制流图的边数,N为图的结点数,则定义环路复杂性为 V(G)=E-N+2。

若设P为控制流图中的判定结点数,则有 V(G)=P+1。

因为图5.14(b)所示控制流图有4个区域。其环路复杂性为4。 它是构成基本路径集的独立路径数的上界。可以据此得到应该设计的测试用例的数目。

③ 导出测试用例

利用逻辑覆盖方法生成测试用例,确保基本路径集中每条路径的执行。

3.2.1 实验设备

主流PC机一套,要求安装windows操作系统、Visual C++开发工具和OFFICE工具;

3.2.2 实验内容

题目一:使用逻辑覆盖测试方法测试以下程序段

void DoWork (int x,int y,int z) { 1 2 3

int k=0, j=0; if ( (x>3)&&(z<10) ) {

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 }

说明:程序段中每行开头的数字(1~10)是对每条语句的编号。 (1)画出程序的控制流图(用题中给出的语句编号表示)。

(2)分别以语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、组合覆盖和路径覆盖方法设计测试用例,并写出每个测试用例的执行路径(用题中给出的语句编号表示)。

题目二:三角形问题

在三角形计算中,要求输入三角型的三个边长:A、B 和C。当三边不可能构成三角形时提示错误,可构成三角形时计算三角形周长。若是等腰三角形打印“等腰三角形”,若是等边三角形,则提示“等边三角形”。画出程序流程图、控制流程图、计算圈复杂度V(g),找出基本测试路径。

题目三:计算生日是星期几

已知公元1年1月1日是星期一。编写一个程序,只要输入年月日,就能回答那天是星期几。应用逻辑覆盖方法和基路径测试方法为上面的问题设计测试用例。

题目四:选择排序

下面是选择排序的程序,其中datalist是数据表,它有两个数据成员:一是元素类型为Element的数组V,另一个是数组大小n。算法中用到两个操作,一是取某数组元素V[i]的关键码操作getKey ( ),一是交换两数组元素内容的操作Swap( ):: 象

for ( int j = i+1; j < list.n; j++)

if ( list.V[j].getKey ( ) < list.V[k].getKey ( ) ) k = j;//当前具最小关键码的对象 if ( k != i ) Swap ( list.V[i], list.V[k] );

//交换

void SelectSort ( datalist & list ) {

/对表list.V[0]到list.V[n-1]进行排序, n是表当前长度。 for ( int i = 0; i < list.n-1; i++ ) {

int k = i;

//在list.V[i].key到list.V[n-1].key中找具有最小关键码的对

} }

(1) 试计算此程序段的McCabe复杂性;

(2) 用基本路径覆盖法给出测试路径; (3) 为各测试路径设计测试用例。

3.2.3 实验步骤

(1) 根据结构性测试技术设计测试用例,主要考虑逻辑覆盖测试(语句覆盖、判断

覆盖、条件覆盖、判断/条件覆盖、条件组合覆盖、路径覆盖)和基路径测试技术;

(2) 根据所学知识确定优化策略(原则:用最少的用例检测出更多的缺陷、软件测

试的充分性与冗余性考虑),设计两套测试用例集;

(3) 根据设计的两套测试用例集进行测试、参照表2所示的缺陷等级给出缺陷列表; (4) 计算测试用例的分支覆盖率、条件覆盖率和语句覆盖率等测试管理指标;

3.2.4 实验要求

(1) 根据题目要求编写测试用例(参照表1进行用例设计);

(2) 实验结果要求给出两套测试用例集测试效果比较;计算测试用例的分支覆盖率、

条件覆盖率和语句覆盖率等测试管理指标;

(3) 撰写实验报告;

3.2.5 实验思考

(1) 使用公式e-n+p/e-n+2p确定的McCabe基路径与实际分析的是否完全一致? (2) DD-路径和MM-路径的区别与联系。

实验三 JUnit测试框架的使用(4学时) 一、实验目的

1、掌握Junit测试框架的使用 2、掌握测试用例的编写

二、基本知识

1、熟悉java编程语言和Eclipse集成开发环境 2、熟悉单元测试概念 3、熟悉测试设计技术

三、实验环境

①windows操作系统+IE浏览器

②Eclipse集成开发环境+Junit测试框架

四、实验内容

1、学习Junit框架的使用

可通过以下两个示例进行学习。

A、Junit使用方法示例1

1)把Junit引入当前项目库中

新建一个 Java 工程—coolJUnit,打开项目coolJUnit 的属性页 -> 选择“Java Build Path”子选项 -> 点选“Add Library ”按钮 -> 在弹出的“Add Library”对话框中选择 JUnit(图1),并在下一页中选择版本 Junit 4 后点击“Finish”按钮。这样便把 JUnit 引入到当前项目库中了。

图1 为项目添加 JUnit 库

2)新建单元测试代码目录

单元测试代码是不会出现在最终软件产品中的,所以最好为单元测试代码与被测试代码创建单独的目录,并保证测试代码和被测试代码使用相同的包名。这样既保证了代码的分离,同时还保证了查找的方便。遵照这条原则,在项目 coolJUnit 根目录下添加一个新目录 testsrc,并把它加入到项目源代码目录中。(见 图2、3)。

图2 新建测试代码目录

图3 添加测试代码目录

3)在工程中添加类

添加类SampleCaculator,类中有两个方法,分别计算加减法。编译代码。

package cn.edu.gzhu;

public class SampleCalculator { }

//计算两整数之和

public int add(int augend, int addend){ }

//计算两整数之差

public int subtration(int minuend, int subtrahend){ }

return minuend - subtrahend; return augend + addend;

4)写单元测试代码

为类SampleCalculator添加测试用例。在资源管理器SampleCalculator.java文

件处右击选new>选Junit Test Case(见图4),Source foler选择testsrc目录,点击next,选择要测试的方法,这里把add和subtration方法都选上,最后点finish完成。

图4 新建测试用例

Junit自动生成测试类SampleCalculatorTest,修改其中的代码(如下)。 其中assertEquals断言,用来测试预期目标和实际结果是否相等。 assertEquals( [Sting message], expected, actual )

expected是期望值(通常都是硬编码的),actual是被测试代码实际产生的值,message是一个可选的消息,如果提供的话,将会在发生错误时报告这个消息。

如想用断言来比较浮点数(在Java中是类型为float或者double的数),则需指定一个额外的误差参数。

assertEquals([Sting message], expected, actual, tolerance)

其它断言参见课本和参考书介绍。测试方法需要按照一定的规范书写: 1. 测试方法必须使用注解 org.junit.Test 修饰。

2. 测试方法必须使用 public void 修饰,而且不能带有任何参数。

package cn.edu.gzhu;

import static org.junit.Assert.*; import org.junit.Test;

public class SampleCalculatorTest { }

SampleCalculator calculator = new SampleCalculator(); @Test

public void testAdd() { } @Test

public void

testSubtration() { }

int result = calculator.subtration(50, 20); assertEquals(30,result);

int result = calculator.add(50, 20); assertEquals(70,result);

5)查看运行结果

在测试类上点击右键,在弹出菜单中选择 Run As JUnit Test。运行结果如下图,绿色的进度条提示我们,测试运行通过了。

图5 示例1运行结果

B、Junit使用方法示例2

1)在工程中添加类

类WordDealUtil中的方法wordFormat4DB( )实现的功能见文件注释。 package cn.edu.gzhu;

package cn.edu.gzhu;

import java.util.regex.Matcher; import java.util.regex.Pattern;

public class WordDealUtil {

/**

* 将Java对象名称(每个单词的头字母大写)按照 * 数据库命名的习惯进行格式化

* 格式化后的数据为小写字母,并且使用下划线分割命名单词 *

* 例如:employeeInfo 经过格式化之后变为 employee_info *

* @param name Java对象名称 */

public static String wordFormat4DB(String name){

Pattern p = pile("[A-Z]"); Matcher m = p.matcher(name);

StringBuffer strBuffer = new StringBuffer();

while(m.find()){

//将当前匹配子串替换为指定字符串,

//并且将替换后的子串以及其之前到上次匹配子串之后的字符串段添加

到一个StringBuffer对象里 m.appendReplacement(strBuffer, "_"+m.group()); }

}

}

//将最后一次匹配工作后剩余的字符串添加到一个StringBuffer对象里 return m.appendTail(strBuffer).toString().toLowerCase();

2)写单元测试代码

package cn.edu.gzhu;

import static org.junit.Assert.*; import org.junit.Test;

public class WordDealUtilTest { }

@Test

public void testWordFormat4DB() { }

String target = "employeeInfo";

String result = WordDealUtil.wordFormat4DB(target);

assertEquals("employee_info", result);

3)进一步完善测试用例

单元测试的范围要全面,如对边界值、正常值、错误值的测试。运用所学的测试用例的设计方法,如:等价类划分法、边界值分析法,对测试用例进行进一步完善。继续补充一些对特殊情况的测试:

//测试当首字母大写时的情况

@Test public void wordFormat4DBegin(){

String target = "EmployeeInfo"; //测试 null 时的处理情况

@Test public void wordFormat4DBNull(){ }

//测试空字符串的处理情况

@Test public void wordFormat4DBEmpty(){ }

String target = "";

String result = WordDealUtil.wordFormat4DB(target);

assertEquals("", result); String target = null;

String result = WordDealUtil.wordFormat4DB(target);

assertNull(result);

}

String result = WordDealUtil.wordFormat4DB(target);

assertEquals("employee_info", result);

//测试当尾字母为大写时的情况

@Test public void wordFormat4DBEnd(){ }

//测试多个相连字母大写时的情况

@Test public void wordFormat4DBTogether(){ }

String target = "employeeAInfo";

String result = WordDealUtil.wordFormat4DB(target);

assertEquals("employee_a_info", result); String target = "employeeInfoA";

String result = WordDealUtil.wordFormat4DB(target);

assertEquals("employee_info_a", result);

4)查看分析运行结果,修改错误代码

再次运行测试。JUnit 运行界面提示我们有两个测试情况未通过测试(见图6),当首字母大写时得到的处理结果与预期的有偏差,造成测试失败(failure);而当测试对 null 的处理结果时,则直接抛出了异常——测试错误(error)。显然,被测试代码中并没有对首字母大写和 null 这两种特殊情况进行处理,修改如下:

//修改后的方法wordFormat4DB public static String wordFormat4DB(String name){ if(name == null){ return null; } Pattern p = pile("[A-Z]"); Matcher m = p.matcher(name); StringBuffer sb = new StringBuffer(); while(m.find()){ if(m.start() != 0) m.appendReplacement(sb, ("_"+m.group()).toLowerCase());

}

}

return m.appendTail(sb).toString().toLowerCase();

图6 示例2运行结果

2、使用Junit框架对类Date和类DateUtil(参见附录)进行单元测试。

只对包含业务逻辑的方法进行测试,包括: 类Date中的

isDayValid(int year, int month, int day) isMonthValid(int month) isYearValid(int year)

类DateUtil中的

本文来源:https://www.bwwdw.com/article/xkc4.html

Top