Testng之使用@DataProvider注解做数据驱动【转】

时间:2020-12-21 04:40:24

原文:http://www.jianshu.com/p/8e333a0ec42a

前两天学了一下@DataProvider,今天有时间总结一下。
testng很强大,提供了很多注解,其中利用@DataProvider可以做数据驱动,数据源文件可以是EXCEL,XML,甚至可以是TXT文本。下面以读取XML为例。

通过@DataProvider读取XML文件中数据,然后测试方法只要标示获取数据来源的DataProvider,那么对应的DataProvider会把读取的数据传给该test方法,我简单的画了一下整个流程(很丑,莫怪),下面通过代码具体看一下@DataProvider的使用。

Testng之使用@DataProvider注解做数据驱动【转】
Paste_Image.png

工具:
eclipse、TestNg、Selenium
场景:
登陆百度首页,点击登录,输入用户名和密码。
其中账号信息通过DataProvider将XML中的登陆账号和密码传给test方法
前提:
Selenium代码可以打开百度首页,访问登陆页面

1、构建XML数据文件

LoginTest.xml
xml
<?xml version="1.0" encoding="UTF-8"?>
<data>
<loginRight>
<username>尹豆儿</username>
<password>616189</password>
</loginRight>
</data>

注:XML文件名最好跟测试方法名称一致,方便了解其左右

2、读取xml文件的方法

XmlUtil.java

