• 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

  • 相关阅读:
    解决Windows 2000无法访问Windows XP共享目录的问题
    手动清除后门程序Iexplores.exe
    超级天使投资网访谈
    中國web2.0現狀與趨勢調查報告
    google AdSense的佣金政策 (GOOGLE 研究 → Google 服务 → Adsense )
    分类信息和搜索引擎
    web 2.0是生产关系:说徐博客赚钱
    赛门铁克联手八笛众和推在线安全服务 狼人:
    2009年六大网络安全威胁:SQL注入攻击位列榜首 狼人:
    网民关注iPhone、Google、微软和安全 狼人:
  • 原文地址:https://www.cnblogs.com/linbo3168/p/6612492.html
Copyright © 2020-2023  润新知