JUnit 4是JUnit框架有史以来的最大改进,其主要目标便是利用Java 5的Annotation特性简化测试用例的编写。让我们看看如何使用JUnit 4来进行Unit测试。
请注意:本文主要介绍JUnit 4的最新特性和用法,并不会讲解Unit测试的基础。如果你对JUnit框架还不熟悉,请先参考“在Eclipse中使用JUnit”一文,学习如何编写JUnit测试。
我们使用的开发环境是Eclipse 3.2,它已经自带了JUnit 4.1,你需要将JUnit 4 Library添加到项目用到的Library中。另外,必须使用JDK 5.0或更高版本。
要在Eclipse环境之外运行JUnit,需要下载JUnit 4.1,具体请访问JUnit.org。
我们先看一个简单的Math类:
ActionScript/Java代码
- package com.crackj2ee.junit4;
- public class Math {
-
- public int abs(int value) {
- return value>=0 ? value : (-value);
- }
-
- public int div(int a, int b) {
- return a / b;
- }
-
-
-
-
- public float exp(int a, int b) {
- float r = 1;
- for(int i=0; i<b; i++)
- r = r * a;
- return r;
- }
- }
注意exp()方法是有Bug的,如果传入参数2, -1,则期待的返回值应为0.5F,但实际返回值为1.0F。
下面我们看看传统的JUnit的TestCase:
ActionScript/Java代码
- public class MathTest extends TestCase {
-
- public void setUp() { super.setUp(); }
- public void tearDown() { super.tearDown(); }
-
- public void testAbs() { assertTrue(true); }
- public void testDiv() {...}
- public void testExp() {...}
-
- }
JUnit依赖反射来执行每个以test开头的方法。然而,在最新的JUnit 4中,由于有了Annotation的支持,我们的测试方法不需要再以testXxx标识了,而是写上一个@Test标注即可。例如:
@Test public void doAbs() {...}
甚至MathTest类也不必继承自TestCase。你也许会想到,不继承自TestCase就无法调用assertXxx方法了,正因为如此,所有的 assertXxx方法全部以静态方法被放入了Assert类,使用Assert.assertXxx()调用。如果使用
import static org.junit.Assert.*;
则原有的代码不必改动。
setUp()和tearDown()方法也依赖@Before和@After标记,这样做的最大的好处是在继承体系内不必担心忘记了在setUp()方 法中调用父类的super.setUp()方法,JUnit框架会自动处理父类的@Before和@After标记的方法。
并且,JUnit框架对@Before和@After的调用顺序类似于类的构造方法和析构方法,即@Before按照父类到子类的顺序调用,@After则相反,这样保证了资源的正确获取和释放。
当然,不再强迫必须使用setUp和tearDown作为方法名,可以使用更有意义的方法名,例如:initDatabase()和closeDatabase(),只要它们被标注了@Before和@After即可。
来看看使用Annotation的MathTest:
ActionScript/Java代码
- package com.crackj2ee.junit4;
-
- import static org.junit.Assert.*;
-
- import org.junit.*;
-
- public class MathTest
- {
-
- public MathTest()
- {
- System.out.println("new MathTest instance.");
- }
-
- @Before public void setUp()throws Exception
- {
- System.out.println("call @Before before a test method");
- }
-
- @After public void tearDown()throws Exception
- {
- System.out.println("call @After after a test method");
- }
-
- @Test public void doAbs()
- {
- Math math = new Math();
- assertEquals(200, math.abs(200));
- assertEquals(100, math.abs( - 100));
- assertEquals(0, math.abs(0));
- }
-
- @Test public void doDiv()
- {
- Math math = new Math();
- assertEquals(5, math.div(100, 20));
- assertEquals(4, math.div(100, 21));
- }
-
- @Test(expected = ArithmeticException.class)public void doDiv0()
- {
- new Math().div(127, 0);
- }
-
- @Test(timeout = 1)public void doLongTimeTask()
- {
- double d = 0;
- for (int i = 1; i < 10000000; i++)
- d += i;
- }
-
- @Test public void testExp()
- {
- Math math = new Math();
- assertEquals(32f, math.exp(2, 5), 0.001f);
- assertEquals(1f, math.exp(2, 0), 0.001f);
- assertEquals(0.5f, math.exp(2, ( - 1)), 0.001f);
- }
-
- }
对测试异常,JUnit 4可以用expected=Exception.class来期待一个预期的异常,而不必编写
ActionScript/Java代码
- try {
- ...
- fail("No exception");
- }
- catch(Exception e) {
-
- }
来看看doDiv0测试,我们期待一个除数为0的ArithmeticException,因此编写如下测试方法:
ActionScript/Java代码
- @Test(expected=ArithmeticException.class)
- public void doDiv0() {
- new Math().div(127, 0);
- }
对于非常耗时的测试,@Test还有一个timeout来标识该方法最长执行时间,超过此时间即表示该测试方法失败:
ActionScript/Java代码
- @Test(timeout=1)
- public void doLongTimeTask() {
- double d = 0;
- for(int i=1; i<10000000; i++)
- d+=i;
- }
以上方法若执行时间超过1ms则测试失败,由于依赖CPU的执行速度,在不同的机器上测试结果也不同。
JUnit 4另一个较大的变化是引入了@BeforeClass和@AfterClass,它们在一个Test类的所有测试方法执行前后各执行一次。这是为了能在 @BeforeClass中初始化一些昂贵的资源,例如数据库连接,然后执行所有的测试方法,最后在@AfterClass中释放资源。
正如你能想到的,由于@BeforeClass和@AfterClass仅执行一次,因此它们只能标记静态方法,在所有测试方法中 共享的资源也必须是静态引用:
ActionScript/Java代码
- private static Object dbConnection;
-
- @BeforeClass
- public static void setUpBeforeClass() throws Exception {
- System.out.println("call @BeforeClass and init database connection");
- dbConnection = new Object();
- }
-
- @AfterClass
- public static void tearDownAfterClass() throws Exception {
- System.out.println("call @AfterClass to release database connection");
- dbConnection = null;
- }
最后执行测试用例,可以看到结果:
各个方法执行顺序如下:
call @BeforeClass and init database connection
new MathTest instance.
call @Before before a test method
call @After after a test method
new MathTest instance.
call @Before before a test method
call @After after a test method
...
call @AfterClass to release database connection
可以看到,@BeforeClass是在实例化MathTest之前调用的,因此不能在构造方法中初始化共享资源。
最后需要注意的是由于Java 5的自动Box/Unbox特性,在调用assertEquals()时要特别注意,如果你传入:
assertEquals(100F, 100);
则按照自动Box变为:
assertEquals(new Float(100F), new Integer(100));
测试失败,因为Float类和Integer类不是同一类型。
因此要特别注意float和double的测试。事实上对float和double应使用
assertEquals(float, float, float delta);
assertEquals(double, double, double delta);
delta指定了两个作比较的浮点数的相差范围,在此范围内的两个浮点数将认为相等。可以传入一个很小的数例如0.0001F。
JUnit 4非常适合使用Java 5的开发人员,但是无法在Java 1.4中获得这些好处,并且,也不与以前的版本兼容。因此,如果你正在使用Java 5,就可以考虑使用JUnit 4来编写测试。
分享到:
相关推荐
包涵了junit4新特性assertThat断言和mysql,oracle俩种数据库的增删改查测试
因 jdk5 中的新特性,JUnit4 也因此有了很大的改变。下面详细介绍 JUnit4 的使用方法,只是举个例子说明junit4 的使用
JUnit4是JUnit框架有史以来的最大改进,其主要目标便是利用Java5的Annotation特性简化测试用例的编写。
NULL 博文链接:https://vb2005xu.iteye.com/blog/1273025
详细介绍了junit4测试框架的使用和特性
本文介绍了JUnit 4并不是第一个提供基于注释的灵活模型的Java:trade_mark:测试框架。...本文还讨论TestNG不同于JUnit 4的一些特性,并提议采用一些方法,使得这两个框架能继续互相补充,而不是互相竞争。
JUnit 是 Java™ 语言事实上的 标准单元测试库。...在本文中,执着的代码测试人员 Elliotte Harold 以 JUnit 4 为例,详细介绍了如何在自己的工作中使用这个新框架。注意,本文假设读者具有 JUnit 的使用经验。
JUnit4是JUnit框架有史以来的最大改进,其主要目标便是利用Java5的Annotation特性简化测试用例的编写。
Junit4教程 关于junit4的新特性,我把自己验证过的,感兴趣的,且有用的新特性都写在这里了。
JUnit4是JUnit框架有史以来的最大改进,其主要目标便是利用Java5的Annotation特性简化测试用例的编写。 先简单解释一下什么是Annotation,这个单词一般是翻译成元数据。元数据是什么?元数据就是描述数据的数据。也...
本文内容包括:引言JUnit4初体验JUnit深入JUnit和Ant总结本文主要介绍了如何使用JUnit4提供的各种功能开展有效的单元测试,并通过一个实例演示了如何使用Ant执行自动化的单元测试。本文假设读者对Eclipse下进行Java...
JUnit4 主要目标便是利用Java5 的Annotation 特性简化测试用例的编写
新特性实战 (实践出真知) .... .... ......... 14 3 作业规范 .... .... .... .... ...... 21 4 附录 .... .... .... .... 22 4.14.14.1 下版计划 .... .... .... . 22 4.24.24.2 修订记录 .... .... .... . ...
内容实际Java开发中单元测试常遇到的问题JUnit4的新特性和扩展机制JUnit4扩展的实现通过测试用例实例展示JUnit扩展的执行效果结论参考资料简介: 在采用测试驱动开发的项目中,有一个经常困扰开发者的问题是:当...
单元测试所需的junit jar包,里面包含class jar 和...它的新特性主要是针对JAVA5中的标记(annotation)来简化测试,而不是利用子类、反射或命名机制。本文将讲述如何使用JUnit 4,当前前提是你最好具有JUnit的使用经验.
JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework)。Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成... 4、图形和文本的测试运行器
junit-3.8.1,JUnit是一个开放源代码的Java测试框架,用于编写和运行可重复的测试。他是用于单元测试框架体系xUnit的一个实例(用于java语言)。它包括以下特性: 1、用于测试期望结果的断言(Assertion) 2、用于...
JUnit是一款由Erich Gamma(《设计模式》的作者)和Kent Beck(极限编程的提出者)编写的开源的回归测试...与早期的JUnit 3相比,JUnit 4.1依赖于Java 5.0的新特性,因此无法兼容于jdk 1.4,可以说是一个全新的框架。
Junit是一个开源的单元测试框架。由于编写可重复使用的测试代码。它是单元测试框架xUnit的一个实例。Junit4中更是增加了注解这个新的特性,使编写测试程序更容易。