`
zyl
  • 浏览: 486755 次
社区版块
存档分类
最新评论

Junit 4新的特性

阅读更多
    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;<o:p></o:p>

public class AdditionTest {<o:p></o:p>

  private int x = 1;<o:p></o:p>

  private int y = 1;<o:p></o:p>

  @Test public void addition() {<o:p></o:p>

    int z = x + y;<o:p></o:p>

    Assert.assertEquals(2, z);<o:p></o:p>

  }<o:p></o:p>

}<o:p></o:p>


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

import static org.junit.Assert.*;<o:p></o:p>

public class AdditionTest {<o:p></o:p>

  private int x = 1;<o:p></o:p>

  private int y = 1;<o:p></o:p>

  @Test public void addition() {<o:p></o:p>

    int z = x + y;<o:p></o:p>

    assertEquals(2, z);<o:p></o:p>

  }<o:p></o:p>

}<o:p></o:p>


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

<o:p> </o:p>

@Before public void initialize() {<o:p></o:p>

    System.setErr(new PrintStream(new ByteArrayOutputStream()));<o:p></o:p>   <o:p></o:p>

    inputDir = new File("data");<o:p></o:p>

    inputDir = new File(inputDir, "xslt");<o:p></o:p>

    inputDir = new File(inputDir, "input");<o:p></o:p>

        <o:p></o:p>

}<o:p></o:p>


<o:p> </o:p>

@After public void disposeDocument() {<o:p></o:p>

  doc = null;<o:p></o:p>

  System.gc();   <o:p></o:p>

} <o:p></o:p>


并且可以注释多个方法。

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

<o:p> </o:p>

// This class tests a lot of error conditions, which<o:p></o:p>

// Xalan annoyingly logs to System.err. This hides System.err <o:p></o:p>

// before each test and restores it after each test.<o:p></o:p>

private PrintStream systemErr;<o:p></o:p>

@BeforeClass public static void redirectStderr() {<o:p></o:p>

    systemErr = System.err; // Hold on to the original value<o:p></o:p>

    System.setErr(new PrintStream(new ByteArrayOutputStream()));<o:p></o:p>

}<o:p></o:p> <o:p></o:p>

@AfterClass public static void tearDown() {<o:p></o:p>

    // restore the original value<o:p></o:p>

    System.setErr(systemErr);<o:p></o:p>

}<o:p></o:p>


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

<o:p> </o:p>

@Test(expected=ArithmeticException.class)<o:p></o:p>

  public void divideByZero() {<o:p></o:p>

    int n = 2 / 0;<o:p></o:p>

}<o:p></o:p>


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

<o:p> </o:p>

@Test(timeout=500) public void retrieveAllElementsInDocument() {<o:p></o:p>

    doc.query("//*");<o:p></o:p>

} <o:p></o:p>


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

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

<o:p> </o:p>

public static junit.framework.Test suite() {<o:p></o:p>

  return new JUnit4TestAdapter(AssertionTest.class);    <o:p></o:p>

}<o:p></o:p>

 

分享到:
评论

相关推荐

    myEclipse下使用Junit

    本资源将指导读者如何在myEclipse中使用Junit,包括准备工作、使用Junit进行测试、Junit断言方法、Junit 4新特性等方面的内容。 一、准备工作 在myEclipse中使用Junit需要进行一些准备工作。首先,需要导入Junit的...

    junit4 jar包

    JUnit4还支持测试套件(`@RunWith(Suite.class)`)、参数化测试(`@Parameters`)、定时器(`@Test(timeout = XXX)`)和假设(`Assume`类)等高级特性,这些都极大地增强了测试的灵活性和覆盖率。此外,JUnit4可以与...

    JUnit4JUnit4JUnit4(文档)

    JUnit4引入了许多改进和新特性,极大地提升了测试的灵活性和效率。下面将详细介绍JUnit4的关键概念、特性以及如何使用。 1. **注解驱动**: JUnit4的核心变化之一就是引入了注解,这使得测试类和方法的声明更加...

    junit4学习文档

    JUnit4 是 JUnit 测试框架的一个重大更新版本,它充分利用了 Java 5 的注解(Annotation)特性来简化测试用例的编写过程。注解是一种元数据,用于描述程序中的元素如类、方法或变量的作用。与传统的关键字(如 ...

    junit4教程(《Junit4初探》)

    JUnit4是JUnit系列的第四代产品,它引入了注解(Annotations)和断言(Assertions)等新特性,使得测试代码更加简洁易读。与JUnit3相比,JUnit4的灵活性和可扩展性得到了显著提升,使得测试驱动开发(TDD)在Java...

    探索 JUnit 4.4 新特性

    随着版本的迭代,JUnit不断引入新特性和改进,以适应开发者的需求。本文将聚焦于JUnit 4.4版本,深入探讨其带来的新功能和改进。 首先,JUnit 4.4的一个显著特点是支持注解(Annotations)的增强。在早期版本中,...

    Junit4教程非常详尽

    JUnit4 是 JUnit 框架有史以来的最大改进,其主要目标便是利用 Java5 的 Annotation 特性简化测试用例的编写。下面是对 JUnit4 的详细介绍: 一、Annotation 简介 Annotation 是 Java5 中引入的一种元数据特性,...

    Junit4.zip

    JUnit4引入了许多新特性,如注解(Annotations)和参数化测试。注解使得测试类和方法的声明更加直观,例如`@Test`用于标记测试方法,`@Before`和`@After`分别用于在每个测试方法之前和之后执行初始化和清理操作。...

    Junit4简单实用

    总结来说,JUnit4 是对 JUnit3 的一个重要升级,它利用 Java 5 的注解特性极大地简化了测试用例的编写,提高了测试代码的可读性和可维护性。通过使用注解,开发者能够更自由地组织测试逻辑,同时也能够方便地扩展...

    junit3.8 和junit4 api

    JUnit 4是一个重大的更新,引入了许多新特性和改进,使得测试更加灵活和强大: 1. **测试注解(Annotations)**:JUnit 4引入了注解,如`@Test`,用于标记测试方法。此外,还有`@BeforeClass`、`@AfterClass`、`@...

    Junit4 jar包

    Junit4是由Eclipse基金会维护的一个开源项目,它是JUnit系列的第四个主要版本,相比于之前的版本,Junit4引入了许多新的特性和改进。它支持注解(Annotation-based)的测试,使得编写和组织测试代码变得更加简洁。...

    JUnit4.rar(ppt讲义)

    相比JUnit 3,JUnit 4引入了许多新特性,如注解(Annotations)、参数化测试、规则(Rules)等。注解简化了测试类的创建,例如`@Test`用于标记测试方法,`@Before`和`@After`则用于定义在每个测试方法执行前后的设置...

    Junit4所需jar包

    1. **JUnit4的特性**: - **注解驱动**:JUnit4引入了注解(如`@Test`、`@Before`、`@After`等),使测试类和方法的编写更加简洁。 - **异常断言**:测试方法抛出预期的异常时,可以使用`@Test(expected = ...

    Junit4电子教程 api

    JUnit4相比其前身JUnit3,引入了许多改进和新特性,使得测试更加灵活和强大。 1. **注解驱动测试**:JUnit4放弃了传统的继承Test类的方式,而是采用注解(@Test)来标记测试方法,使得测试类结构更加清晰,易于理解...

    Junit4教程.pdf

    Junit4是该框架的一个重大更新,它引入了许多新特性,显著地简化了测试代码的编写,使得测试更加直观和高效。本文将详细探讨JUnit4的主要改进和关键知识点。 1. **Annotation的引入**: - 在JUnit4中,核心的改变...

    junit4单元测试

    异常测试也是JUnit4的一个重要特性。你可以使用`@Test(expected = Exception.class)`注解来指定期望的异常类型,如果测试方法没有抛出该异常或者抛出了不同的异常,那么测试就会失败。 JUnit4还包括了对测试的分类...

    JUnit4使用.pdf

    #### 六、JUnit4的高级特性 - **参数化测试**:允许为同一个测试方法提供不同的数据集,以测试不同输入下的行为。 - **假设条件支持**:允许根据特定条件决定是否执行某个测试用例。 #### 七、JUnit4与开发流程的...

Global site tag (gtag.js) - Google Analytics