闲人野居
好好学习,天天向上
posts - 57,  comments - 137,  trackbacks - 0
    JUnit 4 已经出来很久了,基本上很多ide都开始支持,当然为了兼容性,一直不太敢用。以前都是懒得写单元测试,大多数的时候都是 System.out.print。不过现在已经是测试驱动的时代了,为了保持一个良好的习惯,还是需要好好的写写单元测试。断言远比 System.out.print有用。
    看了几篇文章之后,对JUnit4已经有了基本的概念了。其实很多特性,testNg都已经实现了,挺讨厌testNg的xml文件,不过testNg的灵活性还是强大,对于大面积的组件测试比较适合。
    JUnit 4应该说是使用新的架构写的,使用了很多java5的新特性。
    一个最关键的改变,测试类,可以不用继承那该死的TestCase了.测试类,可以更加灵活,方法的定义不需要在前面增加test了。
    对于测试类来说,只需要做以下简单的动作:
    增加一个@Test,用于标注相应的测试方法。使用Assert类,来进行断言。
   

import org.junit.Assert;

public class AdditionTest {

  private int x = 1;

  private int y = 1;

  @Test public void addition() {

    int z = x + y;

    Assert.assertEquals(2, z);

  }

}


当然可以使用java 5的static import 功能

import static org.junit.Assert.*;

public class AdditionTest {

  private int x = 1;

  private int y = 1;

  @Test public void addition() {

    int z = x + y;

    assertEquals(2, z);

  }

}


对于setUp 和tearDown来说,以后可以不用再继承这两个方法了。可以使用自定义的方法,只需要在前面增加@Before 和@After 注释即可。

 

@Before protected void initialize() {

    System.setErr(new PrintStream(new ByteArrayOutputStream()));  

    inputDir = new File("data");

    inputDir = new File(inputDir, "xslt");

    inputDir = new File(inputDir, "input");

       

}


 

@After protected void disposeDocument() {

  doc = null;

  System.gc();  

}


并且可以注释多个方法。

    当然JUnit4 也引入了一个 JUnit 3 中没有的新特性:类范围的 setUp() tearDown() 方法。任何用 @BeforeClass 注释的方法都将在该类中的测试方法运行之前刚好运行一次,而任何用 @AfterClass 注释的方法都将在该类中的所有测试都运行之后刚好运行一次。
   
例 如,假设类中的每个测试都使用一个数据库连接、一个网络连接、一个非常大的数据结构,或者还有一些对于初始化和事情安排来说比较昂贵的其他资源。不要在每 个测试之前都重新创建它,您可以创建它一次,并还原它一次。该方法将使得有些测试案例运行起来快得多。

 

// This class tests a lot of error conditions, which

// Xalan annoyingly logs to System.err. This hides System.err

// before each test and restores it after each test.

private PrintStream systemErr;

@BeforeClass protected void redirectStderr() {

    systemErr = System.err; // Hold on to the original value

    System.setErr(new PrintStream(new ByteArrayOutputStream()));

} 

@AfterClass protected void tearDown() {

    // restore the original value

    System.setErr(systemErr);

}


    异常测试是 JUnit 4 中的最大改进。旧式的异常测试是在抛出异常的代码中放入 try 块,然后在 try 块的末尾加入一个 fail() 语句。
该方法不仅难看,而且试图挑战代码覆盖工具,因为不管测试是通过还是失败,总有一些代码不被执行。 JUnit 4 中,您现在可以编写抛出异常的代码,并使用注释来声明该异常是预期的:

 

@Test(expected=ArithmeticException.class)

  public void divideByZero() {

    int n = 2 / 0;

}


    如果该异常没有抛出(或者抛出了一个不同的异常),那么测试就将失败。但是如果您想要测试异常的详细消息或其他属性,则仍然需要使用旧式的 try-catch 样式。
    测试性能 是单元测试最为痛苦的方面之一。JUnit 4 没有完全解决这个问题,但是它对这个问题有所帮助。测试可以用一个超时参数来注释。如果测试运行的时间超过指定的毫秒数,则测试失败。

 

@Test(timeout=500) public void retrieveAllElementsInDocument() {

    doc.query("//*");

}


基本的特性就这么多,这些功能其实都可以在testNg中找到。不过JUnit还是不错的,对于单元测试来说,这是首选的。

当然为了兼容性,为了使 JUnit 4 测试可以运行在 JUnit 3 环境中,可以将它们包装在 JUnit4TestAdapter 中。将下面的方法添加到您的 JUnit 4 测试类中应该就足够了:

 

public static junit.framework.Test suite() {

  return new JUnit4TestAdapter(AssertionTest.class);   

}



posted on 2006-10-03 10:36 布衣郎 阅读(2671) 评论(7)  编辑  收藏 所属分类: 单元测试

FeedBack:
# re: Junit 4新的特性
2006-10-03 13:14 | pear
请问:Eclipse的编辑器怎么支持 @Test 类似的语法呀?
Eclipse 支持 @Override 但是怎么让他支持 @Test/@Before/@After呢?  回复  更多评论
  
# re: Junit 4新的特性
2006-10-03 15:17 | Supergoal
@pear
用快捷键Ctrl + Shit + O,import相应的class即可。  回复  更多评论
  
# re: Junit 4新的特性
2006-10-03 15:19 | Supergoal
请问楼主的代码自己运行过吗?你确定@BeforeClass这个Annotation可以用在非静态函数上面吗?我试下来似乎不行。  回复  更多评论
  
# re: Junit 4新的特性
2006-10-03 19:16 | 布衣郎
@Supergoal

不错,我这里只是贴了文章中的几个例子而已,并没有做过试验。抱歉,今天特意试了一下。在eclipse中,运行,beforeClass和afterClass 只能用于static方法,而且好像before 和after 只有用于public 方法,没有试过在外面执行junit。
这点感觉就没有testng那么好了。  回复  更多评论
  
# re: Junit 4新的特性
2006-10-03 19:21 | 布衣郎
@pear
eclipse 3.2已经支持junit4 了,只要把junit4 的包引入就可以,一般我建立两个classpath variables。JUNIT4_HOME:D:/eclipse/plugins/org.junit4_4.1.0
JUNIT4_SRC_HOME:D:/eclipse/plugins/org.eclipse.jdt.source_3.2.0.v20060609m-F7snq1fxia-Z4XP/src/org.junit4_4.1.0
在项目中加入这两个变量就可以了。

创建testCase时,选择new Junit4 test就行了。  回复  更多评论
  
# re: Junit 4新的特性
2006-10-04 19:05 | pear
没问题了,原来是没有引入包,呵,不好意思。。谢谢搂住。。  回复  更多评论
  
# re: Junit 4新的特性
2006-10-04 20:33 | 冰川
支持一下!  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问  
 

<2006年10月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

常用链接

留言簿(12)

随笔分类(59)

随笔档案(57)

blog

java

uml

搜索

  •  

积分与排名

  • 积分 - 356471
  • 排名 - 155

最新评论

阅读排行榜

评论排行榜