java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言, 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台 (即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se)) 的总称
这篇文章主要介绍了 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 文件中定义好数据就行了, 就能控制函数是否运行, 运行次数且运行的数据
来源: http://www.phperz.com/article/18/0220/358881.html