Junit3 与Junit4 比较


  

为引子,先看一个简单的例子:
1.先写个简单的测试类:
package test
public class BaseClass{
    publicString method(){
       return this.getClass().getName();
    }
}

2.对于这个测试类的unit测试,JUnit3中的测试程序:
package test
import junit.framwork.TestCase;  //引入TestCase类
public class BaseClassTest extends TestCase { //类必须继承TestCase
    BaseClassbaseClass;
   
    protectedvoid setUp() throws Exception{
       super.setUp();
       baseClass = new BaseClass();
   }

    publicvoid testMethod() { //测试方法必须以test开头
       //通过assert*来检验
       assertTrue(baseClass.method().equals("test.BaseClass"));
    }
}

通过上面这个类,可以对JUnit3进行一些总结:
必须引入类TestCase(import junit.framwork.TestCase;)
必须继承类TestCase(class BaseClassTest extends TestCase)
测试方法必须以test开头(public void testMethod())
通过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类
    BaseClassbaseClass;

   @Before
    protectedvoid runBeforeTest(){
       baseClass = new BaseClass();
    }

   @Test    //以标签@Test标记,名字可以任意取
    public voidmethodOne(){
       //仍然是通过assert*来检验
       assertTure(baseClass.method().equals("test.BaseClass.class")));
    }
}

下面通过和JUnit3的特性进行比较来总结JUnit的特性:
(1)必须引入类TestCase(import junit.framwork.Test)
-》必须引入类Test(import org.junit.Test),必须引入类(import staticorg.junit.Assert.*)
(2)必须继承类TestCase(class BaseClassTest extends TestCase)
-》不需要
(3)测试方法必须以test开头(public void testMethod())
-》不需要,但是类开始的时候要标记@Test
(4)通过assert*方法来判断结果(assertTure(baseClass.method().equals("test.BaseClass.class")))

从上面的对比,可以看出JUnit4和JUnit3的区别在于:
去掉与类TestCase的偶联性,利用标签(@Test)对TestCase触发。

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

setUp和TearDown
JUnit3测试运行程序会在运行每个测试之前自动调用setUp()方法。该方法一般会初始化字段,打开日志记录,重置环境变量,等等。
protected void setUp() throws Exception{
   super.setUp();
   baseClass = newBaseClass();
}

在JUnit4中,仍然可以在每个测试方法运行之前初始化字段和配置环境。然而,完成这些操作的方法不再需要叫setUp(),只要用@Before注释来指示即可。
@Before
protected void runBeforeTest(){
   baseClass = newBaseClass();
}
可以用多个@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 PrintStreamsystemErr;
   
@BeforeClass
protected voidredirectStderr() {
    systemErr =System.err; // Hold on to the original value
   System.setErr(new PrintStream(new ByteArrayOutputStream()));
}
   
@AfterClass protected void tearDown() {
    // restorethe 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;
}
如果没有异常抛出或者抛出一个不同的异常,那么测试就将失败。

编译和运行JUnit
在JUnit3中提供了三种运行界面:
TestUI:Provides text-based output to stdout
AwtUI: Provides GUI-based output using the AWT(Abstract WindowToolkit)from Java
SwingUI: Provides GUI-based output using the Swing graphical userinterface component kit from Java.

设置好环境变量后,在命令行运行:
java junit.USERINTERFACE.TestRunner classfile

例如:
java junit.testui.TestRunner BaseClassTest

在JUnit4中,只有标准输出界面,使用org.junit.runner.JUnitCore类来运行:
java org.junit.runner.JUnieCore BaseClassTest

 

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值