第08章 单元测试

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单元测试
主讲教师: 丁月华 Email:ding_mickey@
单元测试效益
WHPU
1-2
本章教学目标

理解软件测试的背景、软件缺陷和故障的概念 理解软件测试的意义 理解软件开发过程与软件测试的关系 理解软件质量的概念及质量保证体系
WHPU
1-3
内容



8.1单元测试的基本概念 8.2 单元测试的任务 8.3单元测试的规程 8.4 单元测试的测试代码编写 8.5案例分析: 测试Grow函数
WHPU
1-30
补充:一个单元测试的实例(JUNIT技术)
WHPU
1-31
补充:一个单元测试的实例(JUNIT技术)
import junit.framework.*; public class TestLargest extends TestCase{ public TestLargest(String name){ super(name); } public void testDups(){ assertEquals(9, rgest(new int[] {9,8,7,9})); } }

WHPU
1-15
8.4 单元测试的测试代码编写

被测CMyClass类

Add(int,int)
WHPU
1-16
8.4 单元测试的测试代码编写

测试类CMyClassTester辅助方法
caseBegin() caseEnd()

WHPU
1-17
8.4 单元测试的测试代码编写

测试类CMyClassTester辅助方法
WHPU
1-28
补充:一个单元测试的实例(JUNIT技术)
import junit.framework.*; public class TestLargest extends TestCase{ public TestLargest(String name){ super(name); } public void testOrder(){ assertEquals(9, rgest(new int[] {9,8,7})); assertEquals(9, rgest(new int[] {7,9,8})); assertEquals(9, rgest(new int[] {7,8,9})); } } 运行结果:junit.framework.AssertionFailedError: expected:<9> but was:<8> 错误定位: index < list.length - 1改为index < list.length
WHPU
1-4
8.1单元测试的基本概念

1. 单元测试的概念

单元测试可看作是编码工作的一部分,是由程序员自己来完 成,最终受益的也是程序员自己。 对象: 软件设计的最小单位——模块。

依据: 详细设计文档描述,单元测试应对模块内所有重要的 控制路径设计测试用例,以便发现模块内部的错误。
单元测试多采用白盒测试技术,系统内多个模块可以并行地 进行测试



4.性能测试
运行时间:采用记录点方法 占用空间:代码空间、数据空间、堆、栈

精度
WHPU
1-13
8.3.2测试类型及要求

5.逻辑测试:常用的覆盖率包括
语句覆盖 判定覆盖 条件覆盖

WHPU
1-14
8.3.3通过准则

单元测试的通过与否可以参考如下准则
功能与设计说明一致; 性能达到软件设计指标; 命名和编码符合规则; 逻辑测试达到规定的覆盖率,若达不到规定指标,应在测试 报告中给出合理解释; 对发现的问题已进行修改并通过回归测试。

WHPU
1-27
补充:一个单元测试的实例(JUNIT技术)

测试代码
public class Largest { public static int largest(int[] list){ int index, max = 0; for (index = 0; index < list.length - 1; index ++){ if( list[index] > max){ max = list[index];} } return max; } }
WHPU
1-7
8.3单元测试的规程

单元测试环境

驱动程序:“主程序”,接受测 试用例数据,将这些数据传递给 将要测试的构件 桩程序:替换那些从属于将要测 试的构件或被其调用的构件


8.3.1进入条件


8.3.2测试类型及要求
8.3.3通过准则
WHPU
1-8
8.3.1进入条件

进入单元测试必须满足一定的条件,这些条件是测试 实施的基础。通常包含以下4个方面:
1-20
补充:一个单元测试的实例(JUNIT技术)

JUNIT安装 JUNIT框架简介 JUnit测试骨架 实例
WHPU
1-21
补充:一个单元测试的实例(JUNIT技术)

JUNIT安装

Java的JUnit可从网上免费下载 将下载的junit.zip解压到你指定的目录 设置环境变量
WHPU
1-29
补充:一个单元测试的实例(JUNIT技术)

测试代码
public class Largest { public static int largest(int[] list){ int index, max = 0; for (index = 0; index < list.length ; index ++){ if( list[index] > max){ max = list[index];} } return max; } }

运行结果:正确
WHPU
1-32
补充:一个单元测试的实例(JUNIT技术)
WHPU
1-33
补充:一个单元测试的实例(JUNIT技术)
import junit.framework.*; public class TestLargest extends TestCase{ public TestLargest(String name){ super(name); } public void testOne(){ assertEquals(1, rgest(new int[] {1})); } }
① ②
Variable:CLASSPATH Variable Value: .;Install Path/junit.jar

对于IDE环境,对于需要用到的JUnit的项目增加到lib中, 其设置不同的IDE有不同的设置 .

