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;
}
}
然后把解析出來(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ù)先寫好,然后在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ù)源注解開(kāi)發(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)文章
SpringBoot集成Redis使用Cache緩存的實(shí)現(xiàn)方法
SpringBoot通過(guò)配置RedisConfig類和使用Cache注解可以輕松集成Redis實(shí)現(xiàn)緩存,主要包括@EnableCaching開(kāi)啟緩存,自定義key生成器,改變序列化規(guī)則,以及配置RedisCacheManager,本文為使用SpringBoot與Redis處理緩存提供了詳實(shí)的指導(dǎo)和示例,感興趣的朋友一起看看吧2024-10-10
SpringBoot使用jasypt加解密密碼的實(shí)現(xiàn)方法(二)
這篇文章主要介紹了SpringBoot使用jasypt加解密密碼的實(shí)現(xiàn)方法(二),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
Java實(shí)現(xiàn)文件變化監(jiān)聽(tīng)代碼實(shí)例
這篇文章主要介紹了Java實(shí)現(xiàn)文件變化監(jiān)聽(tīng)代碼實(shí)例,通過(guò)定時(shí)任務(wù),輪訓(xùn)查詢文件的最后修改時(shí)間,與上一次進(jìn)行對(duì)比,如果發(fā)生變化,則說(shuō)明文件已經(jīng)修改,進(jìn)行重新加載或?qū)?yīng)的業(yè)務(wù)邏輯處理,需要的朋友可以參考下2024-01-01
Springboot之@Controller注解不生效問(wèn)題及解決
這篇文章主要介紹了Springboot之@Controller注解不生效問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10
SpringMVC打印請(qǐng)求參數(shù)和響應(yīng)數(shù)據(jù)最優(yōu)方案
項(xiàng)目中經(jīng)常需要打印http請(qǐng)求的參數(shù)和響應(yīng)數(shù)據(jù),本文給大家講解如何在SpringMVC打印請(qǐng)求參數(shù)和響應(yīng)數(shù)據(jù)最優(yōu)方案,感興趣的朋友跟隨小編一起看看吧2023-07-07

