在ECLIPSE中使用JUNIT4.X进行单元测试

来源:互联网 发布:plc编程100例梯形图 编辑:程序博客网 时间:2024/06/06 13:11
摘要
这篇文章简单讲解了如何在Eclipse中利用Junit 4.x和EasyMock进行单元测试。

当你阅读完这篇文章后,可以在Eclipse中使用JUnit进行单元测试。


1. 概要

1.1. 单元测试

单元测试开发人员写的用于测试某一个功能的代码。单元测试可以保证程序的功能正常使用。

JUnit 4.x 是一个自动化测试的框架,最初的作者是Erich Gamma and Kent Beck。它使用Java的annotation特性来标记出需要进行测试的方法。

在JUnit中,有一个非常重要的约定:所有的测试用例都不应该依赖于其他的测试用例。

1.2. 安装

下载JUnit4.x.jar可以去JUnit的官网here,并且将其添加到classpath中。

现在的Eclipse版本中已经整合了Junit,你可以直接使用。

2. 如何编写单元测试

2.1. 概览

JUnit 使用annotations来区别需要进行测试的方法。

编写一个测试用例:

  • 给需要测试的方法加上annotations:@org.JUnit.Test

  • 如果你希望检测2个对象是否相等,使用org.JUnit.Assert.*,并调用assertEquals()。

Static imports在Java 5.0或以上版本是有效的,如:import static org.junit.Assert.*

2.2. 编写你的第一个单元测试

编写Java代码:

package gpcuster.cnblogs.com;import static org.junit.Assert.assertEquals;import org.junit.Test;public class MyFirstJUnitTest {    @Test    public void simpleAdd() {        int result = 1;        int expected = 1;        assertEquals(result, expected);    }}

2.3. 在Eclipse中运行你的单元测试

在Eclipse的菜单栏中选择:Run As -> JUnit test

Eclipse将通过绿色和红色的状态栏显示运行的结果。

3. 在ECLIPSE中使用JUNIT

3.1. 准备

创建一个全新的项目"de.vogella.junit.junittest"。添加一个lib目录,将junit4.jar添加到classpath中,由于现在eclipse里已内置了jutil,所在可以在项目属性里通过添加库(add libary)的方式添加jutil引用。

接着创建一个test的源代码文件夹

3.2. 创建一个需要测试的类

创建一个包 "gpcuster.cnblog.com"。

在包 "gpcuster.cnblog.com"中创建一个类"MyClass" 代码如下:   

package gpcuster.cnblogs.com;public class MyClass {    public int multiply(int x, int y) {        return x / y;    }}

3.3. 创建一个测试类

选中你需要测试的类,然后操作New ->JUnit Test case,再选择"New JUnit 4 test":

如果你还没有将JUnit放到你的classpath中,Eclipse将询问你是否将其加入classpath中:

测试类的代码如下:    

import static org.junit.Assert.assertEquals;import org.junit.Test;public class MyClassTest {    @Test    public void testMultiply() {        MyClass tester = new MyClass();        assertEquals("Result", 50, tester.multiply(10, 5));    }}

鼠标右击测试类,然后选择Run-As-> Junit Test。

测试结果如图所示,你可以修改代码中存在的问题,然后再次运行。如果成功,将看到绿色的状态栏。

3.4. 创建测试集

如果需要测试的用例很多,我们可以创建一个测试集,包含所有需要进行测试的测试用例。

选项需要测试的类,然后鼠标右击:New-> Other -> JUnit -Test Suite

创建的代码如下:

package gpcuster.cnblogs.com;import org.junit.runner.RunWith;import org.junit.runners.Suite;@RunWith(Suite.class)@Suite.SuiteClasses( { MyClassTest.class })public class AllTests {}

4. 进一步了解JUNIT

4.1. setUp()与tearDown()

