1. 程式人生 > >xml引數化、自動化單元測試設計

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>節點

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

以上。