`

junit4 单元测试

 
阅读更多

 

最近在做单元测试,于是,从网上找到一些资料并整理如下:

 

JUnit4 基本上是一个新框架,而不是旧框架的升级版本。其主要目标便是利用Java 5的Annotation特性简化测试用例的编写。

要求:JDK 5.0或以上版本。


Java注解((Annotation)的使用方法是@注解名 ,能通过简单的词语来实现一些功能。在junit中常用的注解有@Test、@Ignore、@BeforeClass、@AfterClass、@Before、@After、@Runwith、@Parameters

以下是相关的介绍和使用说明:

.@Test

在junit3中,是通过对测试类和测试方法的命名来确定是否是测试,且所有的测试类必须继承junit的测试基类。在junit4中,定义一个 测试方法变得简单很多,只需要在方法前加上@Test就行了。

注意:测试方法必须是public void,即公共、无返回数据。可以抛出异常。

.@Ignore

有时候我们想暂时不运行某些测试方法\测试类,可以在方法前加上这个注解。在运行结果中,junit会统计忽略的用例数,来提醒你。但是不建议经常这么做,因为这样的坏处时,容易忘记去更新这些测试方法,导致代码不够干净,用例遗漏。

.@BeforeClass

当我们运行几个有关联的用例时,可能会在数据准备或其它前期准备中执行一些相同的命令,这个时候为了让代码更清晰,更少冗余,可以将公用的部分提取出来,放在一个方法里,并为这个方法注解@BeforeClass。意思是在测试类里所有用例运行之前,运行一次这个方法。例如创建数据库连接、读取文件等。

注意:方法名可以任意,但必须是public static void,即公开、静态、无返回。这个方法只会运行一次。

.@AfterClass

跟@BeforeClass对应,在测试类里所有用例运行之后,运行一次。用于处理一些测试后续工作,例如清理数据,恢复现场。

注意:同样必须是public static void,即公开、静态、无返回。这个方法只会运行一次。

.@Before

与@BeforeClass的区别在于,@Before不止运行一次,它会在每个用例运行之前都运行一次。主要用于一些独立于用例之间的准备工作。比如两个用例都需要读取数据库里的用户A信息,但第一个用例会删除这个用户A,而第二个用例需要修改用户A。那么可以用@BeforeClass创建数据库连接。用@Before来插入一条用户A信息。

注意:必须是public void,不能为static。不止运行一次,根据用例数而定。

.@After

与@Before对应。

.@Runwith

首先要分清几个概念:测试方法、测试类、测试集、测试运行器。

其中测试方法就是用@Test注解的一些函数。测试类是包含一个或多个测试方法的一个**Test.java文件,测试集是一个suite,可能包含多个测试类。测试运行器则决定了用什么方式偏好去运行这些测试集/类/方法。

而@Runwith就是放在测试类名之前,用来确定这个类怎么运行的。也可以不标注,会使用默认运行器。

常见的运行器有:

1. @RunWith(Parameterized.class) 参数化运行器,配合@Parameters使用junit的参数化功能

2.@RunWith(Suite.class)
@SuiteClasses({ATest.class,BTest.class,CTest.class})

测试集运行器配合使用测试集功能

3.@RunWith(JUnit4.class)

junit4的默认运行器

4.@RunWith(JUnit38ClassRunner.class)

用于兼容junit3.8的运行器

5.一些其它运行器具备更多功能。例如@RunWith(SpringJUnit4ClassRunner.class)集成了spring的一些功能

.@Parameters

用于使用参数化功能。


其他:

1)对测试异常,JUnit 4可以用expected=Exception.class来期待一个预期的异常,而不必手动编写。参数 expected 代表测试方

法期望抛出指定的异常,如果运行测试并没有抛出这个异常,则 JUnit4 会认为这个测试没有通过。如:

publicint div(inta,int b){

return a / b;

}

可能会抛出除数为0的异常,可以这样来编写:

@Test(expected=ArithmeticException.class)

public void testDiv(){

cal.div(5, 0);

}

@Test(expected = NullPointerException.class)

public void unsupportedDBCheck() {

throw new NullPointerException();

}

2)设置最长执行时间

参数timeout,指定被测试方法被允许运行的最长时间应该是多少,如果测试方法运行时间超过了指定的毫秒数,则JUnit认为

测试失败。

@Test(timeout=1)

public void testMinus(){

assertEquals(cal.minus(2, 1), 1);

}

3)Ignore 用于暂时忽略某个测试方法,因为有时候由于测试环境受限,并不能保证每一个测试方法都能正确运行。

@Ignore("db is down")

@Test(expected=UnsupportedDBVersionException.class)

public void unsupportedDBCheck(){

}

3)类级别的Fixture设置方法

注解@BeforeClass修饰用于初始化Fixture的方法。注解@AfterClass 修饰用于注销Fixture的方法。由于这二个方法在运行其间仅执行一次,因此它们只能标记为静态方法(使用 public static void 修饰,而且不能带有任何参数),其实在所有的测试方法中

共享的资源也必须是静态引用。如:

@BeforeClass

public static void dbInit(){//类级别Fixture初始化方法

}

@AfterClass

public static void dbClose(){//类级别Fixture注销方法

}

类级别的Fixture方法,仅会在测试类中所有测试方法执行之前执行初始化,并在全部测试方法测试完毕之后执行注销方法。

4)测试运行机

JUnit 中所有的测试方法都是由它负责执行的。JUnit 为单元测试提供了默认的测试运行器,但 JUnit 并没有限制您必须使用默认的2


运行器。相反,您不仅可以定制自己的运行器(所有的运行器都继承自 org.junit.runner.Runner),而且还可以为每一个测试类指

定使用某个具体的运行器。指定方法也很简单,使用注解 org.junit.runner.RunWith 在测试类上显式的声明要使用的运行器即可:

@RunWith(CustomTestRunner.class)

public class TestWordDealUtil{

}

5)测试套件

JUnit 提供了一种批量运行测试类的方法,叫做测试套件。这样,每次需要验证系统功能正确性时,只执行一个或几个测试套件便可

以了。测试套件的写法非常简单,需要遵循以下规则:

(1)创建一个空类作为测试套件的入口。

(2)使用注解 org.junit.runner.RunWith 和 org.junit.runners.Suite.SuiteClasses 修饰这个空类。

(3)将 org.junit.runners.Suite 作为参数传入注解 RunWith,以提示 JUnit 为此类使用套件运行器执行。

(4)将需要放入此测试套件的测试类组成数组作为注解 SuiteClasses 的参数。

(5)保证这个空类使用 public 修饰,而且存在公开的不带有任何参数的构造函数。

importorg.junit.runner.RunWith;

importorg.junit.runners.Suite;


@RunWith(Suite.class)

@Suite.SuiteClasses({TestWordDealUtil.class,xxx.class})

public class RunAllUtilTestsSuite {

}

测试套件中不仅可以包含基本的测试类,而且可以包含其它的测试套件,这样可以很方便的分层管理不同模块的单元测试代码。但

是,您一定要保证 测试套件之间没有循环包含关系。

6)参数化测试

(1)为准备使用参数化测试的测试类指定特殊的运行器 org.junit.runners.Parameterized。

(2)为测试类声明几个变量,分别用于存放期望值和测试所用数据。

(3)为测试类声明一个使用注解 org.junit.runners.Parameterized.Parameters 修饰的,返回值为 java.util.Collection 的公共静

态方法,并在此方法中初始化所有需要测试的参数对。

(4)为测试类声明一个带有参数的公共构造函数,并在其中为第二个环节中声明的几个变量赋值。

(5)编写测试方法,使用定义的变量作为参数进行测试。

@RunWith(Parameterized.class)

public class TestWordDealUtilWithParam {

private String expected;

private String target;


@Parameters

public static Collection words(){

returnArrays.asList(new Object[][]{

{"employee_info", "employeeInfo"},        //测试一般的处理情况

{null, null},                            //测试 null 时的处理情况

{"", ""},                                //测试空字符串时的处理情况

{"employee_info", "EmployeeInfo"},        //测试当首字母大写时的情况

{"employee_info_a", "employeeInfoA"},    //测试当尾字母为大写时的情况

{"employee_a_info", "employeeAInfo"}    //测试多个相连字母大写时的情况

});

}


publicTestWordDealUtilWithParam(String expected , String target){

this.expected = expected;

this.target = target;

}

//测试将 Java 对象名称到数据库名称的转换

@Test

public void wordFormat4DB(){

assertEquals(expected, WordDealUtil.wordFormat4DB(target));

}

分享到:
评论

相关推荐

    Junit4单元测试必备入门教程

    JUnit单元测试的重要性 ------------------- 单元测试是java开发必备技能,它可以确保代码的正确性和可靠性。JUnit是一个流行的单元测试框架,它可以帮助开发者快速地编写和执行单元测试。 JUnit4的改进 ---------...

    junit4单元测试

    JUnit4是Java编程语言中最广泛使用的单元测试框架之一,它为开发者提供了一种方便、高效的方式来验证代码的正确性。这个压缩包文件包含了JUnit4的相关库,使得开发人员能够轻松地在他们的项目中引入单元测试功能。...

    Junit4单元测试

    **Junit4单元测试详解** 单元测试是一种软件开发中的重要实践,它允许开发者对程序的各个独立组件进行验证,确保它们在孤立环境中按照预期工作。JUnit是Java编程语言中最广泛使用的单元测试框架,而Junit4是其一个...

    junit4 单元测试源码

    【标题】"junit4 单元测试源码"涉及的是Java编程中单元测试的重要工具JUnit4的使用,这是对代码进行验证和调试的关键部分。JUnit4是JUnit框架的一个版本,它提供了更灵活的注解、测试套件管理和断言方式,使得编写...

    Junit4单元测试源码

    多数Java的开发环境都已经集成了JUnit作为单元测试的工具。 [1] JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework)。Junit测试是程序员测试,即所谓白盒测试,因为...

    在Eclipse中使用JUnit4进行单元测试

    在Eclipse中使用JUnit4进行单元测试是一种常见的Java开发实践,它可以帮助开发者确保代码的正确性和稳定性。单元测试是软件开发中的重要环节,通过编写针对代码各个独立模块的测试用例,可以验证代码功能是否按预期...

    junit4单元测试实例

    本篇文章将深入探讨JUnit4的单元测试实例,帮助你更好地理解和应用这个工具。 一、JUnit4简介 JUnit4相较于之前的版本,引入了注解(Annotation)机制,极大地简化了测试用例的编写。例如,`@Test`注解用于标记测试...

    Junit4单元测试个人笔记

    《Junit4单元测试个人笔记》 单元测试是软件开发过程中的重要环节,它能确保代码的正确性和稳定性。本文主要介绍了使用Junit4进行单元测试的一些规范和Eclipse中的应用。 首先,遵循一定的测试规范至关重要。测试...

    junit4单元 测试

    JUnit4是Java编程语言中最广泛使用的单元测试框架之一,它为开发者提供了强大的工具来编写和运行可重复的、可靠的测试代码。JUnit4引入了许多新特性,显著提升了测试的灵活性和可维护性。以下是对JUnit4核心知识点的...

    Junit4单元测试入门例子

    Junit4作为Java领域最常用的单元测试框架,为开发者提供了方便、高效的测试工具。本文将深入探讨如何使用Junit4对名为Calculate的类进行单元测试,包括其加减乘除四个方法。 首先,我们需要了解Junit4的基本结构和...

    反射和注解模拟JUnit4单元测试例子

    介绍如何利用反射和注解去简单的模拟JUnit4单元测试的使用,之所以选择JUnit4是因为4.0以后最大的改进就是使用了注解。需要注意的是这里并不是完全的模拟,只是简单实现了一下Runner类和JUnit注解相关的工作流程。...

    单元测试之道(Java):使用JUnit进行单元测试

    单元测试之道(Java):使用JUnit进行单元测试。单元测试是提高代码质量的有效手段,但大部分开发人员由于种种原因都不乐意进行单元测试。

    spring+mybatis+junit4单元测试

    改代码是我的我的一个项目自己写完后自测所以就写了这个junit的单元测试类,以及可能会遇到的一些问题,以及其中的一些经验,项目用的是spring + mybatis。我写的这个测试类基本概括了单元测试的基本用法,只要按照...

    JUnit4单元测试入门详解.pdf

    总之,JUnit 4作为Java单元测试的重要工具,通过引入注解等特性简化了测试用例的编写,并且在实际开发和测试中带来了极大的便利。对于Java开发者而言,掌握JUnit 4的使用是提高代码质量和开发效率的重要技能之一。

    单元测试利器JUnit4

    JUnit4作为Java平台上最流行的单元测试框架,极大地简化了测试代码的编写和执行。本篇将深入探讨JUnit4的相关知识点,帮助你更好地掌握这个强大的工具。 1. JUnit4简介: JUnit4是由Ernst Kuhr和Kent Beck开发的...

    junit4单元测试报错:method initializationerror not found

    junit4单元测试报错:method initializationerror not found 缺少jar包导致,总共需要三个jar包:junit-4.11.jar,hamcrest-core-1.3.rc2.jar,hamcrest-library-1.3.rc2.jar,都在压缩包里了。

Global site tag (gtag.js) - Google Analytics