qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          xml參數化、自動化單元測試設計

           最近在做單元測試相關的東西,有一些想法,也研究實現了一部分,和大家分享。
            單元測試的用例要和代碼分離,采用xml的格式。
            每一個單元測試類對應一個xml,采用如下格式:
          <class name="com.xxx.service.test.DemoServiceTest">
          <beforeClass></beforeClass>
          <afterClass></afterClass>
          <method name="testGetToken">
          <before></before>
          <after></after>
          <!--對一個方法可能有多個測試用例 -->
          <!-- 輸入參數類型錯誤 -->
          <case name="err_001">
          <!-- 方法參數可能有多個 -->
          <request>
          <param type="com.xxxi.domain.request.TokenRequest">
          <merchantId>33333</merchantId>
          <signType>MD5</signType>
          <businessType>1001</businessType>
          <outTradeNo>4222222222</outTradeNo>
          </param>
          </request>
          <!-- 方法期望返回值 -->
          <response type="com.xxx.domain.response.TokenResponse">
          <responseCode>0</responseCode>
          <tradeNo>831</tradeNo>
          </response>
          </case>
          <case name="case_002">
          <request>
          <param type="com.xxx.request.TokenRequest">
          <merchantId>33333</merchantId>
          <signType>MD5</signType>
          <businessType>1001</businessType>
          <outTradeNo>4222222222</outTradeNo>
          </param>
          </request>
          <!-- 方法期望返回值 -->
          <response type="com.elong.pb.payment.api.domain.response.TokenResponse">
          <responseCode>0</responseCode>
          <tradeNo>831</tradeNo>
          </response>
          </case>
          </method>
          </class>
            根節點為單元測試類的類名
            類下面是多個<method>節點
            每個<method>節點下有多個<case>節點
            每個<case>節點下有<request>和<response>分別為輸入參數和期望返回結果
            輸入參數可能有多個,故<request>節點下可能有多個<param>節點
           以上是對xml設計的介紹。
            下面講實現。
            通過一些實際使用,發現JUnit對參數化的支持非常不好。對于參數化測試有很大的局限性,參數必須定義成類的成員變量,這樣對于一個類中有多個測試方法造成很大的不便。JUnit的參數化測試只適合一個類只有一個測試方法的情況。
            于是我用了TestNG,TestNG也是一個(但并不僅僅是)單元測試框架,與JUnit類似,有類似的生命周期和類似的用法。但TestNG對參數化測試支持的很好:
          public class TestNGTest {
          @DataProvider(name = "test2")
          public Object[][] createTest2() {
          return new Object[][] { { "input1", "expect" }, { "input2", "expect2" } };
          }
          }
          @Test(dataProvider = "test2")
          public void test2(String input,  String expect) {
          System.err.println(input+" "+expect);
          }
          }
            TestNG的每個測試方法是可以有參數的,有一個數據提供者(dataProvider注解),dataProvider和每個test是一一對應的關系。這樣是方法級別的(而JUnit是類級別)
            DataProvider會返回一個二維數組。剩下的事情就是如何讀取解析上面的xml,并生成二維數組返回了。
            (好像TestNG也有一個xml配置,配置DataProvider,但感覺不怎么樣,可能只支持簡單類型,不利于自己定制)
            對web controller的測試也與之類似,springmvc有mockMvc,在此不過多介紹了。
            以上。

          posted on 2014-02-27 10:11 順其自然EVO 閱讀(231) 評論(0)  編輯  收藏 所屬分類: 測試學習專欄

          <2014年2月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          2324252627281
          2345678

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 翁源县| 桐梓县| 连云港市| 鹤峰县| 抚宁县| 治县。| 金川县| 浦江县| 苏尼特右旗| 射洪县| 嘉鱼县| 潢川县| 怀宁县| 建瓯市| 湾仔区| 长顺县| 丰顺县| 依安县| 卓尼县| 南和县| 澄江县| 穆棱市| 湘乡市| 辛集市| 宜城市| 额敏县| 罗田县| 华坪县| 玛曲县| 松溪县| 安丘市| 平武县| 阿合奇县| 宿迁市| 靖江市| 济南市| 保山市| 新龙县| 梁河县| 盐边县| 资溪县|