zoukankan      html  css  js  c++  java
  • 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.....
  • 相关阅读:
    Server Tomcat v8.0 Server at localhost was unable to start within 45 seconds. If the server requires more time, try increasing the timeout in the server editor.
    用户画像——“打标签”
    python replace函数替换无效问题
    python向mysql插入数据一直报TypeError: must be real number,not str
    《亿级用户下的新浪微博平台架构》读后感
    【2-10】标准 2 维表问题
    【2-8】集合划分问题(给定要分成几个集合)
    【2-7】集合划分问题
    【2-6】排列的字典序问题
    【2-5】有重复元素的排列问题
  • 原文地址:https://www.cnblogs.com/zhangfei/p/2718989.html
Copyright © 2011-2022 走看看