Java单元测试的介绍及应用

Java单元测试的介绍

​ 单元测试(模块测试)是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。例如,你可能把一个很大的值放入一个有序list 中去,然后确认该值出现在list 的尾部。或者,你可能会从字符串中删除匹配某种模式的字符,然后确认字符串确实不再包含这些字符了。

Java单元测试的好处

​ 提高开发速度,测试是以自动化方式执行的,提升了测试代码的执行效率。

提高软件代码质量,它使用小版本发布至集成,便于实现人员除错。同时引入重构概念,让代码更干净和富有弹性。

提升系统的可信赖度,它是回归测试的一种。支持修复或更正后的“再测试”,可确保代码的正确性。

Java单元测试的针对对象

​ 面向过程的软件开发针对过程。

面向对象的软件开发针对对象。

可以做类测试,功能测试,接口测试(最常用于测试类中的方法)。

Java单元测试的分类

​ 目前的最流行的单元测试工具是xUnit系列框架,常用的根据语言不同分为JUnit(java),CppUnit(C++),DUnit (Delphi ),NUnit(.net),PhpUnit(PHP )等等。

单元测试框架的第一个和最杰出的应用就是由Erich Gamma (《设计模式》的作者)和Kent Beck(XP(Extreme Programming)的创始人 )提供的开放源代码的JUnit。

JUnit相关信息

JUnit的概念

​ JUnit:是一个开发源代码的Java测试框架,用于编写和运行可重复的测试。它是用于单元测试框架体系xUnit的一个实例(用于java语言)。主要用于白盒测试,回归测试。

​ 白盒测试:把测试对象看作一个打开的盒子,程序内部的逻辑结构和其他信息对测试人员是公开的.

​ 回归测试:软件或环境的修复或更正后的再测试,自动测试工具对这类测试尤其有用。

JUnit的好处

可以使测试代码与产品代码分开。

针对某一个类的测试代码通过较少的改动便可以应用于另一个类的测试。

易于集成到测试人员的构建过程中,JUnit和Ant的结合可以实施增量开发。

JUnit是公开源代码的,可以进行二次开发。

可以方便地对JUnit进行扩展。

JUnit测试编写原则:

简化测试的编写,这种简化包括测试框架的学习和实际测试单元的编写。

使测试单元保持持久性。

可以利用既有的测试来编写相关的测试。

JUnit的特征

使用断言方法判断期望值和实际值差异,返回Boolean值。

测试驱动设备使用共同的初始化变量或者实例。

测试包结构便于组织和集成运行。

支持图型交互模式和文本交互模式。

JUnit框架组成

​ 对测试目标进行测试的方法与过程集合,可称为测试用例(TestCase)。

测试用例的集合,可容纳多个测试用例(TestCase),将其称作测试包(TestSuite)。

测试结果的描述与记录。(TestResult) 。

测试过程中的事件监听者(TestListener)。

每一个测试方法所发生的与预期不一致状况的描述,称其测试失败元素(TestFailure)

JUnit Framework中的出错异常(AsserTIonFailedError)。

JUnit框架是一个典型的Composite模式:TestSuite可以容纳任何派生自Test的对象;当调用TestSuite对象的run()方法是,会遍历自己容纳的对象,逐个调用它们的run()方法。3.5 JUnit中常用的接口和类

Test接口

​ Test接口:运行测试和收集测试结果

Test接口使用了Composite设计模式,是单独测试用例(TestCase),聚合测试模式(TestSuite)及测试扩展(TestDecorator)的共同接口。 它的public int countTestCases()方法,用来统计测试时有多少个TestCase。另外一个方法就是public void run( TestResult ),TestResult是实例接受测试结果, run方法执行本次测试。

TestCase抽象类

TestCase抽象类:定义测试中固定方法

TestCase是Test接口的抽象实现,(不能被实例化,只能被继承)其构造函数TestCase(string name)根据输入的测试名称name创建一个测试实例。由于每一个TestCase在创建时都要有一个名称,若测试失败了,便可识别出是哪个测试失败。

TestCase类中包含的setUp()、tearDown()方法。

setUp()方法集中初始化测试所需的所有变量和实例,并且在依次调用测试类中的每个测试方法之前再次执行setUp()方法。

tearDown()方法则是在每个测试方法之后,释放测试程序方法中引用的变量和实例。

开发人员编写测试用例时,只需继承TestCase,来完成run方法即可,然后JUnit获得测试用例,执行它的run方法,把测试结果记录在TestResult之中。

Assert静态类

Assert静态类:一系列断言方法的集合

Assert包含了一组静态的测试方法,用于期望值和实际值比对是否正确,即测试失败,Assert类就会抛出一AsserTIonFailedError异常,JUnit测试框架将这种错误归入Failes并加以记录,同时标志为未通过测试。如果该类方法中指定一个String类型的传参则该参数将被做为AsserTIonFailedError异常的标识信息,告诉测试人员改异常的详细信息。

