xml引數化、自動化單元測試設計
先在開源中國技術分享區發了一下,應者寥寥。http://www.oschina.net/question/1045821_144322
最近在做單元測試相關的東西,有一些想法,也研究實現了一部分,和大家分享。
單元測試的用例要和程式碼分離,採用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>節點下有多個<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,在此不過多介紹了。
以上。