java 與testng利用XML做數(shù)據(jù)源的數(shù)據(jù)驅(qū)動(dòng)示例詳解
java 與testng利用XML做數(shù)據(jù)源的數(shù)據(jù)驅(qū)動(dòng)示例詳解
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;
}
}
然后把解析出來的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;
}
}
再通過測(cè)試文件來測(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è)倩剡^頭來分析一下XML文件,有兩個(gè)testmethod1結(jié)點(diǎn),testmethod2,testmethod3,testmethod4結(jié)點(diǎn)各一個(gè),在TestDataProvider.java文件中,定義了testmethod1,testmethod2,testmethod3,testmethod4四個(gè)測(cè)試函數(shù),且testmethod4沒有用到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
===============================================
也就是說通過這種方式,只需要把測(cè)試函數(shù)先寫好,然后在XML文件中定義好數(shù)據(jù)就行了,就能控制函數(shù)是否運(yùn)行,運(yùn)行次數(shù)且運(yùn)行的數(shù)據(jù)。
OK,Let's try.....
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- Java Mybatis數(shù)據(jù)源之工廠模式
- Java Spring詳解如何配置數(shù)據(jù)源注解開發(fā)以及整合Junit
- 一小時(shí)迅速入門Mybatis之bind與多數(shù)據(jù)源支持 Java API
- 如何在Java SpringBoot項(xiàng)目中配置動(dòng)態(tài)數(shù)據(jù)源你知道嗎
- Java使用C3P0數(shù)據(jù)源鏈接數(shù)據(jù)庫(kù)
- Java自動(dòng)化測(cè)試中多數(shù)據(jù)源的切換(實(shí)例講解)
- Java注解實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換的實(shí)例代碼
- Spring MVC配置雙數(shù)據(jù)源實(shí)現(xiàn)一個(gè)java項(xiàng)目同時(shí)連接兩個(gè)數(shù)據(jù)庫(kù)的方法
- Java mysql詳細(xì)講解雙數(shù)據(jù)源配置使用
相關(guān)文章
mybatis-plus?Wrapper條件構(gòu)造器updateForSet更新方式
這篇文章主要介紹了mybatis-plus?Wrapper條件構(gòu)造器updateForSet更新方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
SpringCloud解決feign調(diào)用token丟失問題解決辦法
在feign調(diào)用中可能會(huì)遇到如下問題:同步調(diào)用中,token丟失,這種可以通過創(chuàng)建一個(gè)攔截器,將token做透?jìng)鱽斫鉀Q,異步調(diào)用中,token丟失,這種就無法直接透?jìng)髁?因?yàn)樽泳€程并沒有token,這種需要先將token從父線程傳遞到子線程,再進(jìn)行透?jìng)?/div> 2024-05-05
實(shí)例講解Java讀取一般文本文件和word文檔的方法
讀取一般文本文件很好辦,調(diào)用Java自帶的io包里的類即可,富文本的doc文件我們可以用Apache的poi項(xiàng)目中的WordExtractor,這里我們一起來以實(shí)例講解Java讀取一般文本文件和word文檔的方法2016-06-06
如何使用CountDownLatch同步j(luò)ava多線程
這篇文章主要介紹了如何使用CountDownLatch同步j(luò)ava多線程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
Java實(shí)現(xiàn)微信網(wǎng)頁授權(quán)的示例代碼
這篇文章主要介紹了Java實(shí)現(xiàn)微信網(wǎng)頁授權(quán)的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07
Java中JSONObject與JSONArray的使用區(qū)別詳解
這篇文章主要介紹了Java中JSONObject與JSONArray的使用區(qū)別詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11最新評(píng)論

