当前位置: 首页 > 编程笔记 >

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

东郭元魁
2023-03-14
本文向大家介绍java 与testng利用XML做数据源的数据驱动示例详解,包括了java 与testng利用XML做数据源的数据驱动示例详解的使用技巧和注意事项,需要的朋友参考一下

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

testng的功能很强大,利用@DataProvider可以做数据驱动,数据源文件可以是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转换成Object[][]类型的数据,且结合在@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;
  }
  

}

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

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

}

我们再回过头来分析一下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.....

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

 类似资料:
  • 问题内容: 我有一系列要在电子商务平台上测试的商店,并且每个商店都具有要针对其自动化测试的一系列属性。是否可以有一个数据提供程序在整个测试套件中提供数据,而不仅仅是在TestNG中提供测试?我试图不使用testNG.xml文件作为机制,因为这些属性直接来自数据库调用。 我需要自动执行以下操作: @Test在当前数据集行中使用用户名和密码登录。 @Test验证StoreName和items-stor

  • 使用此文档了解如何使用数据驱动的动画 数据驱动的动画是使用从各种数据源收集的实时数据创建的,这些数据源驱动着合成中的动画。您可以使用来自多个数据源的数据。数据可以为静态或随时间变化。您可以将数据导入 After Effects 项目并将其用作输入,用于对图形、字符、控件视觉效果、电影字幕以及其他动态图形进行动画制作。数据驱动的动画示例 数据源 您可以使用几乎所有可能的来源的数据,例如: 设备生成的

  • MIP 数据驱动机制通过数据绑定表达式来实现对节点属性和文本的控制,但在一些更为复杂的页面来说,还需要控制增删节点的能力,在这种情况下可以使用 mip-list 来实现这个需求。 提示: 本文的重点主要在于如何利用数据驱动 mip-list 来实现增删节点的功能,想要完整地了解 mip-list 的用法,可以查看 mip-list 的组件文档说明。 mip-list 的模板渲染能力 mip-lis

  • Tableau可以与广泛使用的所有可访问数据源连接。它可以链接到Excel文件,PDF文件,文本文件等。它还可以使用其ODBC连接器连接到各种数据库。Tableau可以连接到Web连接器和服务器。 Tableaus本机连接器可以连接到以下类型的数据源: 文件系统:如Microsoft Excel,CSV等。 云系统:例如Google bigQuery,Windows Azure等。 关系系统:如M

  • 本文向大家介绍Go语言集成mysql驱动、调用数据库、查询数据操作示例,包括了Go语言集成mysql驱动、调用数据库、查询数据操作示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Go语言集成mysql驱动、调用数据库、查询数据操作。分享给大家供大家参考,具体如下: 1、安装第三方mysql驱动包 2、连接数据库基本代码 4、循环扫描数据表取出数据 打印: jack1 11 jack2

  • 我们希望在Cucumber中使用外部文件(如excel工作表)实现数据驱动测试,而不使用Cucumber提供的DataTable或Examples关键字。 这是我的特征文件 功能:验证登录页方案大纲:使用excel和数据集驱动数据 当我进入登录页面时,我会使用excel行输入用户名和密码。” 在上面的示例中,我们根据文件中提供的行索引从excel读取数据。 很难在功能文件中写入这么多记录,因为数据