現在測試很多接口返回的類型是XML的字符串,當返回值為較小的值的時候。期望結果直接寫在代碼裡邊是靠普的。
但是當返回結果相當大的時候,期望值保存在哪裡呢,以前我也做過直接寫在代碼裡,結果造成代碼行相當的長,幾乎
一個測試用例只能看見期望結果的數據了,自然不好。那麼如果存在文件裡如何 呢?可能會有這樣的疑問存在文件裡如何 比較
呢,采用文本內容比較嗎?總覺得不太靠普,至少XML特征沒能體現,譬如不能告訴我是哪個節點出錯了。
今天我發覺 xmlunit有這個功能(有點後知後覺,大家不要笑話);而且結合XML其他的jar包可以高速處理這個疑問,而且代碼
也很精簡
特貼代碼如下
public void tet() throws Exception
{
String actXmlText ="<?XML version=\"1.0\" encoding=\"utf-8\"?>" +"\r\n"+
"<error_response>" +"\r\n"+
" <args>" +"\r\n"+
" <arg></arg>" +"\r\n"+
" </args>" +"\r\n"+
" <code>16</code>" +"\r\n"+
" <msg>wang wang service return error</msg>" +"\r\n" +
" <sub_code>33000</sub_code>" +"\r\n" +
" <sub_msg>wang wang service error: param error.</sub_msg>" +"\r\n" +
"</error_response>";
System.out.println(actXMLText);
DocumentBuilderFactory domfac = DocumentBuilderFactory.newInstance();
DocumentBuilder dombuilder=domfac.newDocumentBuilder();
InputStream is= new FileInputStream("c:/11.XML");
Document doc = dombuilder.parse(is);
InputStream is1 = new FileInputStream("c:/12.XML");
Document doc1 = dombuilder.parse(is1);
Document doc2 = dombuilder.parse( new ByteArrayInputStream(actXMLText.getBytes()));
XMLAssert.assertXMLEqual(doc2, doc);
XMLAssert.assertXMLEqual(doc2, doc1);
}
這裡為了方便代碼展示沒有將actXMLText寫成大字符串,實際上通常測試場景中這個代表調用接口返回值
代碼會是類似下面的代碼
WebConversation conversation = new WebConversation();
WebRequest request = new PostMethodWebRequest(Url);
WebResponse response = conversation.getResponse(request);
System.out.println(response.getText());
String actXMLText = response.getText();
測試結果不正確
會報如下內容,明確告訴你哪個節點出錯了:
junit.framework.AssertionFailedError: org.custommonkey.XMLunit.Diff
[different] Exp ected text value ‘16′ but was ‘15′ – comparing 16 at /error_response[1]/code[1]/text()[1] to 15 at /error_response[1]/code[1]/text()[1]