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

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

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

    少年阿賓

    那些青春的歲月

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

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

    JUnit是由 Erich Gamma 和 Kent Beck 編寫的一個回歸測試框架(regression testing framework)。Junit測試是程序員測試,即所謂白盒測試,因?yàn)槌绦騿T知道被測試的軟件如何(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("計(jì)算添加失敗", 3, result);

             }

    public void tearDown() {

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

             }

    }



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

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

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

    1)      public

    2)      void

    3)      無參數(shù)的

    4)      測試方法名以test開頭

    5.       Test Case之間一定要保持完全的獨(dú)立性,不允許出現(xiàn)任何的依賴關(guān)系。

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

    7.       關(guān)于setUp與tearDown方法的執(zhí)行順序:

    1) setUp

    2) testAdd

    3) tearDown

    8.       Junit兩種類型錯誤,F(xiàn)ailure 和 Error

    Failure:指預(yù)期結(jié)果與實(shí)際結(jié)果不同,例如當(dāng)你使用assertEquals或者assertXXX方法斷言失敗時,或者調(diào)用fail方法,就會報(bào)出Failure,這時要檢查測試方法邏輯設(shè)計(jì)是否有誤。

        public void testDevide() {

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

            int expected = 0;

            int actual = 0;

            try {

                actual = cal.devide(1, 3);

            } catch (Exception e) {

                Assert.fail("測試失敗"); //不應(yīng)該執(zhí)行這段.

            }

            Assert.assertEquals(expected, actual);

        }

             Error:指程序在斷言執(zhí)行之前,程序就因?yàn)槟撤N錯誤而引發(fā)異常,導(dǎo)致程序終止,例如測試方法中因拋出某個異常,使得測試方法無法正確執(zhí)行到斷言就結(jié)束,這時你要檢查測試的方法是否有未考慮到的情況而引起流程突然中斷。

                   也就是說代碼中拋出了異常等影響代碼正常執(zhí)行的情況,比如ArrayIndexOfBoundsException、NullPointException,也可能是磁盤已滿、網(wǎng)絡(luò)中斷等等外部環(huán)境失敗所帶來的影響。

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

    9.       運(yùn)行測試用例

    1)      IDE中,如Eclipse工具已經(jīng)內(nèi)置了Junit,所以可以直接在測試類中鼠標(biāo)右鍵Run--Junit Test運(yùn)行。



    2)      使用junit.textui.TestRunner類運(yùn)行測試類.

    public static void main(String[] args) {

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

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

    }

    3)      使用TestSuite

    a)        一次可以運(yùn)行多個測試類進(jìn)行測試

    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自動發(fā)現(xiàn)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"));  // 執(zhí)行testABC()方法
            suite.addTest(YYYTest.suite()); // suite() 傳回TestSuite實(shí)例
            suite.addTestSuite(OOOTest.class);//自動查找OOOTest類中testXXX方法
            return suite;
        }

    10.測試之前是什么狀態(tài),在測試執(zhí)行完成后就應(yīng)該是什么狀態(tài),而不應(yīng)該由于測試執(zhí)行的原因到導(dǎo)致了狀態(tài)發(fā)生了變化。

    Junit4.x
    ___________________________________________________________________________

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

    Junit4.x是兼容以前版本

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



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

    @Test

        public void testAdd() {

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



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

    }

    2. 雖然Junit4.x中測試類中的方法名稱可以隨便取,但是建議跟junit3.x中測試類方法命名約定一致,統(tǒng)一方法名以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注解標(biāo)注public,static,void,無參數(shù)的類方法。在所有測試方法執(zhí)行之前和之后執(zhí)行。

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

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

    @Test

        @Ignore("尚未完成")

        public void testMultiply() {

        … …

    }

    Eclipse中Junit執(zhí)行結(jié)果中會提示如下:





    6. 預(yù)期異常:

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

    public void testDevideByZero() {

            Throwable tx = null;

            try {

                cal.devide(1, 0);

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

            } catch (Exception e) {

                tx = e;

            }

            Assert.assertNotNull(tx.getMessage());

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

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

    }

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

        @Test(expected = ArithmeticException.class)

    public void testDevideByZero() throws Exception {

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

    }

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

    8. 測試運(yùn)行器:可以使用@RunWith注解使用的runner.

    Junit4中內(nèi)置的運(yùn)行器有:

    a) 附帶兼容junit3.x運(yùn)行器

    org.junit.internal.runners.Junit38ClassRunner

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

    org.junit.runners.Parameterized

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

    org.junit.runner.Suite

    9. 參數(shù)化運(yùn)行器:

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

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

    c) 測試類構(gòu)造方法中為各個參數(shù)賦值(構(gòu)造方法是由Junit調(diào)用的)

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

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

    @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運(yùn)行器:在Junit4中,如果想同時運(yùn)行多個測試,需要使用兩個注解:

    @RunWith(value = Suite.class)
    @SuiteClasses

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

        @RunWith(value = Suite.class)

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

    public class SuiteCalculatorMyStackTest {

        … …

    }

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

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 欧洲亚洲综合一区二区三区| 国产桃色在线成免费视频| 久久亚洲精品高潮综合色a片| 久久久亚洲精品国产| 亚洲精品99久久久久中文字幕| 91香蕉视频免费| 日日麻批免费40分钟无码 | 久久A级毛片免费观看| fc2成年免费共享视频18| 亚洲免费视频网址| 女人18毛片a级毛片免费视频| 四虎AV永久在线精品免费观看| 亚洲一级在线观看| 成人女人A级毛片免费软件| 中国在线观看免费的www| 日韩免费高清一级毛片| 亚洲色一区二区三区四区| 亚洲国产精品乱码在线观看97| 久久久亚洲欧洲日产国码农村| 久久精品国产精品亚洲| gogo全球高清大胆亚洲| 免费中文字幕在线| 国产一级淫片免费播放电影| 大地资源二在线观看免费高清| 黄网站色在线视频免费观看| 亚洲毛片在线免费观看| 91福利视频免费| 18成禁人视频免费网站| 日本zzzzwww大片免费| 欧洲一级毛片免费| 手机看黄av免费网址| 无码日韩人妻av一区免费| 无码人妻精品一二三区免费| 精品熟女少妇AV免费观看| 毛片大全免费观看| 暖暖在线日本免费中文| 日韩精品视频免费观看| 又粗又硬又黄又爽的免费视频| 亚洲第一视频在线观看免费| 亚洲国产成人影院播放| 国产国拍精品亚洲AV片|