在路上

 找回密码
 立即注册
在路上 站点首页 学习 查看内容

java 与testng利用XML做数据源的数据驱动示例详解

2017-3-7 12:51| 发布者: zhangjf| 查看: 1400| 评论: 0

摘要: java 与testng利用XML做数据源的数据驱动示例详解 testng的功能很强大,利用@DataProvider可以做数据驱动,数据源文件可以是EXCEL,XML,YAML,甚至可以是TXT文本。在这以XML为例: 备注:@DataProvider的返回值类型 ...

java 与testng利用XML做数据源的数据驱动示例详解

testng的功能很强大,利用@DataProvider可以做数据驱动,数据源文件可以是EXCEL,XML,YAML,甚至可以是TXT文本。在这以XML为例:

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

TestData.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <data>
  3. <testmethod1>
  4. <input>1</input>
  5. <button>2</button>
  6. </testmethod1>
  7. <testmethod1>
  8. <input>3</input>
  9. <button>4</button>
  10. </testmethod1>
  11. <testmethod2>
  12. <input>3</input>
  13. <button>4</button>
  14. </testmethod2>
  15. <testmethod3>
  16. <input>3</input>
  17. <button>4</button>
  18. </testmethod3>
  19. <testmethod4>
  20. <input>3</input>
  21. <button>4</button>
  22. </testmethod4>
  23. </data>
复制代码

处用DOM4J解析XML,ParserXml.java文件:

  1. package com.test;
  2. import java.io.File;
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.Iterator;
  6. import java.util.List;
  7. import java.util.Map;
  8. import org.dom4j.Document;
  9. import org.dom4j.DocumentException;
  10. import org.dom4j.Element;
  11. import org.dom4j.io.SAXReader;
  12. public class ParserXml {
  13. public List parser3Xml(String fileName) {
  14. File inputXml = new File(fileName);
  15. List list=new ArrayList();
  16. int count = 1;
  17. SAXReader saxReader = new SAXReader();
  18. try {
  19. Document document = saxReader.read(inputXml);
  20. Element employees = document.getRootElement();
  21. for (Iterator i = employees.elementIterator(); i.hasNext();) {
  22. Element employee = (Element) i.next();
  23. Map map = new HashMap();
  24. Map tempMap = new HashMap();
  25. for (Iterator j = employee.elementIterator(); j.hasNext();) {
  26. Element node = (Element) j.next();
  27. tempMap.put(node.getName(), node.getText());
  28. }
  29. map.put(employee.getName(), tempMap);
  30. list.add(map);
  31. }
  32. } catch (DocumentException e) {
  33. System.out.println(e.getMessage());
  34. }
  35. return list;
  36. }
  37. }
复制代码

然后把解析出来的list转换成Object[][]类型的数据,且结合在@DataProvider中。

TestData.java文件:

  1. package com.test;
  2. import java.io.File;
  3. import java.lang.reflect.Method;
  4. import java.util.ArrayList;
  5. import java.util.HashMap;
  6. import java.util.Iterator;
  7. import java.util.List;
  8. import java.util.Map;
  9. import org.testng.annotations.DataProvider;
  10. public class TestData {
  11. private List l;
  12. public TestData() {
  13. this.getXmlData();
  14. }
  15. public void getXmlData(){
  16. ParserXml p = new ParserXml();
  17. l = p.parser3Xml(new File("src/com/test/TestData.xml").getAbsolutePath());
  18. }
  19. @DataProvider
  20. public Object[][] providerMethod(Method method){
  21. List<Map<String, String>> result = new ArrayList<Map<String, String>>();
  22. for (int i = 0; i < l.size(); i++) {
  23. Map m = (Map) l.get(i);
  24. if(m.containsKey(method.getName())){
  25. Map<String, String> dm = (Map<String, String>) m.get(method.getName());
  26. result.add(dm);
  27. }
  28. }
  29. Object[][] files = new Object[result.size()][];
  30. for(int i=0; i<result.size(); i++){
  31. files[i] = new Object[]{result.get(i)};
  32. }
  33. return files;
  34. }
  35. }
复制代码

再通过测试文件来测试一下:

TestDataProvider.java文件:

  1. package com.test;
  2. import java.util.Map;
  3. import org.testng.annotations.*;
  4. public class TestDataProvider extends TestData {
  5. @Test(dataProvider="providerMethod")
  6. public void testmethod1(Map<?, ?> param){
  7. System.out.println("method1 received:"+param.get("input"));
  8. }
  9. @Test(dataProvider="providerMethod")
  10. public void testmethod2(Map<?, ?> param){
  11. System.out.println("method2 received:"+param.get("input"));
  12. }
  13. @Test(dataProvider="providerMethod")
  14. public void testmethod3(Map<?, ?> param){
  15. System.out.println("method3 received:"+param.get("input"));
  16. }
  17. @Test
  18. public void testmethod4(){
  19. System.out.println("method4 received:4");
  20. }
  21. }
复制代码

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

  1. method1 received:1
  2. method1 received:3
  3. method2 received:3
  4. method3 received:3
  5. method4 received:4
  6. PASSED: testmethod1({input=1, button=2})
  7. PASSED: testmethod1({input=3, button=4})
  8. PASSED: testmethod2({input=3, button=4})
  9. PASSED: testmethod3({input=3, button=4})
  10. PASSED: testmethod4
  11. ===============================================
  12. Default test
  13. Tests run: 5, Failures: 0, Skips: 0
  14. ===============================================
复制代码

也就是说通过这种方式,只需要把测试函数先写好,然后在XML文件中定义好数据就行了,就能控制函数是否运行,运行次数且运行的数据。

OK,Let's try.....

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

最新评论

小黑屋|在路上 ( 蜀ICP备15035742号-1 

;

GMT+8, 2025-5-3 12:39

Copyright 2015-2025 djqfx

返回顶部