TestNG使用DataProvider+Excel实现DDT

发表于:2018-10-25 11:26

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

 作者:helentester    来源:51testing采编

  DDT,即数据驱动测试 Data Driver Test,我曾经记录了一篇关于python的DDT框架(Excel+DDT数据驱动实例),那么java中的DDT是怎么样的呢?在java中,可以用testng的DataProvider和Excel实现。
  首先建一个文档TestData.xlsx,里面内容如下:
   
  然后写一个读excel的公共类,代码如下:
  /**
  * @author Helen
  * @date 2018年6月5日
  */
  package common;
  import java.io.File;
  import java.io.FileInputStream;
  import java.io.IOException;
  import org.apache.poi.ss.usermodel.Cell;
  import org.apache.poi.xssf.usermodel.XSSFSheet;
  import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  /**
  * 描述:excel事件处理
  */
  public class MyExcel {
  /*读取excel文件中的数据,并生成数组*/
  @SuppressWarnings("deprecation")
  public Object[][] readExcel(String filePath,String sheetName) throws IOException {
  BaseData bdata = new BaseData();
  File file = new File(bdata.getFilePath(filePath));//获取文件
  FileInputStream fileInputStream = new FileInputStream(file);//读数据
  XSSFWorkbook workbook = new XSSFWorkbook(fileInputStream);
  XSSFSheet sheet = workbook.getSheet(sheetName);//读取指定标签页的数据
  int rowNum = sheet.getPhysicalNumberOfRows();//获取行数(获取的是物理行数,也就是不包括那些空行(隔行)的情况)
  int columNum = sheet.getRow(0).getPhysicalNumberOfCells();//获取列数
  Object[][]    data = new Object[rowNum-1][columNum];//因为第一行作为字段名,不需要记录,所以只有[rowNum-1]行
  for(int i=1;i<rowNum;i++) {//从第二行开始取值
  for (int h = 0; h < columNum; h++) {
  sheet.getRow(i).getCell(h).setCellType(Cell.CELL_TYPE_STRING);//先把类型设置为string
  data[i-1][h] = sheet.getRow(i).getCell(h).getStringCellValue();//填充数组
  }
  }
  workbook.close();
  return data;
  }
  }
  excel的支持还需要在pom.xml加入如下内容
  <!--加入对excel的读写支持-->
  <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
  <dependency>
  <groupId>org.apache.poi</groupId>
  <artifactId>poi-ooxml</artifactId>
  <version>3.17</version>
  </dependency>
  其次,写一个数据源公共类(数据源也可以直接写在测试类中,如果写在测试类中就不用标名数据源所在class),代码如下:
  /**
  * @author Helen
  * @date 2018年6月11日
  */
  package jinengxia_apiTest;
  import common.MyExcel;
  import java.io.IOException;
  import org.testng.annotations.DataProvider;
  /**
  * 描述:接口测试的数据源
  */
  public class myApiTestData {
  MyExcel myExcel = new MyExcel();
  @DataProvider(name = "loginData")
  public Object[][] getLoginData() throws IOException {
  return myExcel.readExcel("src/test/java/testFile/TestData.xlsx","login");
  }
  }
  最后调用数据源,代码如下:
  /**
  * @author Helen
  * @date 2018年6月5日
  */
  package jinengxia_apiTest;
  import static org.testng.Assert.assertEquals;
  import java.io.IOException;
  import java.net.URI;
  import java.net.URISyntaxException;
  import org.apache.http.HttpResponse;
  import org.apache.http.client.ClientProtocolException;
  import org.apache.http.client.methods.HttpUriRequest;
  import org.apache.http.client.methods.RequestBuilder;
  import org.apache.http.client.protocol.HttpClientContext;
  import org.apache.http.impl.client.CloseableHttpClient;
  import org.apache.http.impl.client.HttpClients;
  import org.apache.http.util.EntityUtils;
  import org.testng.annotations.DataProvider;
  import org.testng.annotations.Test;
  import common.MyExcel;
  import net.sf.json.JSONObject;
  /**
  * 描述:用户授权相关接口
  */
  public class UserAuthorization {
  CloseableHttpClient httpCilent = HttpClients.createDefault();
  HttpResponse httpResponse;
  MyExcel myExcel = new MyExcel();
  @Test(description = "用户登录",dataProvider="loginData",dataProviderClass=myApiTestData.class)
  public void login(String username,String password) throws URISyntaxException, ClientProtocolException, IOException {
  HttpUriRequest httpUriRequest = RequestBuilder.post().setUri(new URI("http://api.**.***.com/**"))
  .addParameter("username", username).addParameter("password", password).build();
  HttpClientContext localContext = HttpClientContext.create();// 创建本地HTTP上下文,用于获取请求头cookies等内容
  httpResponse = httpCilent.execute(httpUriRequest, localContext);
  String strResult = EntityUtils.toString(httpResponse.getEntity());// 获得返回的结果
  JSONObject jsonObject = JSONObject.fromObject(strResult);
  assertEquals(jsonObject.get("message"), "登录成功");
  }
  }
  执行测试,结果如下:
   
   上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。

   
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

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

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

沪ICP备05003035号

沪公网安备 31010102002173号