Junit3的測試方法(雖然已經過時,但更容易瞭解Junit的內部機制)

簡要說JUnit的4大功能
1. 管理測試用例。修改了哪些代碼,這些代碼的修改會對哪些部分有影響,通過JUnit將這次的修改做個完整測試。這也就JUnit中所謂的TestSuite
2. 定義測試代碼。這也就是JUnit中所謂的TestCase,根據源代碼的測試需要定義每個TestCase,並將TestCase添加到相應的TestSuite方便管理。
3. 定義測試環境。在TestCase測試前會先調用“環境”配置,在測試中使用,當然也可以在測試用例中直接定義測試環境。
4. 檢測測試結果。對於每種正常、異常情況下的測試,運行結果是什麼、結果是否是我們預期的等都需要有個明確的定義,JUnit在這方面提供了強大的功能。

      以上部分與我們平常使用IDE調試的過程是完全一樣的,只不過是增加了測試用例管理、測試結果檢測等功能,提高了單元的效率,保證了單元測試的完整性,明確了單元測試的目標。
 
一. 測試用例
package can.test;    

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()這兩個方法進行重寫。

 
2. 每進行一個test case前後,都會調用setUp(), tearDown()。注意,不是一次調用setUp(), 然後進行多個test case,最後才調用tearDown()。而且選擇test case的次序是不確定的。所以調用次序可能是:
     1  setUp()
     2  testYYY()
     3  tearDown()
     4  setUp()
     5  testXXX()
     6  tearDown()
     所以每個testcase不要存在數據上的前後聯繫。
 
3. 編譯&運行
    compile:  javac  -cp ../lib/junit.jar  can/junit/ SampleTest.java
    run:  (文本界面)   java  -cp   .;../lib/junit.jar  junit.textui.TestRunner  can.junit.SampleTest
      (圖形界面)    java  -cp   .;../lib/junit.jar  junit.swingui.TestRunner  can.junit.SampleTest
 
     如果提示can.junit.SampleTest not found,則注意命令中紅色處,.表示把當前目錄添加到classpath,便於junit能夠在該目錄找到can.junit.SampleTest
 
4. 加上main(可選)
    如果你覺得每次都要在命令中指定文本界面或圖形界面,有點麻煩,那可以添加一下代碼到SampleTest類中:
import junit.framework.Test;
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());
        }
 或者
        public static void main(String args[]) {
                junit.textui.TestRunner.run(SampleTest.class);
        }
    這樣run: java  -cp  .;../lib/junit.jar    can.junit. SampleTest
 
二. 測試單元
      當需要對多個類或者模塊進行unit test的時候,我們都會寫好每個類的testcase,然後寫一個Suite來將它們串聯起來。
package can.junit;

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());
        }
}
 
剛纔說了,每進行一個test case,setUp()和tearDown()都會調用。而有的時候,在setUp()中相當耗費資源,我們想進行所有的test case僅調用一次setUp()和tearDown(),這樣需要把TestSuite包裝到TestSetup類中:
import junit.framework.*;    
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    
        }        
}
 
三. 其他
對於protected方法的test,可以把test case放在被test的類同一目錄
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章