java and testng use XML for data source data driven examples

  • 2020-05-27 05:38:41
  • OfStack

java and testng use XML for data-driven examples of data sources

testng is very powerful, using @DataProvider to do data driven, data source files can be EXCEL, XML, YAML, or even TXT text. Take XML for example:

Note: the return value type of @DataProvider can only be Object[][] and 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;
  }  
   

}

The parsed list is then converted into data of type Object[][] and combined with @DataProvider.

TestData. java file:


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;
  }
  

}

Then test 1 through the test file:

TestDataProvider. java file:


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");
  }

}

In the TestDataProvider.java file, testmethod1, testmethod2, testmethod3 and testmethod44 test functions are defined, and testmethod4 does not use dataProvider. Therefore, the final running result should be testmethod1 twice, testmethod2, testmethod3 and testmethod4 each once. The results are as follows:


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
===============================================

In other words, by writing the test function first and then defining the data in the XML file, you can control whether the function runs, how many times it runs and the data it runs.

OK, Let 's try...

Thank you for reading, I hope to help you, thank you for your support of this site!


Related articles: