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

发表于:2016-4-22 10:45

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:流浪骑士    来源:51Testing软件测试网采编

  前两天学了一下@DataProvider,今天有时间总结一下。
  testng很强大,提供了很多注解,其中利用@DataProvider可以做数据驱动,数据源文件可以是EXCEL,XML,甚至可以是TXT文本。下面以读取XML为例。
  通过@DataProvider读取XML文件中数据,然后测试方法只要标示获取数据来源的DataProvider,那么对应的DataProvider会把读取的数据传给该test方法,我简单的画了一下整个流程(很丑,莫怪),下面通过代码具体看一下@DataProvider的使用。
  
  工具:
  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>
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号