軟件藝術(shù)思考者  
          混沌,彷徨,立志,蓄勢...
          公告
          日歷
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          導(dǎo)航

          隨筆分類(86)

          隨筆檔案(85)

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

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

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



            下一步,我們準(zhǔn)備對(duì)這個(gè)方法進(jìn)行測試,確保功能正常。選中Hello.java,右鍵點(diǎn)擊,選擇New->JUnit Test Case:


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


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

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

              

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


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

            如果有多個(gè)testXxx方法,JUnit會(huì)創(chuàng)建多個(gè)XxxTest實(shí)例,每次運(yùn)行一個(gè)testXxx方法,setUp()和tearDown()會(huì)在testXxx前后被調(diào)用,因此,不要在一個(gè)testA()中依賴testB()。

            直接運(yùn)行Run->Run As->JUnit Test,就可以看到JUnit測試結(jié)果:


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

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


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

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

            希望能幫助到摟主,以上僅是一個(gè)測試項(xiàng)目經(jīng)理的點(diǎn)滴經(jīng)驗(yàn),供參考。  回復(fù)  更多評(píng)論   

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

            2.2. JUnit的幾個(gè)基本的概念:TestCase,TestSuite,TestFixtrue
            TestCase: 代表一個(gè)測試用例,每一個(gè)TestCase實(shí)例都對(duì)應(yīng)一個(gè)測試,
            這個(gè)測試通過這個(gè)TestCase實(shí)例的名字標(biāo)志,以便在測試結(jié)果中指明哪
            個(gè)測試出現(xiàn)了問題.TestCase繼承自Assert,因此可以實(shí)現(xiàn)各種斷言。
            TestSuite:代表需要測試的一組測試用例,也就是測試用例的集合,
            TestFixtrue:代表一個(gè)測試環(huán)境。它用于組合一組測試用例,這組測試
            用例需要共同的測試運(yùn)行環(huán)境。


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


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



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

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

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

            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());
            }

            }  回復(fù)  更多評(píng)論   


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
           
          Copyright © 智者無疆 Powered by: 博客園 模板提供:滬江博客


             觀音菩薩贊

          主站蜘蛛池模板: 三门峡市| 乌鲁木齐县| 日喀则市| 阿荣旗| 克山县| 汝南县| 濮阳县| 丰镇市| 洞口县| 山东| 乌审旗| 高密市| 隆昌县| 富锦市| 衡阳市| 山阳县| 满城县| 淮安市| 老河口市| 营山县| 泸州市| 大足县| 赤壁市| 江西省| 凌海市| 吐鲁番市| 锦屏县| 浏阳市| 芷江| 潼南县| 长海县| 类乌齐县| 万载县| 达日县| 郧西县| 潼南县| 博客| 翼城县| 郎溪县| 堆龙德庆县| 湖州市|