JUnit 提供了6大类31组断言方法,包括基础断言、数字断言、字符断言、布尔断言、对象断言。其中assertEquals(Object expcted,Object actual)内部逻辑判断使用equals()方法,这表明断言两个实例的内部哈希值是否相等时,最好使用该方法对相应类实例的值进行比较。

而assertSame(Object expected,Object actual)内部逻辑判断使用了Java运算符“==”,这表明该断言判断两个实例是否来自于同一个引用(Reference),最好使用该方法对不同类的实例的值进行比对。

asserEquals(String message,String expected,String actual)该方法对两个字符串进行逻辑比对,如果不匹配则显示着两个字符串有差异的地方。

ComparisonFailure类提供两个字符串的比对,不匹配则给出详细的差异字符。

TestSuite测试包类

​ TestSuite测试包类??多个测试的组合

TestSuite类负责组装多个Test Cases。待测得类中可能包括了对被测类的多个测试,而TestSuit负责收集这些测试,使我们可以在一个测试中,完成全部的对被测类的多个测试。TestSuite类实现了Test接口,且可以包含其它的TestSuites。它可以处理加入Test时的所有抛出的异常。

TestSuite处理测试用例有6个规约(否则会被拒绝执行测试)

测试用例必须是公有类(Public)

用例必须继承与TestCase类

测试用例的测试方法必须是公有的( Public )

测试用例的测试方法必须被声明为Void

测试用例中测试方法的前置名词必须是test

测试用例中测试方法误任何传递参数

TestResult结果类

TestResult结果类和其它类与接口

TestResult结果类集合了任意测试累加结果,通过TestResult实例传递个每个测试的Run()方法。TestResult在执行TestCase是如果失败会异常抛出。

TestListener接口是个事件监听规约,可供TestRunner类使用。它通知listener的对象相关事件,方法包括测试开始startTest(Test test),测试结束endTest(Test test),错误,增加异常addError(Test test,Throwable t)和增加失败addFailure(Test test,AssertionFailedError t)。

TestFailure失败类是个“失败”状况的收集类,解释每次测试执行过程中出现的异常情况。其toString()方法返回“失败”状况的简要描述

JUnit运行流程

1、@BeforeClass修饰的方法会在所有方法被调用前被执行,而且该方法是静态的,所以当测试类被加载后接着就会运行它,而且在内存中它只会存在一份实例,它比较适合加载配置文件。 
2、@AfterClass修饰的方法通常用来对资源进行清理,如关闭数据库的连接; 
3、@Before和@After修饰的方法会在每个测试方法的前后各执行一次。

SpringBoot整合JUnit

​ pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
</dependency>

​ cn.gdmcmc.iovs

/**
 * SpringBoot 测试类
 *
 * @RunWith:启动器 SpringJUnit4ClassRunner.class:让 junit 与 spring 环境进行整合
 * @SpringBootTest(classes={App.class}) 1, 当前类为 springBoot 的测试类
 * @SpringBootTest(classes={App.class}) 2, 加载 SpringBoot 启动类。启动springBoot
 * junit 与 spring 整合@Contextconfiguartion("classpath:applicationContext.xml")
 */
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = {App.class})
public class UserServiceTest {

    @Autowired
    private UserServiceImpl userServiceImpl;

    @Test
    public void testSaveUser(){
        userServiceImpl.saveUser();
    }

}

JUnit其它注解

//测试类初始化方法,在启动时执行,注意,该方法为类方法(static)
@BeforeClass
//测试类的结束方法,一般为容器销毁时执行,也是类方法
@AfterClass
//每个测试方法执行前执行
@Before
//每个方法执行后执行
@After
//不执行的方法
@Ignore

JUnit注意事项

1、测试方法上必须使用@Test进行修饰 
2、测试方法必须使用public void进行修饰,不能带任何的参数 
3、新建一个源代码目录来存放我们的测试代码 
4、测试类的包应该和被测试类保持一致 
5、测试单元中的每个方法必须可以独立测试,测试方法间不能有任何的依赖 
6、测试类使用Test作为类名的后缀(不是必须) 
7、测试方法使用test作为方法名的前缀(不是必须)

JUnit失败的两种情况

1、Failure一般由单元测试使用的断言方法判断失败所引起的,这表示测试点发现了问题,就是说程序输出的结果和我们预期的不一样。 
2、error是由代码异常引起的,它可以产生于测试代码本身的错误,也可以是被测试代码中的一个隐藏的bug 
3、测试用例不是用来证明你是对的,而是用来证明你没有错。
发布了22 篇原创文章 · 获赞 5 · 访问量 1065

猜你喜欢

转载自blog.csdn.net/lighter613/article/details/102922454