天天看點

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">

<param type="com.xxx.request.tokenrequest">

<response type="com.elong.pb.payment.api.domain.response.tokenresponse">

</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,在此不過多介紹了。

  以上。

最新内容請見作者的github頁:http://qaseven.github.io/