軟件藝術思考者  
          混沌,彷徨,立志,蓄勢...
          公告
          日歷
          <2025年8月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          導航

          隨筆分類(86)

          隨筆檔案(85)

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

           
          Eclipse 中使用JUnit(轉)
          自:http://dev.21tx.com 2004年12月01日 J2ME開發網 asklxf
            測試對于保證軟件開發質量有著非常重要的作用,單元測試更是必不可少,JUnit是一個非常強大的單元測試包,可以對一個/多個類的單個/多個方法測試,還可以將不同的TestCase組合成TestSuit,使測試任務自動化。Eclipse同樣集成了JUnit,可以非常方便地編寫TestCase。

            我們創建一個Java工程,添加一個example.Hello類,首先我們給Hello類添加一個abs()方法,作用是返回絕對值:



            下一步,我們準備對這個方法進行測試,確保功能正常。選中Hello.java,右鍵點擊,選擇New->JUnit Test Case:


             Eclipse會詢問是否添加junit.jar包,確定后新建一個HelloTest類,用來測試Hello類。


            選中setUp()和tearDown(),然后點擊“Next”:

            
            選擇要測試的方法,我們選中abs(int)方法,完成后在HelloTest.java中輸入:

              

             JUnit會以以下順序執行測試:(大致的代碼
          try {
          HelloTest test = new HelloTest(); // 建立測試類實例
          test.setUp(); // 初始化測試環境
          test.testAbs(); // 測試某個方法
          test.tearDown(); // 清理資源
          }
          catch…


            setUp()是建立測試環境,這里創建一個Hello類的實例;tearDown()用于清理資源,如釋放打開的文件等等。以test開頭的方法被認為是測試方法,JUnit會依次執行testXxx()方法。在testAbs()方法中,我們對abs()的測試分別選擇正數,負數和0,如果方法返回值與期待結果相同,則assertEquals不會產生異常。

            如果有多個testXxx方法,JUnit會創建多個XxxTest實例,每次運行一個testXxx方法,setUp()和tearDown()會在testXxx前后被調用,因此,不要在一個testA()中依賴testB()。

            直接運行Run->Run As->JUnit Test,就可以看到JUnit測試結果:


            綠色表示測試通過,只要有1個測試未通過,就會顯示紅色并列出未通過測試的方法。可以試圖改變abs()的代碼,故意返回錯誤的結果(比如return n+1;),然后再運行JUnit就會報告錯誤。

            如果沒有JUnit面板,選擇Window->Show View->Other,打開JUnit的View:


            JUnit通過單元測試,能在開發階段就找出許多Bug,并且,多個Test Case可以組合成Test Suite,讓整個測試自動完成,尤其適合于XP方法。每增加一個小的新功能或者對代碼進行了小的修改,就立刻運行一遍Test Suite,確保新增和修改的代碼不會破壞原有的功能,大大增強軟件的可維護性,避免代碼逐漸“腐爛”。
          posted on 2006-12-30 11:32 智者無疆 閱讀(798) 評論(2)  編輯  收藏
          評論:
          • # re: Eclipse快速上手指南之使用JUnit  fireworks 插件 Posted @ 2007-05-18 11:52
            什么是test case
            Test case: 一組測試過程,包括一組測試輸入,一組測試條件,和一組期望輸出。
            Test suite: 各個公司/測試項目經理對他的解釋不盡相同,但是總體來說,Test suite是Test cases的集合。對于一個軟件測試項目,可以有若干個Test suites,也有的只有一個。但是每個test suite肯定包含若干個相關/同類的test cases。

            我對于摟主提出的問題給于這樣的解釋:
            登陸-〉查找 和 登陸-〉添加新人 屬于一個Test suite。 他們分別屬于2個不同的Test cases。
            細分登陸-〉查找這個Test case:如mickoowang2007所說,一組測試輸入可以有,錯誤密碼,錯誤用戶名,正確用戶名和密碼等組成,期望輸出可以是錯誤警告,成功登陸等。

            希望能幫助到摟主,以上僅是一個測試項目經理的點滴經驗,供參考。  回復  更多評論   

          • # re: Eclipse快速上手指南之使用JUnit  智者無疆 Posted @ 2007-05-18 13:19
            JUnit的框架原理
            第一章:JUnit的框架原理分析
            1. JUnit主要用于單元測試,所謂的單元測試就是常常說的白盒測試。它是一個開源的由JAVA開發的一個用于測試的框架。
            2. 下面我們主要是來看一下JUnit的設計原理
            2.1. 首先我們來看一下JUnit的框架圖。

            2.2. JUnit的幾個基本的概念:TestCase,TestSuite,TestFixtrue
            TestCase: 代表一個測試用例,每一個TestCase實例都對應一個測試,
            這個測試通過這個TestCase實例的名字標志,以便在測試結果中指明哪
            個測試出現了問題.TestCase繼承自Assert,因此可以實現各種斷言。
            TestSuite:代表需要測試的一組測試用例,也就是測試用例的集合,
            TestFixtrue:代表一個測試環境。它用于組合一組測試用例,這組測試
            用例需要共同的測試運行環境。


            2.3. junit的設計
            2.3.1. Test接口: 代表一個測試。它是框架的主接口有兩個方法:
            int countTestCases();//返回所有測試用例的個數。
            void run(TestResult result);//運行一個測試,并且收集運行結果
            到TestResult.
            2.3.2. TestCase類: TestCase實現了Test接口,是框架提供的供我們繼承的類,我們的所有的測試方法都需要在TestCase的子類中定義,并且符合特定的設計協議。
            一個TestCase實例代表一個具體的測試實例,對應一個對某一方法或概念的測試。每個TestCase實例都有一個名字。
            一個TestCase類卻定義了一個TestFixture。具體的說就是我們自己定義的TestCase子類中可以定義很多的public 沒有參數的 testxxx方法。運行時,每個testxxx都在自己的fixture中運行。每個運行的TestCase都有一個名字,如果不指定,一般是TestCase中定義的test方法的名字。
            2.3.3. TestSuite類: 和TestCase一樣TestSuite也實現了Test接口。一個TestSuite可以包含一系列的TestCase。把testCase組裝入TestSuite有幾種方式:
            A,通過將TestCase的Class參數傳入TestSuite的構造函數,TestSuite會自動收集TestCase中所有的public的沒有參數的testxxx方法加入TestSuite中。
            B,構造空的TestSuite后通過void addTest(Test test)方法添加測試。
            C:構造空的TestSuite后通過void addTestSuite(Class testClass) 方法添加測試集。
            2.3.4. TestResult類: 主要通過runProtected方法運行測試并收集所有運行結果
            2.3.5. TestRunner類: 啟動測試的主類,我們可以通過直接調用它運行測試用例,IDE和其他一些工具一般也通過這個接口集成JUnit.
            2.3.6. Assert類: 用于斷言,TestCase繼承自該類,我們的測試方法通過這些斷言判斷程序功能是否通過測試


            2.3.7. TestListener接口: 測試運行監聽器,通過事件機制處理測試中產生的事件,主要用于測試結果的收集。
            以上是框架的核心接口和類的介紹,通過上面的介紹我們很容易看出來Test,
            TestCase和TestSuite的設計采用了Composite模式。這樣JUnit可以一次運行
            一個測試用例,也可以一次運行多個測試用例,TestRunner只關心Test接口,而
            對運行的是單個的TestCase還是同時運行多個TestCase并不在意
            3. JUnit同時使用了Command模式,對于典型的Command模式一般有5
            種角色 :
            3.1命令角色(Command):聲明執行操作的接口。有java接口或者抽象
            類來實現
            3.2. 具體命令角色(Concrete Command):將一個接收者對象綁定于一
            個動作;調用接收者相應的操作,以實現命令角色聲明的執行操作的接
            口.
            3.3. 客戶角色(Client):創建一個具體命令對象(并可以設定它的接收者)。
            3.4. 請求者角色(Invoker):調用命令對象執行這個請求.
            3.5. 接收者角色(Receiver):知道如何實施與執行一個請求相關的操作。
            任何類都可能作為一個接收者。
            Test接口可以認為是命令模式中的命令角色Command接口,void run(TestRes
            ult result)接口方法定義了需要執行的操作;TestCase可以看作是具體命令角色,
            但又不全是,因為我們還需要自己通過繼承TestCase類定義測試方法,這樣的每一
            個測試方法都回被包裝在一個TestCase實例中。TestResult可以看作請求者角色
            (Invoker),它會通過protected void run(final TestCase test) 運行測試并
            收集結果。我們自己寫的Test方法可以認為是接收者角色(Receiver),因為我們
            的方法才具體執行這個命令。TestRunner就是客戶角色(Client),它通過TestRe
            sult result= createTestResult()構造TestResult,并通過suite.run(result)運
            行測試用例(suite是一個Test接口的具體實例,可以是TestCase也可以是Test
            Suite,但客戶端不關心它是什么,這就是組合模式的好處。同時,suite.run(res
            ult)又調用result.run(test),如果不仔細分析,就會被這種設計搞迷惑).



            第二章:JUnit的好處和單元測試的編寫原則
            現在世面上有很多的測試工具,比如說NUNIT,PHPUNIT等。但是在JAVA的世界里面JUnit是最適合我們的單元測試工具。
            A:可以使測試代碼與產品代碼分開
            B:針對某一個類的測試代碼通過較少的改動便可以應用于另一個類的測試
            C:易于集成到測試人員的構建過程中,JUnit和Ant的結合可以實施增量開發
            D:JUnit是公開源代碼的,可以進行二次開發
            E:可以方便地對JUnit進行擴展

            編寫原則:
            A: 是簡化測試的編寫,這種簡化包括測試框架的學習和實際測試單元的編寫
            B: 是使測試單元保持持久性
            C: 是可以利用既有的測試來編寫相關的測試

            第三章:JUnit的應用以及擴展
            下面是關于JUNIT的擴展方面的,主要說的是junit.extensions包
            1. ExceptionTestCase是TestCase的子類,用于對預見引發異常時的測試。生成該對象的時候要指明應該引發的異常的類型。runTest的時候會catch并吸收該異常。如果未發現該異常,則 測試失敗
            2. ActiveTestSuite是TestSuite的子類,用獨立的線程來運行每個測試實例。runTest(Test, TestResult)開啟新線程來運行Test。run(TestResult)對所有的Test運行runTest(Test, TestResult),并等待所有線程結束。
            3. TestDecorator是Assert的子類,并實現了Test接口。它封裝Test并把其Test.run(TestResult)作為一個basicRun(TestResult)。TestDecorator.run(TestResult)直接調用basicRun。子類可以重載run(TestResult),從而在原Test.run(TestResult)前后加入新的修飾代碼
            4. RepeatedTest是TestDecorator的子類。RepeatedTest.run(TestResult)重復指定次數運行TestDecorator.run(TestResult)。因此countTestCases()也要在TestDecorator.countTestCases()基礎上乘以重復次數。
            5. TestSetup是TestDecorator的子類。增加新的fixture。在basicRun(TestResult)前運行setUp(),在之后運行tearDown()。 BUG沒有調用TestResult.startTest/endTest,即不產生開始/結束測試事件。
            下面是個簡單的例子:

            Mytest.java類:


            public class Mytest {

            String name;
            String birthday;
            int age;

            public int getAge() {
            return age;
            }
            public void setAge(int age) {
            this.age = age;
            }

            public String getBirthday() {
            return birthday;
            }
            public void setBirthday(String birthday) {
            this.birthday = birthday;
            }
            public String getName() {
            return name;
            }
            public void setName(String name) {
            this.name = name;
            }
            }


            MytestTest .java類

            import junit.framework.Test;
            import junit.framework.TestCase;
            import junit.framework.TestSuite;
            public class MytestTest extends TestCase {

            /*
            * @see TestCase#setUp()
            */
            protected void setUp() throws Exception {
            super.setUp();
            }

            /*
            * @see TestCase#tearDown()
            */
            protected void tearDown() throws Exception {
            super.tearDown();
            }

            /**
            * Constructor for MytestTest.
            * @param arg0
            */
            public MytestTest(String arg0) {
            super(arg0);
            }

            public static Test suite(){
            TestSuite ts = new TestSuite();
            //TestSuite ts = new TestSuite(MytestTest.class);
            ts.addTest(new MytestTest("testgetName"));
            return ts;
            }

            public void testgetName(){
            Mytest mt = new Mytest();
            mt.setName("mahb");
            // assertEquals("gaofei",mt.getName());
            System.out.println("12345455---" + mt.getName());

            }
            public void testgetBirthday(){
            Mytest mt = new Mytest();
            mt.setBirthday("1983.05.26");
            // assertNull(mt.getBirthday());
            assertNotNull(mt.getBirthday());
            assertTrue(mt.getBirthday().equals("1982.1.20"));
            System.out.println("-------"+mt.getBirthday());
            }

            }  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
           
          Copyright © 智者無疆 Powered by: 博客園 模板提供:滬江博客


             觀音菩薩贊

          主站蜘蛛池模板: 奉贤区| 淳化县| 平江县| 三原县| 九江市| 凤庆县| 肇州县| 锦屏县| 正宁县| 壤塘县| 麻栗坡县| 上虞市| 易门县| 同仁县| 游戏| 巴林右旗| 呼图壁县| 娱乐| 内江市| 波密县| 龙南县| 巫山县| 松潘县| 都昌县| 乌拉特中旗| 胶南市| 新巴尔虎左旗| 涿鹿县| 德州市| 江西省| 秦皇岛市| 惠东县| 房山区| 济阳县| 通江县| 聂拉木县| 新竹县| 乌苏市| 孟村| 高雄县| 吉木萨尔县|