您的位置:軟件測(cè)試 > 開(kāi)源軟件測(cè)試 > 開(kāi)源單元測(cè)試工具 > TestNG
Java結(jié)合TestNG,利用XML做數(shù)據(jù)源的數(shù)據(jù)驅(qū)動(dòng)示例
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時(shí)間:[ 2017/2/4 10:57:51 ] 推薦標(biāo)簽:單元測(cè)試 TestNG

  testng的功能很強(qiáng)大,利用@DataProvider可以做數(shù)據(jù)驅(qū)動(dòng),數(shù)據(jù)源文件可以是EXCEL,XML,YAML,甚至可以是TXT文本。在這以XML為例:
  備注:@DataProvider的返回值類型只能是Object[][]與Iterator<Object>[]
  TestData.xml:
<?xml version="1.0" encoding="UTF-8"?>
<data>
<testmethod1>
<input>1</input>
<button>2</button>
</testmethod1>
<testmethod1>
<input>3</input>
<button>4</button>
</testmethod1>
<testmethod2>
<input>3</input>
<button>4</button>
</testmethod2>
<testmethod3>
<input>3</input>
<button>4</button>
</testmethod3>
<testmethod4>
<input>3</input>
<button>4</button>
</testmethod4>
</data>
  處用DOM4J解析XML,ParserXml.java文件:
package com.test;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class ParserXml {
public List parser3Xml(String fileName) {
File inputXml = new File(fileName);
List list=new ArrayList();
int count = 1;
SAXReader saxReader = new SAXReader();
try {
Document document = saxReader.read(inputXml);
Element employees = document.getRootElement();
for (Iterator i = employees.elementIterator(); i.hasNext();) {
Element employee = (Element) i.next();
Map map = new HashMap();
Map tempMap = new HashMap();
for (Iterator j = employee.elementIterator(); j.hasNext();) {
Element node = (Element) j.next();
tempMap.put(node.getName(), node.getText());
}
map.put(employee.getName(), tempMap);
list.add(map);
}
} catch (DocumentException e) {
System.out.println(e.getMessage());
}
return list;
}
}
  然后把解析出來(lái)的list轉(zhuǎn)換成Object[][]類型的數(shù)據(jù),且結(jié)合在@DataProvider中。
  TestData.java文件:
package com.test;
import java.io.File;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.testng.annotations.DataProvider;
public class TestData {
private List l;
public TestData() {
this.getXmlData();
}
public void getXmlData(){
ParserXml p = new ParserXml();
l = p.parser3Xml(new File("src/com/test/TestData.xml").getAbsolutePath());
}
@DataProvider
public Object[][] providerMethod(Method method){
List<Map<String, String>> result = new ArrayList<Map<String, String>>();
for (int i = 0; i < l.size(); i++) {
Map m = (Map) l.get(i);
if(m.containsKey(method.getName())){
Map<String, String> dm = (Map<String, String>) m.get(method.getName());
result.add(dm);
}
}
Object[][] files = new Object[result.size()][];
for(int i=0; i<result.size(); i++){
files[i] = new Object[]{result.get(i)};
}
return files;
}
}
  再通過(guò)測(cè)試文件來(lái)測(cè)試一下:
  TestDataProvider.java文件:
package com.test;
import java.util.Map;
import org.testng.annotations.*;
public class TestDataProvider extends TestData {
@Test(dataProvider="providerMethod")
public void testmethod1(Map<?, ?> param){
System.out.println("method1 received:"+param.get("input"));
}
@Test(dataProvider="providerMethod")
public void testmethod2(Map<?, ?> param){
System.out.println("method2 received:"+param.get("input"));
}
@Test(dataProvider="providerMethod")
public void testmethod3(Map<?, ?> param){
System.out.println("method3 received:"+param.get("input"));
}
@Test
public void testmethod4(){
System.out.println("method4 received:4");
}
}
  我們?cè)倩剡^(guò)頭來(lái)分析一下XML文件,有兩個(gè)testmethod1結(jié)點(diǎn),testmethod2,testmethod3,testmethod4結(jié)點(diǎn)各一個(gè),在TestDataProvider.java文件中,定義了testmethod1,testmethod2,testmethod3,testmethod4四個(gè)測(cè)試函數(shù),且testmethod4沒(méi)有用到dataProvider,所以運(yùn)行結(jié)果后應(yīng)該是testmethod1運(yùn)行兩遍,testmethod2,testmethod3,testmethod4各運(yùn)行一遍,結(jié)果如下:
method1 received:1
method1 received:3
method2 received:3
method3 received:3
method4 received:4
PASSED: testmethod1({input=1, button=2})
PASSED: testmethod1({input=3, button=4})
PASSED: testmethod2({input=3, button=4})
PASSED: testmethod3({input=3, button=4})
PASSED: testmethod4
===============================================
Default test
Tests run: 5, Failures: 0, Skips: 0
===============================================
  也是說(shuō)通過(guò)這種方式,只需要把測(cè)試函數(shù)先寫(xiě)好,然后在XML文件中定義好數(shù)據(jù)行了,能控制函數(shù)是否運(yùn)行,運(yùn)行次數(shù)且運(yùn)行的數(shù)據(jù)。

軟件測(cè)試工具 | 聯(lián)系我們 | 投訴建議 | 誠(chéng)聘英才 | 申請(qǐng)使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd