<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    少年阿賓

    那些青春的歲月

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks
    軟件測試
    ___________________________________________________________________________
    Unit Test是由程序員本身來編寫的。

    以下介紹Junit單元測試框架:官網地址www.junit.org

    JUnit是由 Erich Gamma 和 Kent Beck 編寫的一個回歸測試框架(regression testing framework)。Junit測試是程序員測試,即所謂白盒測試,因為程序員知道被測試的軟件如何(How)完成功能和完成什么樣(What)的功能。

    Junit3.x
    ___________________________________________________________________________

    Junit3.x中使用包junit.framework.*

    1.       必須繼承TestCase類

    public class CalculatorTest extends TestCase {

        private Calculator cal;

        public CalculatorTest() {

        }

        public CalculatorTest(String name) {

            super(name);

        }

        public void setUp() {

            System.out.println("...........setUp..............");

            cal = new Calculator();

        }

        public void testAdd() {

            int result = cal.add(1, 2);

            Assert.assertEquals("計算添加失敗", 3, result);

             }

    public void tearDown() {

            System.out.println("........tearDown........");

             }

    }



    2.       測試用例(Test Case)是單元測試的一個非常重要的方面。

    3.       單元測試主要是用來判斷程序的執行結果與自己期望的結果是否一致。

    4.       在Junit3.x中,測試方法規則定義如下:

    1)      public

    2)      void

    3)      無參數的

    4)      測試方法名以test開頭

    5.       Test Case之間一定要保持完全的獨立性,不允許出現任何的依賴關系。

    6.       我們不能依賴于測試方法的執行順序。

    7.       關于setUp與tearDown方法的執行順序:

    1) setUp

    2) testAdd

    3) tearDown

    8.       Junit兩種類型錯誤,Failure 和 Error

    Failure:指預期結果與實際結果不同,例如當你使用assertEquals或者assertXXX方法斷言失敗時,或者調用fail方法,就會報出Failure,這時要檢查測試方法邏輯設計是否有誤。

        public void testDevide() {

            System.out.println(".........testDevide()........");

            int expected = 0;

            int actual = 0;

            try {

                actual = cal.devide(1, 3);

            } catch (Exception e) {

                Assert.fail("測試失敗"); //不應該執行這段.

            }

            Assert.assertEquals(expected, actual);

        }

             Error:指程序在斷言執行之前,程序就因為某種錯誤而引發異常,導致程序終止,例如測試方法中因拋出某個異常,使得測試方法無法正確執行到斷言就結束,這時你要檢查測試的方法是否有未考慮到的情況而引起流程突然中斷。

                   也就是說代碼中拋出了異常等影響代碼正常執行的情況,比如ArrayIndexOfBoundsException、NullPointException,也可能是磁盤已滿、網絡中斷等等外部環境失敗所帶來的影響。

    首先處理Error,然后在處理Failure.

    9.       運行測試用例

    1)      IDE中,如Eclipse工具已經內置了Junit,所以可以直接在測試類中鼠標右鍵Run--Junit Test運行。



    2)      使用junit.textui.TestRunner類運行測試類.

    public static void main(String[] args) {

            junit.textui.TestRunner.run(MyStackTest.class);

            junit.textui.TestRunner.run(new CalculatorTest("testAdd"));

    }

    3)      使用TestSuite

    a)        一次可以運行多個測試類進行測試

    public class TestAll {
        public static Test suite() {
            TestSuite suite = new TestSuite();
            suite.addTestSuite(OOOTest.class);
            suite.addTestSuite(XXXTest.class);
            suite.addTestSuite(YYYTest.class);
            return suite;
        }
        public static void main(String[] args) {
            TestRunner.run(suite());
        }
    }

    b)        通過IDE自動發現suite()方法,必須繼承TestCase

    public class TestAll extends TestCase {
        public static Test suite() {
            TestSuite suite = new TestSuite();
            suite.addTestSuite(OOOTest.class);
            suite.addTestSuite(XXXTest.class);
            suite.addTestSuite(YYYTest.class);
            return suite;
        }
    }

    c)   組合模式,組合方式多元化

    ……

    public static Test suite() {
            TestSuite suite = new TestSuite();
            suite.addTest(new XXXTest("testABC"));  // 執行testABC()方法
            suite.addTest(YYYTest.suite()); // suite() 傳回TestSuite實例
            suite.addTestSuite(OOOTest.class);//自動查找OOOTest類中testXXX方法
            return suite;
        }

    10.測試之前是什么狀態,在測試執行完成后就應該是什么狀態,而不應該由于測試執行的原因到導致了狀態發生了變化。

    Junit4.x
    ___________________________________________________________________________

    Junit4.x開始支持Annotation注解技術,在編寫測試用例時簡化不少動作.
    Junit4.x中使用的包org.junit.*

    Junit4.x是兼容以前版本

    Eclipse中自帶了Junit4,版本為junit4.3.1. BC-EC工程中使用的版本為Junit4.4,目前最新版本4.11



    1. 無需繼承TestCase類,所有被@Test注解所修飾的public,void,無參數的方法都是測試用例,Junit自動查找注解方法并執行測試。

    @Test

        public void testAdd() {

            int result = cal.add(1, 2);



            Assert.assertEquals("計算添加失敗", 3, result);

    }

    2. 雖然Junit4.x中測試類中的方法名稱可以隨便取,但是建議跟junit3.x中測試類方法命名約定一致,統一方法名以test開頭。

    3. 使用@Before注解所修飾的方法同junit3.x中的setUp方法的功能,使用@After注解所修改的方法同junit3.x測試類中的tearDown方法的功能。 @Before和@After可以在多次指定.

    @Before

        public void init() {

            System.out.println("...........setUp..............");

            cal = new Calculator();

    }



    @After

        public void destroy() {

            System.out.println("........tearDown........");

    }

    4. 通過@BeforeClass和@AfterClass注解標注public,static,void,無參數的類方法。在所有測試方法執行之前和之后執行。

    @BeforeClass
    public static void setUpBeforeClass() {
        ...
    }
    @AfterClass
    public static void tearDownAfterClass() {
        ...
    }

    5. 使用@Ignore注解所修飾的方法(可以表示尚未編寫完該用例或者想禁用該用例),運行器會忽略該方法的測試;當修飾類時,運行器會忽略掉所有測試方法。

    @Test

        @Ignore("尚未完成")

        public void testMultiply() {

        … …

    }

    Eclipse中Junit執行結果中會提示如下:





    6. 預期異常:

    也可以使用在junit3.x中提到的fail()來測試預期拋出異常的情況。

    public void testDevideByZero() {

            Throwable tx = null;

            try {

                cal.devide(1, 0);

                Assert.fail("應該按預期拋出異常,測試失敗");

            } catch (Exception e) {

                tx = e;

            }

            Assert.assertNotNull(tx.getMessage());

            Assert.assertEquals(ArithmeticException.class, tx.getClass());

            Assert.assertEquals("除數不能為0!", tx.getMessage());

    }

    junit4中使用Test中的expected屬性達到相同的功能,代碼量小很多.

        @Test(expected = ArithmeticException.class)

    public void testDevideByZero() throws Exception {

            cal.devide(1, 0); // 應該拋出異常

    }

    7. 使用@Test(timeout = 2000) 注解預期某些操作應該在指定時間內完成,否則測試失敗。    單位是毫秒。

    8. 測試運行器:可以使用@RunWith注解使用的runner.

    Junit4中內置的運行器有:

    a) 附帶兼容junit3.x運行器

    org.junit.internal.runners.Junit38ClassRunner

    b) 參數化運行器,可設定一組參數,每次運行測試時自動在指定位置給予不同的參數。

    org.junit.runners.Parameterized

    c) Suite運行器,如同Junit3.x中的TestSuite, 用于任意組合測試.

    org.junit.runner.Suite

    9. 參數化運行器:

    a) 使用注解@RunWith(value = Parameterized.class) 指定參數化運行器,

    b) 定義好一個方法,返回一組參數數據,使用注解@Parameterized.Parameters

    c) 測試類構造方法中為各個參數賦值(構造方法是由Junit調用的)

    d) 方法必須是public,static,void,no-arg,返回一個Collection。

    e) 方法中每個元素必須是一個一維數組,數組中第一個為預期值,之后參數一,參數二等。

    @RunWith(value = Parameterized.class)

    public class ParamCalculatorTest {



        private Calculator cal;

        private int expected;

        private int para1;

        private int para2;



        @Parameterized.Parameters

        public static Collection<Integer[]> getParamData() {

           Integer[][] data = new Integer[][] { { 5, 3, 2 }, { 3, 1, 2 }, { 2, 1, 1 } };

            return Arrays.asList(data);

        }



        @Before

        public void init() {

            cal = new Calculator();

        }



    public ParamCalculatorTest(int expected, int para1, int para2) {

            this.expected = expected;

            this.para1 = para1;

            this.para2 = para2;

        }



        @Test

        public void testAdd() {

            int result = cal.add(para1, para2);

            Assert.assertEquals(expected, result);

    }



        @After

        public void destory() {

        }

    }



    10.Suite運行器:在Junit4中,如果想同時運行多個測試,需要使用兩個注解:

    @RunWith(value = Suite.class)
    @SuiteClasses

    使用以上兩個注解會通過Suite運行器來執行測試,在SuiteClasses中指定測試類,也可以繼續指定Suite,這樣Junit會在去查找里面的測試類并執行。

        @RunWith(value = Suite.class)

    @SuiteClasses( { CalculatorTest.class, MyStackTest.class })

    public class SuiteCalculatorMyStackTest {

        … …

    }

    posted on 2012-11-02 14:16 abin 閱讀(1288) 評論(0)  編輯  收藏 所屬分類: Junit

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


    網站導航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     
    主站蜘蛛池模板: 中文亚洲AV片不卡在线观看| 色妞WWW精品免费视频| 最近免费中文字幕大全| 一级一级一片免费高清| 麻豆精品成人免费国产片| 精品国产_亚洲人成在线高清| 国产精品永久免费视频| 亚洲欧洲日产国码无码久久99| 国产精品视频全国免费观看| 337p日本欧洲亚洲大胆裸体艺术| 久久久久久久国产免费看| 亚洲AV无码专区电影在线观看| 99视频在线免费看| 97久久国产亚洲精品超碰热| 在线免费观看色片| 一区二区三区免费视频播放器| 精品亚洲一区二区三区在线观看 | 亚洲国产精品美女久久久久| 在线观看亚洲免费| 九九全国免费视频| 亚洲欧洲日韩国产综合在线二区| av无码国产在线看免费网站| 久久无码av亚洲精品色午夜| 久久亚洲国产精品123区| 99re热精品视频国产免费| 亚洲日本国产综合高清| 日产国产精品亚洲系列| 可以免费观看的毛片| 国产亚洲中文日本不卡二区| 亚洲AV无码乱码在线观看性色扶| 成人黄网站片免费视频| 亚洲免费电影网站| 亚洲精品人成无码中文毛片| 日韩精品无码一区二区三区免费| 99亚偷拍自图区亚洲| 国产亚洲精品久久久久秋霞 | 成人au免费视频影院| 国产精品视频全国免费观看| 亚洲国产美女在线观看| 免费在线观看理论片| 亚洲一区二区三区免费视频|