一聚教程网:一个值得你收藏的教程网站

热门教程

java与testng利用XML做数据源的数据驱动实例详解

时间:2022-06-29 02:52:14 编辑:袖梨 来源:一聚教程网

java 与testng利用XML做数据源的数据驱动示例详解

testng的功能很强大,利用@DataProvider可以做数据驱动,数据源文件可以是EXCEL,XML,YAML,甚至可以是TXT文本。在这以XML为例:

备注:@DataProvider的返回值类型只能是Object[][]与Iterator[]

TestData.xml:

  

    1

    

  

  

    3

    

  

  

    3

    

  

  

    3

    

  

  

    3

    

  

处用DOM4J解析XML,ParserXml.java文件:

packagecom.test;

 

importjava.io.File;

importjava.util.ArrayList;

importjava.util.HashMap;

importjava.util.Iterator;

importjava.util.List;

importjava.util.Map;

 

importorg.dom4j.Document;

importorg.dom4j.DocumentException;

importorg.dom4j.Element;

importorg.dom4j.io.SAXReader;

 

publicclassParserXml {

 

  publicList parser3Xml(String fileName) {

    File inputXml =newFile(fileName); 

    List list=newArrayList();       

    intcount =1;

    SAXReader saxReader =newSAXReader();

    try{

      Document document = saxReader.read(inputXml);

      Element employees = document.getRootElement();

      for(Iterator i = employees.elementIterator(); i.hasNext();) {

        Element employee = (Element) i.next();

        Map map =newHashMap();

        Map tempMap =newHashMap();

        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());

    }

    returnlist;

  } 

    

 

}

然后把解析出来的list转换成Object[][]类型的数据,且结合在@DataProvider中。

TestData.java文件:

packagecom.test;

 

importjava.io.File;

importjava.lang.reflect.Method;

importjava.util.ArrayList;

importjava.util.HashMap;

importjava.util.Iterator;

importjava.util.List;

importjava.util.Map;

 

importorg.testng.annotations.DataProvider;

 

publicclassTestData {   

   

  privateList l;

   

  publicTestData() { 

    this.getXmlData();   

  }

   

  publicvoidgetXmlData(){

    ParserXml p =newParserXml();

    l = p.parser3Xml(newFile("src/com/test/TestData.xml").getAbsolutePath());

  }

 

  @DataProvider

  publicObject[][] providerMethod(Method method){   

    List> result =newArrayList>();   

    for(inti =0; i < l.size(); i++) {

      Map m = (Map) l.get(i); 

      if(m.containsKey(method.getName())){             

        Mapdm = (Map) m.get(method.getName());

        result.add(dm); 

      }

    }

    Object[][] files =newObject[result.size()][];

    for(inti=0; i

      files[i] =newObject[]{result.get(i)};

    }   

    returnfiles;

  }

   

 

}

再通过测试文件来测试一下:

TestDataProvider.java文件:

packagecom.test;

 

importjava.util.Map;

 

importorg.testng.annotations.*;

 

publicclassTestDataProviderextendsTestData {

 

  @Test(dataProvider="providerMethod")

  publicvoidtestmethod1(Map param){

    System.out.println("method1 received:"+param.get("input"));

  }

    

  @Test(dataProvider="providerMethod")

  publicvoidtestmethod2(Map param){

    System.out.println("method2 received:"+param.get("input"));

  }

    

  @Test(dataProvider="providerMethod")

  publicvoidtestmethod3(Map param){

    System.out.println("method3 received:"+param.get("input"));

  }

   

  @Test

  publicvoidtestmethod4(){

    System.out.println("method4 received:4");

  }

 

}

我们再回过头来分析一下XML文件,有两个testmethod1结点,testmethod2,testmethod3,testmethod4结点各一个,在TestDataProvider.java文件中,定义了testmethod1,testmethod2,testmethod3,testmethod4四个测试函数,且testmethod4没有用到dataProvider,所以运行结果最后应该是testmethod1运行两遍,testmethod2,testmethod3,testmethod4各运行一遍,结果如下:

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

===============================================

也就是说通过这种方式,只需要把测试函数先写好,然后在XML文件中定义好数据就行了,就能控制函数是否运行,运行次数且运行的数据。

OK,Let's try.....

热门栏目