发布新日志

  • Junit4 快速入门

    2009-10-13 00:06:13

    Junit 概念,原理这里就不说了,有兴趣的朋友可以查阅相关资料,这篇文章主要是为

    了快速给大家介绍一下junit4的使用 以及与 junit3的区别,这里默认大家对junit3已

    经有些理解了。

    下面就开始吧:

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

    package test.junit;

    public class BaseClass {

    public String method() {

    return this.getClass().getName();

    }

    }

    2.对于这个类的unit测试,我们先看看在junit3中怎么进行测试的吧:

    package test.junit;

    import junit.framework.TestCase;//引入TestCase类

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

    BaseClass baseClass;

    protected void setUp() throws Exception {

    super.setUp();

    baseClass = new BaseClass();

    }

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

    //通过assert*来检验

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

    }

    }

    通过上面这个类,我们对junit3进行一些总结:

    1. 必须引入类TestCase(import junit.framework.TestCase;),

    2. 必须继承类TestCase (class BaseClassTest extends TestCase)

    3. 测试方法必须以test开头(public void testMethod ())

    4. 通过assert*方法来判断结果(assertTrue(baseClass.method ().equals

    ("test.junit.BaseClass"));)。

    3. 下面来了解一下junit4里面的内部关系吧,从这个图中你可以看出junit4的主要功

    能:

    下面来看看我们今天的主角junit4是怎么处理这些的吧:

    package test.junit;

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

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

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

    BaseClass baseClass = new BaseClass();

    @Test public void methodOne(){//名字随便写,可以按你自己的爱好。但是必须以

    @Test开头

    //还是以assert*来判断

    assertTrue(baseClass.methodOne().equals("test.junit.BaseClass"));

    }

    }

    看看多么的简洁,好像少了很多约束,下面通过和junit3的特性进行比较总结junit4的

    特性:

    1.必须引入类TestCase(import junit.framework.TestCase;

    è必须引入类Test(import org.junit.Test;),必须引入类(import static

    org.junit.Assert.*;)

    2.必须继承类TestCase (class BaseClassTest extends TestCase)

    è不需要

    3.测试方法必须以test开头(public void testMethod ())

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

    4.通过assert*方法来判断结果(assertTrue(baseClass.method ().equals

    ("test.junit.BaseClass"));)。

    从上面的对比,可以看出junit4与junit3的区别在于:

    去掉与类TestCase的偶联性,唯一触发TestCase的地方就是在@Test上。

    4.以上就是junit4与junit3的区别与改进,下面再继续看看junit4有哪些新增加的功能

    吧:

    1. @Before 和 @After

    类似于init() 和destory(),可以将一些初始化和释放工作放到这里面,每个类都只有

    一个@Before 和 @After。为了实现这个功能,我们将测试类修改如下:

    import org.junit.Test;

    //新增加两个类

    import org.junit.Before;

    import org.junit.After;

    import static org.junit.Assert.*;

    public class BaseClassTestNew {

    BaseClass baseClass ; //这里不用进行初始化

    @Before public void runBeforeTest(){

    baseClass = new BaseClass();

    }

    @Test public void method (){

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

    }

    @After public void runAfterTest(){

    baseClass.teardownList();

    baseClass = null;

    }

    }

    @Before 方法会在 @Test 之前进行,相反 @After 会在所有方法运行完进行。

    Junit4同时还支持 @BeforeClass 和 @AfterClass,原理一样,大家可以参考相关资料



    2.TimeOut 属性

    Junit4支持timeout,运用如下:

    a. 首先在被测试类中增加用于测试timeout的方法:

    public void methodTimeOut() {

    try {

    Thread.sleep(50);//睡50秒

    System.out.println("methodTimeOut");

    } catch (InterruptedException e) {

    }

    }

    b.看看怎么测试这个方法:

    @Test(timeout=5)

    public void methodTimeOut(){

    baseClass.methodTimeOut();

    }

    1. 增加(timeout=5)这个设置项

    2. 运行完 没有输出methodTimeOut,说明这个方法没有执行完,达到效果。

    以上就是一部分junit4相关的东西,这里只是简单的入门,希望大家增加补充其他内容

    。 
  • JUnit的使用总结

    2009-10-13 00:01:45

    JUnit中的assert方法全部放在Assert类中,现在总结一下经常用到的junit类中assert方法。
    1.assertTrue/False([String message],boolean condition) 判断一个条件是true还是false。
    2.fail([String message,]); 失败,可以有消息,也可以没有消息。
    3.assertEquals([String message],Object expected,Object actual); 判断是否相等,可以指定输出错误信息。

    4.assertNotNull/Null([String message],Object obj); 判读一个对象是否非空(非空)。
    5.assertSame/NotSame([String message],Object expected,Object actual); 判断两个对象是否指向同一个对象。看内存地址。

    JUnit4是较历史版本有了很大的改进,我以前自己用的是JUnit3。JUnit4的主要方便是利用Java5的Annotation特性简化测试用例的编写。

    记得以前在JUnit 3中我是这样写一个单元测试的:
    public class AddOperation {
    public int add(int x,int y){
    return x+y;
    }
    }

    要测试add这个方法,写单元测试得这么写,一定要注意的是以下两点
    1.单元测试类必须继承自TestCase。
    2.要测试的方法必须以test开头。

    public class AddOperationTest extends TestCase{

    public void testAdd() {
    System.out.println(”add”);
    int x = 0;
    int y = 0;
    AddOperation instance = new AddOperation();
    int expResult = 0;
    int result = instance.add(x, y);
    assertEquals(expResult, result);
    }
    }

    如果上面那个单元测试在JUnit 4中写就不会这么复杂。代码如下:

    public class AddOperationTest extends TestCase{

    @Test
    public void add() {
    System.out.println(”add”);
    int x = 0;
    int y = 0;
    AddOperation instance = new AddOperation();
    int expResult = 0;
    int result = instance.add(x, y);
    assertEquals(expResult, result);
    }

    }
    采用Annotation的JUnit已经不会要求必须继承自TestCase了,而且测试方法也不必以test开头了,只要以@Test元数据来描述即可。
    另外还有其他的几个Annotation:
    @Before:
    使用了该元数据的方法在每个测试方法执行之前都要执行一次。

    @After:
    使用了该元数据的方法在每个测试方法执行之后要执行一次。

    注意:@Before和@After标示的方法只能各有一个。这个相当于取代了JUnit以前版本中的setUp和tearDown方法。

    @Test(expected=*.class)
    在JUnit4.0之前,对错误的测试,我们只能通过fail来产生一个错误,并在try块里面assertTrue(true)来测试。现在,通过@Test元数据中的expected属性。expected属性的值是一个异常的类型

    @Test(timeout=xxx):
    该元数据传入了一个时间(毫秒)给测试方法,
    如果测试方法在制定的时间之内没有运行完,则测试也失败。

    @ignore:
    该元数据标记的测试方法在测试中会被忽略。当测试的方法还没有实现,或者测试的方法已经过时,或者在某种条件下才能测试该方法(比如需要一个数据库联接,而在本地测试的时候,数据库并没有连接),那么使用该标签来标示这个方法。同时,你可以为该标签传递一个String的参数,来表明为什么会忽略这个测试方法。比如:@lgnore(“该方法还没有实现”),在执行的时候,仅会报告该方法没有实现,而不会运行测试方法. 
Open Toolbar