單元測試的用例要和代碼分離,采用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/