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读取数据。 很难在功能文件中写入这么多记录,因为数据