单元测试

本文详细介绍了单元测试的不同类型,如单元测试、功能测试、组件测试等,并深入探讨了单元测试的概念、原则、好处,以及JUnit框架的使用,包括断言、测试组件与注解、Mock对象的运用。通过实例展示了如何进行单元测试,强调了单元测试在提高代码质量和减少调试时间上的重要性。
摘要由CSDN通过智能技术生成

1、测试类型有哪些?
各种常用的测试类型有:
测试类型
单元测试(unit test):

可测试代码的最小的一部分。通常是一个单一的方法,不会使用其它方法或者类。非常快!上千个单元测试能够在10秒以内跑完!单元测试永远不会使用:

  • 数据库
  • 一个app服务器(或者任何类型的服务器)
  • 文件/网络 I/O或者文件系统
  • 另外的应用
  • 控制台(System.out,system.err等等)
  • 日志
  • 大多数其他类(但不包括DTO‘s,String,Integer,mock和一些其他的类)

单元测试几乎总是回归测试套件(regression suite)的一部分。

回归测试套件(Regression Suite):

能够立刻被运行的测试用例的集合。一个例子就是放在一个特定文件夹中的能够被Junit运行的所有测试用例。一个开发人员能够在一天中把一个单元测试回归套件运行20次或者他们可能一个月跑两次功能测试回归套件。

功能测试(Functional Test):

比一个单元要大,比一个完整的组件测试要小。通常为工作在一起的的几个方法/函数/类。上百的测试用例允许运行几个小时。大部分功能测试是功能测试回归套件的一部分。通常由Junit来运行。

组件测试(Component Test):

运行一个组件。经常由QA,经理,XP客户等等来执行。这种类别的测试不是回归套件的一部分,它不由Junit来执行。

组件验收测试(Component Acceptance Test C.A.T.):

作为正常流程的一部分,它是在众多人面前运行的一个组件测试。由大家共同决定这个组件是不是满足需求标准。

集成测试(Integration Test):

测试两个或者更多的组件一起工作的情况。有时候是回归套件的一部分。

系统测试(system Test):

所有的组件在一起运行。

系统验收测试(System Acceptance Test S.A.T.):

作为正常流程的一部分,它是在众多人面前运行的一个系统测试,由大家来共同决定这个系统是不是满足需求标准。

压力测试(Stress Tests):

另外一个程序加载一个组件,一些组件或者整个系统。我曾经看到过把一些小的压力测试放到回归功能测试中来进行——这是测试并发代码的一个很聪明的做法。

2、单元测试介绍

2.1 单元测试简介

单元测试用于测试各个代码组件,并确保代码按照预期的方式工作。单元测试由开发人员编写和执行。大多数情况下,使用JUnit或TestNG之类的测试框架。测试用例通常是在方法级别写入并通过自动化执行。

单元测试不仅仅用来保证当前代码的正确性,更重要的是用来保证代码修复、改进或重构之后的正确性。

2.2 单元测试相关概念

2.2.1 正面测试(Positive Testing)

测试被测对象的正确功能实现无误,即正常流程功能。往往需要根据设计说明进行用例导出,严格按照设计说明编写即可,用例划分注意等价类区分等方法。

2.2.2 负面测试(Negative Testing)

测试被测对象的异常功能实现无误,多在异常流程,异常数据中体现。该部分测试需要对被测对象进行错误发散,常依赖于边界值区分等方法。

2.2.3 分支测试

使用流程图,明确可能出现的每条分支,制造响应的数据进行覆盖,实现对被测对象的测试。这个过程对于分支可以进行响应的简化,可以穿插等价类等方法去除同类分支。

2.2.3 边界值分析法

这种方法更偏向于黑盒测试用例设计中使用,对被测输入进行边界分析,从各个角度都会有边界值,例如程序内部依赖之间,已经有一些边界存在,在程序集成展示后,也会有新的边界出现,在设计的时候,需要注意这些细节。例如我们可输入范围是3-6,和输入类型为浮点数。那么边界值为7-8之间

3、单元测试的特性

3.1、单元测试的原则

为了提高开发人员的代码质量,编写高质量的单元测试,要遵守3R(Responsible, Reliable, Repeative)原则,具体含义如下:

Responsible: 谁开发谁负责测试,在哪里开发就在哪里测试。

Reliable: 测试case要可靠,并且是值得信赖的,对于底层的任何改动都要能够及时感知。

Repeative: 所有单元测试用例都要能够重复运行。能够重复运行就能够进行回归测试、覆盖率统计等等。

3.2、单元测试的好处

  1. 单元测试不但会使你的工作完成得更轻松。而且会令你的设计会变得更好,甚至大大减少你花在调试上面的时间
  2. 提高代码质量
  3. 减少bug,快速定位bug
  4. 放心地修改、重构

3.3、断言

断言 是一种放在程序中的一阶逻辑(如一个结果为真或是假的逻辑判断式),目的是为了标示与验证程序开发者预期的结果-当程序运行到断言的位置时,对应的断言应该为真。若断言不为真时,程序会中止运行,并给出错误消息

常用断言

序号 方法 描述
1 void assertEquals(boolean expected, boolean actual) 检查两个变量或者等式是否平衡
2 void assertTrue(boolean expected, boolean actual) 检查条件为真
3 void assertFalse(boolean condition) 检查条件为假
4 void assertNotNull(Object object) 检查对象不为空
5 void assertNull(Object object) 检查对象为空
6 void assertSame(boolean condition) 检查两个相关对象是否指向同一个对象
7 void assertNotSame(boolean condition) 检查两个相关对象是否不指向同一个对象
8 void assertArrayEquals(expectedArray, resultArray) 检查两个数组是否相等

上表列举了常用的八种断言,事实上我们在实际使用中并不需要自己编写这些基础的断言,java的编程框架JUnit已经集成了这些断言和一系列单元测试相关的函数。

JUnit 是一个 Java 编程语言的单元测试框架(回归测试框架)。JUnit 在测试驱动的开发方面有很重要的发展,是起源于 JUnit 的一个统称为 xUnit 的单元测试框架之一。JUnit 促进了“先测试后编码”的理念,强调建立测试数据的一段代码,可以先测试,然后再应用。

3.4、测试组件与注解

test suite: 测试套件,又称验证套件(validation suite),是测试用例的集合。

suite():

任何测试类都可以包含suite()静态方法,我们可以通过suite()返回任意的测试用例集合。无suite(),默认执行当前类所有的测试用例

举例:
TestCaseOne执行所有用例;
TestCaseTwo执行部分用例;
代码如下:

// TestClassOne.java
import junit.framework.*;
public class TestClassOne extends TestCase {
   
    public TestClassOne(String method) {
   
        super(method);
    }
    public void testadd(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值