对于每一个测试用例,你都可以实现setUp()和tearDown(). setUp在每一个测试用例初始化的时候被调用。tearDown()在每一个测试用例结束的时候被调用。

4.2. 在Eclipse中使用Static imports

Junit中大量使用了static方法。

Eclipse无法自动导入static imports。

你需要做的是将'org.junit.Assert'导入到Java > Editor > Content Assist > Favorites中。当你这么做了以后,你可以使用Content Assist (Ctrl+Space) 来添加方法。

4.3. Annotations

JUnit 4.x中Annotations的使用如下:

Annotation描述

@Test public void method()

需要被测试的方法。

@Before public void method()

在每一个测试用例执行前,需要调用的方法。

@After public void method()

在每一个测试用例执行后,需要调用的方法。

@BeforeClass public void method()

所有测试用例执行前,需要调用的方法。

@AfterClass public void method()

所有测试用例执行后,需要调用的方法。

@Ignore

忽略该测试的方法。

@Test(expected=IllegalArgumentException.class)

期望测试用例抛出指定的异常。

@Test(timeout=100)

测试用例期望的执行时间。

表1. Annotations

4.4. Assert语句

JUnit 4.x中Assert语句的使用如下:

Assert语句描述

fail(String)

方法失败。

assertTrue(true)

检测是否为真。

assertsEquals([String message], expected, actual)

检测2个对象是否相等

assertsEquals([String message], expected, actual, tolerance)

检测2个对象在允许的精度范围内是否相等。

assertNull([message], object)

检测是否为空。

assertNotNull([message], object)

检测是否为非空。

assertSame([String], expected, actual)

检测2个对象是否是为一个对象。

assertNotSame([String], expected, actual)

检测2个对象是否是为非一个对象。

assertTrue([message], boolean condition)

检测是否为真。

try {a.shouldThroughException(); fail("Failed")} catch (RuntimeException e) {asserttrue(true);}

检测是否抛出异常。

表2. Assert语句


=========================================================================

一、写测试目标(业务相关的类)
 
/** 

* 测试对象 
* User: leizhimin 
* Date: 2008-3-13 14:58:58 
*/
 
public class Calcuator { 
    public double add(double n1, double n2) { 
        return n1 + n1; 
    } 
}
 
二、写测试用例
 
import junit.framework.TestCase; 

/** 
* 测试用例 
* File: TestCalcuator.java 
* User: leizhimin 
* Date: 2008-3-13 15:00:17 
*/
 
public class TestCalcuator extends TestCase { 
    public void testAdd(){ 
        Calcuator calcuator=new Calcuator(); 
        double result=calcuator.add(1,2); 
        assertEquals(3,result,0); 
    } 

}
 
import junit.framework.TestCase; 

/** 
* 测试用例 
* File: TestCalcuator2.java 
* User: leizhimin 
* Date: 2008-3-13 16:13:29 
*/
 
public class TestCalcuator2 extends TestCase  { 
    public void testAdd(){ 
        Calcuator calcuator=new Calcuator(); 
        double result=calcuator.add(1,2); 
        assertEquals(3,result,0); 
    } 
}
 
三、写测试单元
 
import junit.framework.TestSuite; 
import junit.framework.Test; 
import junit.textui.TestRunner; 

/** 
* 测试单元 
* File: TestAll.java 
* User: leizhimin 
* Date: 2008-3-13 16:17:10 
*/
 
public class TestAll extends TestSuite { 
    public static Test suite() { 
        TestSuite suite = new TestSuite("TestSuite Test"); 
        suite.addTestSuite(TestCalcuator.class); 
        suite.addTestSuite(TestCalcuator2.class); 
        return suite; 
    } 
    public static void main(String args[]){ 
        TestRunner.run(suite()); 
    } 
}
 
四、运行单元测试的main()方法
 
控制台打印出结果如下:
.. 
Time: 0 

OK (2 tests) 


Process finished with exit code 0 
 
 
运行图形界面显示结果: