• 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..... 
    复制代码

    原文转自:http://www.cnblogs.com/zhangfei/archive/2012/10/10/2718989.html

  • 相关阅读:
    C# 使用HtmlAgilityPack抓取网页信息
    企业微信开发之向员工付款(C#)
    企业微信开发之发放企业红包(C#)
    body-parser的使用
    NodeJs的express服务器报413 payload too large错误
    'nuxt' 不是内部或外部命令,也不是可运行的程序
    Linux node使用npm成功安装命令后,执行时却报找不到命令的问题
    npm查看全局安装了那些包的命令
    JS中==与===的区别
    JS事件流理解
  • 原文地址:https://www.cnblogs.com/linbo3168/p/6612492.html
Copyright © 2020-2023  润新知