Junit3和junit4的比较

首先说一下写测试类有什么好处

 

1、它是一种验证行为。

 

程序中的每一项功能都是测试来验证它的正确性。它为以后的开发提供支缓。就算是开发后期,我们也可以轻松的增加功能或更改程序结构,而不用担心这个过程中会破坏重要的东西。而且它为代码的重构提供了保障。这样,我们就可以更自由的对程序进行改进。

2、它是一种设计行为。

编写单元测试将使我们从调用者观察、思考。特别是先写测试(test-first),迫使我们把程序设计成易于调用和可测试的,即迫使我们解除软件中的耦合。

3、它是一种编写文档的行为。

单元测试是一种无价的文档,它是展示函数或类如何使用的最佳文档。这份文档是可编译、可运行的,并且它保持最新,永远与代码同步。 

4、它具有回归性。 

自动化的单元测试避免了代码出现回归,编写完成之后,可以随时随地的快速运行测试。

接下来我们比较Junit3和junit4的区别:

作为引子,先看一个简单的例子:

1.先写个简单的测试类:

package test

public class BaseClass{

    public String method(){

        return this.getClass().getName();

    }

}

2.对于这个测试类的unit测试,JUnit3中的测试程序:

package test

importjunit.framwork.TestCase;   //引入TestCase

public class BaseClassTest extendsTestCase { //类必须继承TestCase

    BaseClass baseClass;

   

    protected void setUp() throwsException{

        super.setUp();

        baseClass = new BaseClass();

    }

    public void testMethod() {//测试方法必须以test开头

        //通过assert*来检验

        assertTrue(baseClass.method().equals("test.BaseClass"));

    }

}

通过上面这个类,可以对JUnit3进行一些总结:

必须引入类TestCase(importjunit.framwork.TestCase;)

必须继承类TestCase(class BaseClassTestextends TestCase)

测试方法必须以test开头(public voidtestMethod())

通过assert*方法判断结果(assertTure(baseClass.method().equals("test.base")));

        

3.利用JUnit4进行测试:

package test

import org.junit.Test; //引入Test类

import static org.junit.Assert.*;//引入Assert.*包

public class BaseClassTestNew{//这里不用再继承TestCase类

    BaseClass baseClass;

    @Before

    protected void runBeforeTest(){

        baseClass = new BaseClass();

    }

    @Test    // 以标签@Test标记,名字可以任意取

    public void methodOne(){

        //仍然是通过assert*来检验

        assertTure(baseClass.method().equals("test.BaseClass.class")));

    }

}

下面通过和JUnit3的特性进行比较来总结JUnit的特性:

(1)必须引入类TestCase(importjunit.framwork.Test)

-》必须引入类Test(importorg.junit.Test),必须引入类(import static org.junit.Assert.*)

(2)必须继承类TestCase(classBaseClassTest extends TestCase)

-》不需要

(3)测试方法必须以test开头(public voidtestMethod())

-》不需要,但是类开始的时候要标记@Test

(4)通过assert*方法来判断结果(assertTure(baseClass.method().equals("test.BaseClass.class")))

从上面的对比,可以看出JUnit4和JUnit3的区别在于:

去掉与类TestCase的偶联性,利用标签(@Test)对TestCase触发。

-------------------------------

setUp和TearDown

JUnit3测试运行程序会在运行每个测试之前自动调用setUp()方法。该方法一般会初始化字段,打开日志记录,重置环境变量,等等。

protected void setUp() throwsException{

   super.setUp();

   baseClass = new BaseClass();

}

在JUnit4中,仍然可以在每个测试方法运行之前初始化字段和配置环境。然而,完成这些操作的方法不再需要叫setUp(),只要用@Before注释来指示即可。

@Before

protected void runBeforeTest(){

   baseClass = new BaseClass();

}

可以用多个@Before来注释多个方法在测试之前运行。

消除方法与此类似。在JUnit3中,使用tearDown()方法:

protected void tearDown(){

    baseClass = null;

}

对于JUnit4,可以给它取一个更自然的名称,并用@After注释它:

@After

protected void runAfterTest(){

    baseClass = null;

}

同样,可以用多个@After来注释多个方法在测试之后运行。

最后,您不再需要在超类中显式调用初始化和清除方法,只要它们不被覆盖即可,测试运行程序将根据需要自动为您调用这些方法。超类中的@Before 方法在子类中的 @Before 方法之前被调用(这反映了构造函数调用的顺序)。@After方法以反方向运行:子类中的方法在超类中的方法之前被调用。否则,多个 @Before 或 @After 方法的相对顺序就得不到保证。

套件范围的初始化

JUnit4中引入了一个JUnit中没有的新特性:类范围的setUp()和tearDown()方法。任何用@BeforeClass注释的方法都将在该类中的测试方法运行之前刚好运行一次,而任何用@AfterClass注释的方法都将在该类中的所有测试都运行之后刚好运行一次。

注意:@Before方法在每个@Test运行之前都会运行一次,而@BeforeClass只在该类所有测试方法运行之前刚好运行一次。

例如,假设类中的每个测试都使用一个数据库连接、一个网络连接、一个非常大的数据结构,或者还有一些对于初始化和事情安排来说比较昂贵的其他资源。不要在每个测试之前都重新创建它,您可以创建它一次,并还原它一次。该方法将使得有些测试案例运行起来快得多。例如,当我测试调用第三方库的代码中的错误处理时,我通常喜欢在测试开始之前重定向System.err,以便输出不被预期的错误消息打乱。然后我在测试结束后还原它,如下所示:

private PrintStream systemErr;

   

@BeforeClass protected voidredirectStderr() {

    systemErr = System.err; // Hold on tothe original value

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

}

   

@AfterClass protected voidtearDown() {

    // restore the original value

    System.setErr(systemErr);

}

-------------------------------------------

 

测试异常

异常测试是JUnit4中的最在改进。旧式的异常测试是在抛出异常的代码中放入try块,然后在try块的末尾加入一个fail()语句。

例如该方法测试一个被零除抛出一个ArithmeticException:

public void testDivisionByZero(){

    try{

        int n = 2 / 0;

        fail("Divided by zero!");

    }

    catch(ArithmeticException success){

        assertNotNull(success.getMessage());

    }

}

该方法不仅难看,而且试图挑战代码覆盖工具,因为不管测试是否通过还是失败,总有一些代码不被执行。在JUni4中,可以编写抛出异常的代码,并使用注释来声明该异常是预期的:

@Test(expected =ArithmeticException.class)

public void divideByZero(){

    int n = 2 / 0;

}

如果没有异常抛出或者抛出一个不同的异常,那么测试就将失败。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值