51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1563|回复: 0
打印 上一主题 下一主题

java结合testng,利用XML做数据源的数据驱动示例

[复制链接]
  • TA的每日心情
    无聊
    2024-11-5 10:03
  • 签到天数: 77 天

    连续签到: 1 天

    [LV.6]测试旅长

    跳转到指定楼层
    1#
    发表于 2018-6-15 16:04:39 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
    1. testng的功能很强大,利用@DataProvider可以做数据驱动,数据源文件可以是EXCEL,XML,YAML,甚至可以是TXT文本。在这以XML为例:

    2. 备注:@DataProvider的返回值类型只能是Object[][]与Iterator<Object>[]

    3. TestData.xml:

    4. 复制代码
    5. <?xml version="1.0" encoding="UTF-8"?>
    6. <data>
    7.     <testmethod1>
    8.         <input>1</input>
    9.         <button>2</button>
    10.     </testmethod1>
    11.     <testmethod1>
    12.         <input>3</input>
    13.         <button>4</button>
    14.     </testmethod1>
    15.     <testmethod2>
    16.         <input>3</input>
    17.         <button>4</button>
    18.     </testmethod2>
    19.     <testmethod3>
    20.         <input>3</input>
    21.         <button>4</button>
    22.     </testmethod3>
    23.     <testmethod4>
    24.         <input>3</input>
    25.         <button>4</button>
    26.     </testmethod4>
    27. </data>
    28. 复制代码
    29. 处用DOM4J解析XML,ParserXml.java文件:

    30. 复制代码
    31. package com.test;

    32. import java.io.File;
    33. import java.util.ArrayList;
    34. import java.util.HashMap;
    35. import java.util.Iterator;
    36. import java.util.List;
    37. import java.util.Map;

    38. import org.dom4j.Document;
    39. import org.dom4j.DocumentException;
    40. import org.dom4j.Element;
    41. import org.dom4j.io.SAXReader;

    42. public class ParserXml {

    43.     public List parser3Xml(String fileName) {
    44.         File inputXml = new File(fileName);   
    45.         List list=new ArrayList();               
    46.         int count = 1;
    47.         SAXReader saxReader = new SAXReader();
    48.         try {
    49.             Document document = saxReader.read(inputXml);
    50.             Element employees = document.getRootElement();
    51.             for (Iterator i = employees.elementIterator(); i.hasNext();) {
    52.                 Element employee = (Element) i.next();
    53.                 Map map = new HashMap();
    54.                 Map tempMap = new HashMap();
    55.                 for (Iterator j = employee.elementIterator(); j.hasNext();) {
    56.                     Element node = (Element) j.next();                    
    57.                     tempMap.put(node.getName(), node.getText());                    
    58.                 }
    59.                 map.put(employee.getName(), tempMap);
    60.                 list.add(map);
    61.             }
    62.         } catch (DocumentException e) {
    63.             System.out.println(e.getMessage());
    64.         }
    65.         return list;
    66.     }   
    67.      

    68. }
    69. 复制代码
    70. 然后把解析出来的list转换成Object[][]类型的数据,且结合在@DataProvider中。

    71. TestData.java文件:

    72. 复制代码
    73. package com.test;

    74. import java.io.File;
    75. import java.lang.reflect.Method;
    76. import java.util.ArrayList;
    77. import java.util.HashMap;
    78. import java.util.Iterator;
    79. import java.util.List;
    80. import java.util.Map;

    81. import org.testng.annotations.DataProvider;

    82. public class TestData {        
    83.    
    84.     private List l;
    85.    
    86.     public TestData() {   
    87.         this.getXmlData();        
    88.     }
    89.    
    90.     public void getXmlData(){
    91.         ParserXml p = new ParserXml();
    92.         l = p.parser3Xml(new File("src/com/test/TestData.xml").getAbsolutePath());
    93.     }

    94.     @DataProvider
    95.     public Object[][] providerMethod(Method method){        
    96.         List<Map<String, String>> result = new ArrayList<Map<String, String>>();        
    97.         for (int i = 0; i < l.size(); i++) {
    98.             Map m = (Map) l.get(i);   
    99.             if(m.containsKey(method.getName())){                           
    100.                 Map<String, String> dm = (Map<String, String>) m.get(method.getName());
    101.                 result.add(dm);   
    102.             }
    103.         }  
    104.         Object[][] files = new Object[result.size()][];
    105.         for(int i=0; i<result.size(); i++){
    106.             files[i] = new Object[]{result.get(i)};
    107.         }        
    108.         return files;
    109.     }
    110.    

    111. }
    112. 复制代码
    113. 再通过测试文件来测试一下:

    114. TestDataProvider.java文件:

    115. 复制代码
    116. package com.test;

    117. import java.util.Map;

    118. import org.testng.annotations.*;

    119. public class TestDataProvider extends TestData {

    120.     @Test(dataProvider="providerMethod")
    121.     public void testmethod1(Map<?, ?> param){
    122.         System.out.println("method1 received:"+param.get("input"));
    123.     }
    124.      
    125.     @Test(dataProvider="providerMethod")
    126.     public void testmethod2(Map<?, ?> param){
    127.         System.out.println("method2 received:"+param.get("input"));
    128.     }
    129.      
    130.     @Test(dataProvider="providerMethod")
    131.     public void testmethod3(Map<?, ?> param){
    132.         System.out.println("method3 received:"+param.get("input"));
    133.     }
    134.    
    135.     @Test
    136.     public void testmethod4(){
    137.         System.out.println("method4 received:4");
    138.     }

    139. }
    140. 复制代码
    141. 我们再回过头来分析一下XML文件,有两个testmethod1结点,testmethod2,testmethod3,testmethod4结点各一个,在TestDataProvider.java文件中,定义了testmethod1,testmethod2,testmethod3,testmethod4四个测试函数,且testmethod4没有用到dataProvider,所以运行结果最后应该是testmethod1运行两遍,testmethod2,testmethod3,testmethod4各运行一遍,结果如下:

    142. 复制代码
    143. method1 received:1
    144. method1 received:3
    145. method2 received:3
    146. method3 received:3
    147. method4 received:4
    148. PASSED: testmethod1({input=1, button=2})
    149. PASSED: testmethod1({input=3, button=4})
    150. PASSED: testmethod2({input=3, button=4})
    151. PASSED: testmethod3({input=3, button=4})
    152. PASSED: testmethod4
    153. ===============================================
    154.     Default test
    155.     Tests run: 5, Failures: 0, Skips: 0
    156. ===============================================
    157. 也就是说通过这种方式,只需要把测试函数先写好,然后在XML文件中定义好数据就行了,就能控制函数是否运行,运行次数且运行的数据。
    158. OK,Let's try.....
    复制代码


    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-26 00:57 , Processed in 0.061196 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表