- 浏览: 108390 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
ldwtill:
overwrite呢?
overload,overwrite和override比较 -
dafeiwang:
...
过滤器和拦截器的区别
JUnit 4是JUnit框架有史以来的最大改进,其主要目标便是利用Java 5的Annotation特性简化测试用例的编写。让我们看看如何使用JUnit 4来进行Unit测试。
请注意:本文主要介绍JUnit 4的最新特性和用法,并不会讲解Unit测试的基础。如果你对JUnit框架还不熟悉,请先参考“Eclipse快速上手指南 (2) 使用JUnit测试”一文,学习如何编写JUnit测试。
我们使用的开发环境是Eclipse 3.2,它已经自带了JUnit 4.1,你需要将JUnit 4 Library添加到项目用到的Library中。另外,必须使用JDK 5.0或更高版本。
要在Eclipse环境之外运行JUnit,需要下载JUnit 4.1,具体请访问JUnit.org。
我们先看一个简单的Math类:
package com.javaeedev.junit4;
public class Math {
public int abs(int value) {
return value>=0 ? value : (-value);
}
public int div(int a, int b) {
return a / b;
}
/**
* BUG: if b less than 0!
*/
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:
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:
package com.javaeedev.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来期待一个预期的异常,而不必编写
try {
...
fail("No exception");
}
catch(Exception e) {
// OK!
}
来看看doDiv0测试,我们期待一个除数为0的ArithmeticException,因此编写如下测试方法:
@Test(expected=ArithmeticException.class)
public void doDiv0() {
new Math().div(127, 0);
}
对于非常耗时的测试,@Test还有一个timeout来标识该方法最长执行时间,超过此时间即表示该测试方法失败:
@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仅执行一次,因此它们只能标记静态方法,在所有测试方法中共享的资源也必须是静态引用:
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来编写测试。
ZIP包下载:javaeedev.googlecode.com/files/JUnit4Example.zip
参考
http://www.javaeedev.com/blog/article.jspx?articleId=ff80808112e766ee011312f144520061
2. @BeforeClass/@AfterClass 和 @Before/@After的区别
@BeforeClass and @AfterClass |
@Before and @After |
在一个类中只可以出现一次 |
在一个类中可以出现多次,即可以在多个方法的声明前加上这两个Annotaion标签,执行顺序不确定 |
方法名不做限制 |
方法名不做限制 |
在类中只运行一次 |
在每个测试方法之前或者之后都会运行一次 |
@BeforeClass父类中标识了该<span style="font-family: Times New Roma |
发表评论
-
如何让项目使用myEclipse部署在tomcat的ROOT目录下
2012-08-21 15:52 0工程右键--Properties--Myeclipse-- ... -
java正则表达式入门文档
2011-09-23 16:22 727引言 正则表达 ... -
B/S与C/S的区别
2011-05-07 21:55 610C/S是Client/Server的缩写 ... -
冒泡排序的简单例子
2011-05-07 21:48 753public class maopao { /** ... -
webservice 入门案例
2011-05-02 20:59 859最近准备考试:将webservice 充充电,本想配置一遍,在 ... -
jsp页面提交时post和get的区别
2011-05-02 20:24 9601.Post传输数据时,不需要在URL中显示出来,而Get方法 ... -
主题:struts2 与 jfreechart的整合
2011-05-02 10:00 960显示效果: 先引入相关的jar包: jcommon- ... -
java经典面试题!
2011-05-02 09:21 764今天上午我 ... -
overload,overwrite和override比较
2011-05-02 09:12 1577老话重提,又是重载和重写的区别等的概念性问题,记录下,以后 ... -
接口与抽象类的区别
2011-05-02 09:10 814接口中基本数据类型的数据成员,都默认为static和fi ... -
java中abstract,interface,final,static总结
2011-05-02 09:09 695关键字: abstract, interfac ... -
关于EL表达式语言的简单总结
2011-05-02 08:32 711关于EL表达式语言的简 ... -
一个过滤敏感词的filter,看书学到的,小结之:
2011-05-02 08:24 1004一个过滤敏感词的filter,看书学到的,小结之: 原 ... -
一个小小的防盗链图片的filter
2011-05-02 08:23 747public class ImageRedirectFilte ... -
jstl学习小结
2011-05-02 08:21 9131 FOREACH学习: <c:forEach it ... -
【MyEclipse8.5】该版本的MyEclipse的优化
2011-05-02 08:09 739第一步: 取消自动validation vali ... -
异步 同步的通俗解释
2011-05-01 21:12 1098异步 同步的通俗解释 A代表小孩 B代表大人 ... -
static 和 final 的使用
2011-05-01 20:54 843一、 final 关键字final ... -
jfreechart火速应用
2011-05-01 20:40 691import org.jfree.chart.ChartFac ... -
JAVA操作excel的一些例子
2011-05-01 19:59 857JAVA操作EXCEL有两种办法, ...
相关推荐
junit4.7jar包 包含实例,讲解,并且很多源码
使用JUnit编写测试脚本的实例,图文讲解。
JUnit三分钟教程 ---- 实际应用 讲解Junit实际应用的实例
本实例主要展示了在myEclipse或Eclipse中如何集成Ant、Junit和EMMA技术,有三个文件夹,在导入myEclipse或Eclipse中时,要Link Source,把三个都选上。详细地讲解了ant的构建文件build.xml
简单易懂的实例全面讲解了 Feed4JUnit 对数据与代码分离的测试支持
JUnit三分钟教程 ---- 快速起步 讲解Junit的快速起步实例
本文介绍和对比了TestNG和junit框架,并举出实例说明。 同时讲解了Mockito和Dbunit框架的使用
结合实例讲解Web项目总体结构 分析多层结构优点 具体讲解每个层次的实现技巧 第二部分:介绍组织层次关联利器(Spring) 快速入门 Factory模式 IOC模式 AOP模式 演练Spring的威力 第三部分:介绍日志管理利器(Log4j...
C/C++和Java(以及大多数的主流编程语言)都有自己成熟的单元测试框架,前者如Check,后者如JUnit,但这些编程框架本质上仍是第三方产品,为了执行单元测试,我们不得不从头开始搭建测试工程,并且需要依赖于第三方...
本文是在上一篇文章《java编程之单元测试(Junit)实例分析》的基础上继续讲解android的单元测试,android源码中引入了java单元测试的框架(android源码目录:libcore\junit\src\main\java\junit\framework中可见),...
第16章:有别于一般书籍的单元测试内容,本书以当前最具实战的JUnit4+Unitils+ Mockito复合测试框架对如何测试数据库、Web的应用进行了深入的讲解。 第17章:以一个实际的项目为蓝本,带领读者从项目需求分析、...
内容简介:此书结合具体实例讲解,通俗易懂,又不乏深度。我觉得这本书写的确实不错,堪称经典,市面上这样的书实在太少了,所以在这里发布下,供大家共享。本书从编程技术、项目实践以及软件工程的角度出发,如果...
第二篇为NetBeans集成开发环境的高级应用篇,本篇结合具体的实例讲解如何进行JUnit单元测试、代码性能分析、代码版本控制、开发Web应用程序、企业级应用程序、进行UML建模,以及开发SOA应用程序。第三篇介绍如何使用...
内容简介:此书结合具体实例讲解,通俗易懂,又不乏深度。我觉得这本书写的确实不错,堪称经典,市面上这样的书实在太少了,所以在这里发布下,供大家共享。本书从编程技术、项目实践以及软件工程的角度出发,如果...
内容简介:此书结合具体实例讲解,通俗易懂,又不乏深度。我觉得这本书写的确实不错,堪称经典,市面上这样的书实在太少了,所以在这里发布下,供大家共享。本书从编程技术、项目实践以及软件工程的角度出发,如果...
第二篇为NetBeans集成开发环境的高级应用篇,本篇结合具体的实例讲解如何进行JUnit单元测试、代码性能分析、代码版本控制、开发Web应用程序、企业级应用程序、进行UML建模,以及开发SOA应用程序。第三篇介绍如何使用...
第16章:有别于一般书籍的单元测试内容,本书以当前最具实战的JUnit4+Unitils+ Mockito复合测试框架对如何测试数据库、Web的应用进行了深入的讲解。 第17章:以一个实际的项目为蓝本,带领读者从项目需求分析、...
本书内容循序渐进,实例丰富,操作及开发步骤讲解详细,配书光盘包含整个项目的源代码,方便读者提高学习的效率。 本书适合于Eclipse的初学者和中级应用开发人员,是没有项目开发经验的读者的绝佳指导书之一。本书...
本书内容循序渐进,实例丰富,操作及开发步骤讲解详细,配书光盘包含整个项目的源代码,方便读者提高学习的效率。 本书适合于Eclipse的初学者和中级应用开发人员,是没有项目开发经验的读者的绝佳指导书之一。本书...
本文主要讲解了MyBatis的注解开发的实例**。常用注解,包括@Select注解、@Insert注解、@Update注解、@Delete注解、@Param注解等;然后编写基于注解的关联查询,一对多查询,通过学习可以了解MyBatis中常用注解的主要...