Reference by JavaWorld
,caterpillar
使用Assert類別中所提供的assertXXX()方法可以讓您進行各種測試,如果測試失敗,則可能傳回AssertionFailedError或ComparisonFailure物件,您可以利用try....catch區塊收集並顯示這些物件所夾帶的訊息,然後重新返回測試.
然而事實上您不用自行設計,JUnit提供TestCase類別,您可以繼承這個類別進行測試案例的撰寫,並使用它的run()方法進行測試,TestCase物件會自行幫您收集測試失敗時的相關訊息,之後您只要取得TestResult物件,就可以顯示相關的訊息。
首先還是哪個簡單的Student類別:
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)的測試準測;我們先從簡單的測試案例開始下手,如下所示:
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()方法中撰寫會發生錯誤的斷言,這樣待會才看得到一些錯誤報告,接下來我們撰寫一個主函式來進行測試:
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物件,測試的結果訊息就包括在當中,我們在這邊直接將物件的內容顯示出來,以顯示一些簡單的訊息,執行這個程式,其結果如下所示:
我們也可以使用動態的方法進行案例測試,這會使用到Java的Reflection機制來實作runTest()的內容,我們只要在建構TestCase物件時傳入我們所想要的測試方法名稱即可,例如:
TestCase test1 = new TestIt("testGetMethod");
showResult(test1.run());
TestCase test2 = new TestIt("testSetMethod");
showResult(test2.run());
其結果顯示將與Main是相同的.