package Tool;

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 XmlUtil {

    public static List getXmlComent(String fname){
        //获取xml文件完全路径
        String path=CommonFunction.getAbsolutionPath(fname);
        System.out.println("xml·path"+path);

        List contList=new ArrayList();
        //dom4j中读取xml文件的方法
        SAXReader saxR=new SAXReader();
        try {
            Document doc=saxR.read(path);
            //存放顶结点
            Element eleroot=doc.getRootElement();
            //parMap,存放顶结点下一级结点
            Map parMap=new HashMap();
            Map sonMap=new HashMap();
            for(Iterator i=eleroot.elementIterator();i.hasNext();){
                //parMap中存放的结点的子结点

                Element elepar=(Element)i.next();
                for(Iterator j=elepar.elementIterator();j.hasNext();){
                    Element eleSon=(Element)j.next();
                    System.out.println("+++++"+eleSon.getName()+"    "+ eleSon.getText());
                    sonMap.put(eleSon.getName(), eleSon.getText());
                }

                parMap.put(elepar.getName(),sonMap);
                System.out.println("*****"+elepar.getName());
                contList.add(parMap);
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }

        return contList;
    }
}
3、编写DataProvider

LoginDataProvider.java

package dataProvider;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.testng.Assert;
import org.testng.annotations.DataProvider;

import testData.FilePath;
import Tool.XmlUtil;

public class LoginDataProvider {
    private static Object[][] obj;
    private static List parList=new ArrayList();
    private static List sonList=new ArrayList();

    //@DataProvider(name="loginProvider")
    @DataProvider()
    public static Object[][] loginProvider(Method method) {
        System.out.println("@DataProvider(name='loginProvider')");
        System.out.println("dataProvider"+method.getName());
        //读取xml内容
        parList = XmlUtil.getXmlComent(FilePath.LoginTestData);

        for (int i=0;i< parList.size();i++) {
            Map map = (Map)parList.get(i);
            if (map.containsKey(method.getName())) {
                Map<String,String> submap = (Map<String,String>) map.get(method.getName());
                sonList.add(submap);

            }
        }

        if (sonList.size() > 0) {

            obj = new Object[sonList.size()][];
            for (int i = 0; i < sonList.size(); i++) {
                obj[i] = new Object[] { sonList.get(i) };
            }
            return obj;
        }else{
            Assert.assertTrue(sonList.size()!=0,parList+"为空,找不到属性值:"+method.getName() );
            return null;
        }

    }

}
4、test方法中标明使用的DataProvider

LoginTest.java

package TestCase;
import java.awt.Frame;
import java.util.Date;
import java.util.Map;

import org.openqa.selenium.NoSuchFrameException;
import org.testng.Reporter;
import org.testng.annotations.Test;

import dataProvider.LoginDataProvider;
public class LoginTest extends TestBase{

    @Test(dataProvider="loginProvider",dataProviderClass=LoginDataProvider.class)
    public  void loginRight(Map<?, ?> param) throws InterruptedException{

        baiduPage.clickLogin();
        loginPage.login_Right((String)param.get("username"), (String)param.get("password"));
    }

}
5、执行test用例查看是否取到数据

testng.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Tests" verbose="5">
    <test name="test">
        <classes>
            <class name="TestCase.LoginTest"></class>
        </classes>
    </test>
</suite>

总结一:
使用之后,个人觉得最巧妙的地方是xml方法中将参数值的父节点命名为test方法名,然后在@DataProvider中通过test的method方法名来同xml数据对应,而在test方法中使用Map<?,?> param 获取;相同结构的xml文件则可以使用同一个DataProvider,节省了不少代码。

Testng之使用@DataProvider注解做数据驱动【转】
xml文件
Testng之使用@DataProvider注解做数据驱动【转】
test方法
Testng之使用@DataProvider注解做数据驱动【转】
@DataProvider

总结二:
在test方法中指明DataProvider,如果DataProvider有指明name值,那么在test中使用name,如果没有名字,使用对应的方面名

Testng之使用@DataProvider注解做数据驱动【转】
 

另外如果DataProvider和Test方法不再同一类中,如下指明

Testng之使用@DataProvider注解做数据驱动【转】
文/流浪骑士(简书作者)
原文链接:http://www.jianshu.com/p/8e333a0ec42a
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

Testng之使用@DataProvider注解做数据驱动【转】的更多相关文章

  1. java结合testng,利用mysql数据库做数据源的数据驱动实例

    上一篇我们介绍用如何用yaml结合testng做数据驱动,就又想来个数据库的参数化 备注:@DataProvider的返回值类型只能是Object[][]与Iterator<Object> ...

  2. Selenium&plus;java - 使用csv文件做数据驱动

    前言 早期我们使用TestNG 来做数据驱动进行测试,测试数据是写在测试用例脚本中.这会使得测试脚本的维护工作量很大.因此我们可以将测试的数据和脚本分开. 而我们经常使用会使用csv文件来做为导出数据 ...

  3. TestNG中的DataProvider返回Iterator&lt&semi;Object&lbrack;&rsqb;&gt&semi;的妙用

    TestNG中使用DataProvider有个好处,就是: 1. 在执行用例的时候dataProvider迭代中的每组数据都是作为一个用例执行 2. 在测试数据有规律的情况下,免去了添加testXML ...

  4. testNG官方文档翻译-2 注解

    这里是一份TestNG中的可用注解及其属性的概述. 一.用于一个TestNG类的信息配置的注解: @BeforeSuite:被BeforeSuite注解的方法将在其所在suite中的所有test运行之 ...

  5. selenium2中的TestNg注解和数据驱动的简介及使用

    TestNg常用注解介绍,先来张图: 先看一下,以上各个注释的运行次序: @Test 表示的意义:    1.表示示该方法是一个测试方法,在运行时,会自动的运行有@Test注脚的方法. 示例: @Be ...

  6. java分享第十八天( JAVA利用enum结合testng做数据驱动示例)

    数据驱动是做自动化测试中很重要的一部分,数据源的方案也是百花八门了,比如利用外部文件,直接在@DataProvider中写死等等,我们今天介绍一下利用enum来做数据源,先来看一下enum的写法: p ...

  7. JAVA利用enum结合testng做数据驱动示例

    数据驱动是做自动化测试中很重要的一部分,数据源的方案也是百花八门了,比如利用外部文件,直接在@DataProvider中写死等等,我们今天介绍一下利用enum来做数据源,先来看一下enum的写法: p ...

  8. Excel作为数据源TesTNG做数据驱动完整代码

    说明:EXCEL 支持xls 和xlsx 俩种格式 : 已经过测试 ! package main.java; import org.apache.poi.ss.usermodel.*; import ...

  9. TestNG &commat;Factory与 &commat;DataProvider 结合使用进行参数化测试

    简介 TestNG是一个设计用来简化广泛的测试需求的测试框架,从单元测试到集成测试,这个是TestNG设计的出发点,不仅仅是单元测试,而且可以用于集成测试.设计目标的不同,对比junit的只适合用于单 ...

随机推荐

  1. 从客户端&lpar;&amp&semi;&rpar;中检测到有潜在危险的 Request&period;Path 值

    首先,这个问题出现在 ASP.NET MVC 应用程序中,所以下面的解决方式都是在这个环境下. 关于这个问题,网上又很多的答案,当时也搜了一些: A potentially dangerous Req ...

  2. &lbrack;bzoj4552&rsqb;&lbrack;Tjoi2016&rsqb;&lbrack;Heoi2016&rsqb;排序

    Description 给出一个$1$到$n$的全排列,现在对这个全排列序列进行$m$次局部排序,排序分为$2$种: $1.(0,l,r)$表示将区间$[l,r]$的数字升序排序; $2.(1,l,r ...

  3. c&num; 文件另存为代码

    利用.NET中的File.Copy方法 命名空间:System.IO 重载列表:Copy(string sourceFilePath,string targetFilePath) sourceFile ...

  4. lib静态链接库,dll动态链接库,h文件

    最近在弄摄像头,发现我在调用摄像头自带的函数的时候,库没连接上,于是经过高人指点,学习了一下lib静态链接库,dll动态链接库来补充一下自己的基础知识. 一.首先我们来介绍一下lib静态链接库. li ...

  5. Python中的日志管理Logging模块

    1.基本的用法 import logging logging.debug('This is debug message') logging.info('This is info message') l ...

  6. Azure的两种关系型数据库服务:SQL Azure与SQL Server VM的不同

    Azure的两种关系型数据库服务:SQL Azure与SQL Server VM的不同 <Windows Azure Platform 系列文章目录> 如果熟悉Windows Azure平 ...

  7. jquery选择器之内容过滤选择器

    先写出DOM元素的HTML结构: <style type="text/css"> /*高亮显示*/ .highlight{ background-color: gray ...

  8. windows下常用软件

    1  pdf转word solid converter pdf  特点:功能强大,能转换页面页眉等,还有表格.

  9. vue-cli&commat;2的原理解析

    作为一个菜鸟,我有一颗好奇的心,每当vue init 的时候,看到那流畅的进度和神奇的结果,心里都充满一窥其本质的期望…… 以下就是我不断的console,大致理出来的一个流程心得,纪录在此,以作备忘 ...

  10. P1461 海明码 Hamming Codes

    题目描述 给出 N,B 和 D,要求找出 N 个由0或1组成的编码(1 <= N <= 64),每个编码有 B 位(1 <= B <= 8),使得两两编码之间至少有 D 个单位 ...