单元测试(理论)
简介
1、单元测试的基本概念
2、单元测试的策略
3、单元测试的步骤
4、Junit测试简单Java程序
1.单元测试概念
什么是单元测试?
单元测试是一种验证行为,是指对软件中的最小可测试单元进行检查和验证,在于发现模块内部可能存在的错误,主要基于白盒测试;
最小可测单元:
结构化程序:函数或者过程;
面向对象:类或类的方法;
也可能是多个程序文件中的一组函数
2.单元测试的目的
单元测试的目的:检查单元模块内部的错误,为软件的评审验收提供依据。
做单元测试需考虑以下内容:
单元测试是以程序设计说明书和之前所作的测试数据(正常的和错误的)为指导,测试模块内重要的路径,以检查出错误;
检验信息能否正确地流入和流出单元;
在单元测试工作过程中,其内部数据能否保持其完整性,包括内部数据的形式、内容及相互关系不发生错误,也包括全局变量在单元中的处理和影响。
在为限制数据加工而设置的边界处,能否正确工作。
单元的运行能否做到满足特定的逻辑覆盖。
单元中发生了错误,其中的出错处理措施是否有效。
3.单元测试内容
单元测试通过编写测试代码,用来检测特定的、明确的、细颗粒的功能。单元测试方法包括以下几种:
独立路径:通常是指完成模块功能的主要路径,一般是控制结构。保证每一条代码,每个分支都经过测试;
边界条件:包括循环边界,最大最小值、控制流中等于、大于、小于的比较值等;
出错处理:检查“错误处理程序”本身的错误,保证每一个异常都经过测试
模块接口:用来保证接口功能的正确性。I/O 参数值的个数、类型、次序、格式是否正确,I/O文件属性、操作是否正确等
局部数据结构:
变量没有赋值(即为NULL)
变量是数值(或字符)
主要边界:最小值,最大值,无穷大
溢出边界:(期望异常或拒绝服务)
:最小值-1,最大值+1
临近边界:最小值+1,最大值-1
变量是字符串
引用“字符变量”的边界
空字符串
对字符串长度应用“数值变量”的边界
变量是集合
空集合
对集合的大小应用“数值变量”的边界
调整次序:升序、降序
变量有规律
比如对于Math.sqrt,给出n^2-1,
和n^2+1的边界
4.单元测试的环境
5.什么是驱动模块
驱动模块在大多数场合称为“主程序”。
驱动模块模拟主程序或者调用模块的功能,它模拟主程序接收测试数据并将这些数据传递到被测试模块,被测试模块被调用后,“主程序”打印“进入-退出”消息。
驱动模块处于被测试模块的上层,驱动模块较容易实现。
6.什么是桩模块
桩模块用于模拟那些由被测模块所调用的下属模块的功能,由于下属模块往往不只一个,也不只一层,由于模块接口的复杂性,桩模块很难模拟各下层模块之间的调用关系,同时为了模拟下层模块的不同功能,需要编写多个桩模块,而这些桩模块所模拟的功能是否正确,也很难进行验证。
7.单元测试策略
单元测试方法
单元测试原则
单元测试过程
常用工具
8.单元测试方法
单元测试有三种常用的设计方法:
自顶向下测试策略:
自底向上
独立
9.自顶向下的单元测试策略
方法:
先对最顶层的单元进行测试,把顶层所调用的单元做成桩模块。其次对第二层进行测试,使用上面已测试的单元做驱动模块。如此类推直到测试完所有模块。
特点:
单元测试策略在执行上同详细设计一致;
单元测试被桩模块控制,越往后,测试过程越复杂;
并行性不好,低层单元测试要等到上层单元测试完毕才可进行
9.自顶向上的单元测试策略
方法: 先对模块调用层次图上最低层的模块进行单元测试, 模拟调用该模块的模块做驱动模块。然后再对上面一层做单元测试,用下面已被测试过的模块做桩 模块。以此类推,直到测试完所有模块。 特点 测试用例从功能设计中取得,不需要桩模块; 并行性好; 顶层单元测试要等到低层单元测试完毕才可进行;
10.独立测试
方法: 不考虑每个模块与其他模块之间的关系,为每个模块设计桩模块和驱动模块。每个模块进行独立的单元测试。
特点:
简单易操作。
可并行进行、达到高的结构覆盖率。
11.单元测试原则
测试用例根据详细设计文档设计:
为系统运行设计用例;(用最简单的方法执行被测单元)
为正向测试设计用例;(验证设计说明书所对应的功能项或性能指标是否达到)
为逆向测试设计用例; (验证被测单元有没有做它不应该做的事情)
为满足特殊需求设计用例;(从系统的性能、安全、保密性的角度设计测试用例)
为代码覆盖设计用例;(保证较高的代码测试覆盖率)
为覆盖率指标完成设计用例;(对复杂的判断条件、循环以及分支语句,在执行测试过程中,覆盖率指标没有达到,分析原因可能有:不可能的路径或分支、不可能或冗余的代码、不充分的测试用例。)
12.测试过程
13.单元测试常用工具
目前的最流行的单元测试工具是xUnit系列框架,常用的根据语言不同分为:
JUnit(java)
Nunit(.net)
CppUnit(C++)
Dunit (Delphi )
PhpUnit(Php )
等等
14.用junit测试简单的Java程序
Junit ,是xUnit单元测试框架体系的一个实例(用于java语言),是一个开放源代码的Java测试框架,用于编写和运行可重复的测试。
主要用于白盒测试,回归测试。
15.Test Case
TestCase是Test接口的抽象实现,(不能被实例化,只能被继承),也是Junit工具的核心部分。
其构造函数TestCase(string name)根据输入的测试名称name创建一个测试实例。
由于每一个TestCase在创建时都要有一个名称,若某测试失败了,便可识别出是哪个测试失败
16.Test Case的方法
一个TestCase主要包括以下几个方法:
• setUp()方法,在测试方法前调用,一般用来做测试准备工作。
• tearDown()方法,在测试方法后调用,一般作测试的清理工作。
• setUpBeforeClass()方法,在整个类初始化之前调用,一般用来做测试准备工作
• tearDownAfterClass()方法,在整个类结束之前调用,一般作测试的清理工作
17.Test Case的生命周期
18.Test Case编写注意事项
JUnit按照在测试用例中的顺序执行。
测试方法可以和被测试的方法一 一对应,测试方法也可以包含多个被测试的方法。
测试方法中,使用断言(assertXXX和fail) 来进行测试结果判断,也可以辅以文字打印说明,如果测试程序抛出异常,则显示为错误,如果断言失败,则显示故障。
测试用例必须覆盖被测试类、方法的所有功能,包括正常情况、异常情况和发生错误的情况都必须覆盖,才能保证测试的完整性。
19.JUNIT常用断言
断言:判断期望值与实际值是否相同
assertEquals: 验证给定对象是否符合期望值。
assertTrue / assertFalse : 该断言用来验证给定的布尔型值(boolean)是否为真/假,如果结果为假/真,则验证失败。
assertNull: 该断言用来验证给定的对象是否为空( null ),如果不为null,则验证失败。
Fail : 用于抛出错误,终止测试。该断言会使测试立即失败。
19.Eclipse+junit
最为流行的 IDE,它全面集成了 JUnit,并从版本3.2 开始支持 JUnit 4。不用安装就可以在你的项目中开始测试相关的类,并且可以调试你的测试用例和被测试类。
Junit测试步骤:
– 安装eclipse,创建被测对象。
– 将Junit4的jar包添加到项目的library中
实例
怎么导junit包呢?点击Build Path 然后有个Configure Build Path 如下图 点击进去
把上图那个加载进去就行了(有几个版本的 像3.4.5可以选择版本)
然后上图这个就是建测试类 咱们今天用到的就是上面那个
上面这一个图一定要记得有圈出来的这是一定要的哈!!!
我们在上面那张图必须是要写了代码的哈
DBHelper
package com.zking