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

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

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

Testng之使用@DataProvider注解做数据驱动_第1张图片
Paste_Image.png

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

1、构建XML数据文件

LoginTest.xml



    
        尹豆儿
        616189
    

注: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 submap = (Map) 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方法中将参数值的父节点命名为test方法名,然后在@DataProvider中通过test的method方法名来同xml数据对应,而在test方法中使用Map param 获取;相同结构的xml文件则可以使用同一个DataProvider,节省了不少代码。

Testng之使用@DataProvider注解做数据驱动_第2张图片
xml文件
Testng之使用@DataProvider注解做数据驱动_第3张图片
test方法
Testng之使用@DataProvider注解做数据驱动_第4张图片
@DataProvider

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

Testng之使用@DataProvider注解做数据驱动_第5张图片

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

Testng之使用@DataProvider注解做数据驱动_第6张图片

你可能感兴趣的:(Testng之使用@DataProvider注解做数据驱动)