少年阿賓

          那些青春的歲月

            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 閱讀(1290) 評論(0)  編輯  收藏 所屬分類: Junit

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


          網站導航:
           
          主站蜘蛛池模板: 栾城县| 江都市| 柳州市| 连州市| 扎赉特旗| 辽中县| 洪雅县| 五莲县| 舟曲县| 漳州市| 松滋市| 思茅市| 通道| 宁安市| 奉贤区| 博兴县| 新宁县| 宜良县| 永兴县| 自贡市| 河池市| 黄石市| 肇源县| 深水埗区| 疏勒县| 墨脱县| 凭祥市| 南汇区| 小金县| 萝北县| 晋宁县| 根河市| 双柏县| 新余市| 梓潼县| 白沙| 通河县| 茌平县| 资阳市| 理塘县| 灵武市|