1. 管理測試用例。修改了哪些代碼,這些代碼的修改會對哪些部分有影響,通過JUnit將這次的修改做個完整測試。這也就JUnit中所謂的TestSuite。
2. 定義測試代碼。這也就是JUnit中所謂的TestCase,根據源代碼的測試需要定義每個TestCase,並將TestCase添加到相應的TestSuite方便管理。
3. 定義測試環境。在TestCase測試前會先調用“環境”配置,在測試中使用,當然也可以在測試用例中直接定義測試環境。
4. 檢測測試結果。對於每種正常、異常情況下的測試,運行結果是什麼、結果是否是我們預期的等都需要有個明確的定義,JUnit在這方面提供了強大的功能。
以上部分與我們平常使用IDE調試的過程是完全一樣的,只不過是增加了測試用例管理、測試結果檢測等功能,提高了單元的效率,保證了單元測試的完整性,明確了單元測試的目標。
import java.util.ArrayList;
import java.util.Collection;
import junit.framework.TestCase;
public class SampleTest extends TestCase {
protected void setUp() {
/* 開始test前的準備操作:初始化,獲取數據連接... */
}
protected void tearDown() {
/* 完成test後的清理工作:關閉文件, 關閉數據連接... */
}
public void testEmpty() {
/* test case 1*/
Collection collection = new ArrarList();
assertTrue(collection.isEmpty());
}
public void testCase2() {
/* test case 2*/
ArrayList emptyList = new ArrayList();
try {
Object o = emptyList.get(0);
fail("Should raise an IndexOutOfBoundsException");
} catch (IndexOutOfBoundsException expected) {
assertTrue(true);
}
}
}
1. 當需要進行test前後操作,則對setUp(), tearDown()這兩個方法進行重寫。
1 setUp()
2 testYYY()
3 tearDown()
4 setUp()
5 testXXX()
6 tearDown()
所以每個testcase不要存在數據上的前後聯繫。
import junit.framework.TestSuite;
public static Test suite() {
/* 添加SampleTest類到TestSuite*/
return new TestSuite(SampleTest.class);
}
public static void main(String args[]) {
/* 指定文本界面*/
junit.textui.TestRunner.run(suite());
}
junit.textui.TestRunner.run(SampleTest.class);
}
import junit.framework.Test;
import junit.framework.TestSuite;
public class SampleTestSuite {
public static Test suite() {
TestSuite suite = new TestSuite("Sample Tests");
/* 逐一添加testCase類 */
suite.addTestSuite(SampleTest.class);
/* 逐一添加test suite(注意,這是遞歸調用的) */
suite.addTest(AnotherTestSuite.suite());
return suite;
}
public static void main(String args[]) {
junit.textui.TestRunner.run(suite());
}
}
import junit.extensions.TestSetup;
public class AllTestsOneTimeSetup {
public static Test suite() {
TestSuite suite = new TestSuite();
suite.addTest(SomeTest.suite());
suite.addTest(AnotherTest.suite());
TestSetup wrapper = new TestSetup(suite) {
protected void setUp() {
oneTimeSetUp();
}
protected void tearDown() {
oneTimeTearDown();
}
};
return wrapper;
}
public static void oneTimeSetUp() {
// one-time initialization code
}
public static void oneTimeTearDown() {
// one-time cleanup code
}
}