Dashboard > OpenSource Project > ... > JUnit > JUnit Intro - TestCase
OpenSource Project Log In   View a printable version of the current page.
JUnit Intro - TestCase
Added by zach14c, last edited by 良葛格 on Sep 20, 2004  (view change)
Labels: 
(None)

Reference by JavaWorld,caterpillar


使用Assert類別中所提供的assertXXX()方法可以讓您進行各種測試,如果測試失敗,則可能傳回AssertionFailedError或ComparisonFailure物件,您可以利用try....catch區塊收集並顯示這些物件所夾帶的訊息,然後重新返回測試.
然而事實上您不用自行設計,JUnit提供TestCase類別,您可以繼承這個類別進行測試案例的撰寫,並使用它的run()方法進行測試,TestCase物件會自行幫您收集測試失敗時的相關訊息,之後您只要取得TestResult物件,就可以顯示相關的訊息

首先還是哪個簡單的Student類別:

Student.java
public class Student
{
    private String _number;
    private String _name;
    private int _score;

    public Student()
    {
        _number = null;
        _name = null;
        _score = 0;
    }

    public Student(String num, String name, int score)
    {
        _number = num;
        _name = name;
        _score = score;
    }

    public String getNumber()
    {
        return _number;
    }

    public String getName()
    {
        return _name;
    }

    public int getScore()
    {
        return _score;
    }

    public void setNumber(String num)
    {
        _number = num;
    }

    public void setName(String name)
    {
        _name = name;
    }

    public void setScore(int score)
    {
        _score = score;
    }
}

基本上您每設計一個類別,您就應該為它撰寫一個測試,這個測試將成為您日後重構(refactor)的測試準測;我們先從簡單的測試案例開始下手,如下所示:

TestIt.java
import junit.framework.*;

public class TestIt extends TestCase
{
    public TestIt(String name)
    {
        super(name);
    }

    public void testGetMethod()
    {
        Student student = new Student("B83503124", "Justin", 100);
        assertEquals("B83503124", student.getNumber());
        assertEquals("Justin", student.getName());
        assertEquals(100, student.getScore());
    }

    public void testSetMethod()
    {
        Student student = new Student();
        student.setNumber("B83503124");
        student.setName("Justin");
        student.setScore(100);
        assertEquals("B83503124", student.getNumber());
        assertEquals("Justin", student.getName());
        assertEquals(10, student.getScore());
    }
}

您如上繼承TestCase類別,並撰寫您想要進行的測試內容,TestCase繼承了Assert類別,所以您可以直接使用Assert中的一些斷言方法;我們故意在testSetMethod()方法中撰寫會發生錯誤的斷言,這樣待會才看得到一些錯誤報告,接下來我們撰寫一個主函式來進行測試:

Main.java
import junit.framework.*;
import java.util.*;

public class Main
{
    public static void main(String[] args)
    {
        TestCase test1 = new TestIt("TestGet")
            {
                protected void runTest()
                {
                    testGetMethod();
                }
            };

        showResult(test1.run());

        TestCase test2 = new TestIt("TestSet")
            {
                protected void runTest()
                {
                    testSetMethod();
                }
            };

        showResult(test2.run());
    }

    public static void showResult(TestResult result)
    {
        if (result.errorCount() > 0)
        {
            System.out.println("error: " + result.errorCount());

            Enumeration error = result.errors();

            while (error.hasMoreElements())
            {
                System.out.println(error.nextElement());
            }
        }

        if (result.failureCount() > 0)
        {
            System.out.println("failure: " + result.failureCount());

            Enumeration failure = result.failures();

            while (failure.hasMoreElements())
            {
                System.out.println(failure.nextElement());
            }
        }
    }
}

在這邊我們所使用的是測試案例進行測試時的一個靜態指定方式,程式中使用一個匿名類別並重新定義runTest()方法,TestCase的run()方法會呼叫runTest()方法,並將測試的結果收集出來,傳回一個TestResult物件。

TestResult物件擁有一些顯示測試結果的相關方法,像是上面所示的errorCount()、failureCount()等等方法,errors()與failures()方法會傳回Enumeration物件,測試的結果訊息就包括在當中,我們在這邊直接將物件的內容顯示出來,以顯示一些簡單的訊息,執行這個程式,其結果如下所示:

failure: 1
TestSet(Main$2): expected:<10> but was:<100>

我們也可以使用動態的方法進行案例測試,這會使用到Java的Reflection機制來實作runTest()的內容,我們只要在建構TestCase物件時傳入我們所想要的測試方法名稱即可,例如:

Main2.java
TestCase test1 = new TestIt("testGetMethod");
        showResult(test1.run());

        TestCase test2 = new TestIt("testSetMethod");
        showResult(test2.run());

其結果顯示將與Main是相同的.

Site powered by a free Open Source Project / Non-profit License (more) of Confluence - the Enterprise wiki.
Learn more or evaluate Confluence for your organisation.
Powered by Atlassian Confluence, the Enterprise Wiki. (Version: 2.1.5a Build:#411 Mar 16, 2006) - Bug/feature request - Contact Administrators