推荐书籍:单元测试之道Java版—使用JUnit
WHPU
1-22
补充:一个单元测试的实例(JUNIT技术)

add_int_int():ASSERT是VC的断言宏
WHPU
1-18
8.5案例分析: 测试Grow函数

在单元测试阶段,一个 测试用例,就是设定输 入数据,运行被测试函 数,然后判断实际输出 是否符合预期。
WHPU
1-19
8.5案例分析: 测试Grow函数

测试函数中的一个测试 用例
WHPU

JUNIT框架简介
WHPU
1-23
补充:一个单元测试的实例(JUNIT技术)

JUnit测试骨架

import junit.framework.* extends TestCase 调用super(String)构造函数 自定义testXXX()函数,该函数可以由JUNIT自动运行; testXXX()函数通过调用一个assert<Condition>方法来 执行测试
WHPU
1-24
补充:一个单元测试的实例(JUNIT技术)

测试代码
public class Largest { public static int largest(int[] list){ int index, max = Integer.MAX_VALUE; for (index = 0; index < list.length - 1; index ++){ if( list[index] > max){ max = list[index];} } return max; } }

数据流分析。通过软件测试 工具,自动分析、识别并检 出发生异常的数据。
表达式分析。通过软件测试 工具,自动分析被测软件的 表达式,确定表达式是否满 足其技术要求。


1-12
质量度量指标
WHPU
8.3.2测试类型及要求

3.功能测试:测试用例设计应考虑如下几个方面
单元的正常值的等价类输入数据测试; 单元的非正常值的等价类输入数据测试; 单元的边界值的输入数据测试。
public void testSimple(){ assertEquals(9, rgest(new int[] {7,8,9})); } }
运行结果:junit.framework.AssertionFailedError: expected:<9> but was:<2147483647> 错误定位: Integer.MAX_VALUE改为0


满足规定的文档要求;
软件单元源程序已无错误地通过编译或汇编
被测软件单元已纳入配置管理中,并确定所提交的版本为本 阶段最终版本;
已具备了满足要求的测试环境和测试工具。

WHPU
1-9
8.3.2测试类型及要求



1. 代码审查 2. 静态分析 3 .功能测试 4 .性能测试 5 .逻辑测试
WHPU
1-25
补充:一个单元测试的实例(JUNIT技术)

测试用例




{9,8,7} //考虑最简单的 {7,9,8} //考虑顺序性 {7,8,9} //考虑顺序性 {9,7,9,8} //考虑元素重复性 {1}//考虑极端1个元素 {-9,-8,-7}//考虑负数情况 {}//考虑空组情况 {9,8,7} //考虑最简单的 {9,8,7},{7,9,8}, {7,8,9} //考虑顺序性 {9,7,9,8} //考虑元素重复性 {-9,-8,-7}//考虑负数情况 {1}//考虑极端1个元素 {}//考虑空组情况
WHPU

Junit测试类一个单元测试的实例(JUNIT技术)
import junit.framework.*; public class TestLargest extends TestCase{ public TestLargest(String name){ super(name); }

运行结果:正确
WHPU
1-34
补充:一个单元测试的实例(JUNIT技术)
import junit.framework.*; public class TestLargest extends TestCase{ public TestLargest(String name){ super(name); } public void testNegative(){ assertEquals(-7, rgest(new int[] {-9,-8,-7})); } }

4.单元测试的特点

它是一种验证行为。

1-6
它是一种设计行为。
\
它是一种编写文档的行为。
它具有回归性。
WHPU
8.2 单元测试的任务

单元测试任务包括 (测试细节 见教材139) :


模块接口测试
模块局部数据结构测试 模块边界条件测试 模块中所有独立执行通路测试 模块的各条错误处理通路测试


2.单元测试的作用:用来验证这段代码的行为是否与我们期
望的一致。程序员应养成单元测试的习惯
WHPU
1-5
8.1单元测试的基本概念

3.单元测试进行的时机

编写产品函数的框架


编写测试函数
针对产品函数的功能编写测试用例 然后编写产品函数的代码,每写一个功能点都运行测试,随时补充测试用例。
极限编程(EP)倡导测试驱动(TDD)的开发
WHPU
1-10
8.3.2测试类型及要求

1. 代码审查

编制检查单(如表8-1),检查单应经过评审 对照检查单进行人工审查或在软件测试工具的辅助下完成审 查
WHPU
1-11
8.3.2测试类型及要求

2. 静态分析

控制流程分析。通过软件测 试工具,将程序的控制语句 转化成相应的可视化控制图 形,通过图形识别并检出程 序中的缺陷和错误。
相关文档
最新文档