在FirstTest.java 文件中,我们可看到请求URL、请求参数,这些都是属于测试数据。这里我们使用testng中自带的@DataProvider注解来做数据驱动,数据源文件可以是EXCEL,XML,甚至可以是TXT文本。这里我们使用EXCEL数据源。
每个测试运行前,会先通过@DataProvider的方法来读取EXCEL中数据,该注解的方法会返回一个Object[] []。然后带@Test的测试方法,如果希望从这个 DataProvider 的接收数据,则需要标识获取数据源的dataProvider的名称,也就是这个注解的名字。那么对应的DataProvider会把读取的数据传给该test方法
借用该文档中的一个图来更清楚的说明这个流程
在目录main下新建一个目录TestData,并在该目录下新建一个excel表格,直接命名为LoginTest。然后打开该文档,修改sheet页名称为login.之后把上面http请求URL、请求参数都放到excel表格中。
这里必须把表格第一行用来命名所有参数的名称。测试数据是从第二行开始的。
如下图所示:
这里我们直接在test->java下创建一个包,命名为utl
之后在utl中创建一个类ExcelReader.java
里面的内容如下所示:
package utl;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import java.io.File;
import java.io.FileInputStream;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
public class ExcelReader {
/**
* 读取excel文件,excel中不含合并单元格
* @param path
* @param sheetName
* excel表格要注意每行的最后一格不能为空
* 如果要为空,则需要手动随便填写字符,然后再按del键删除才可以
* 目前没找到这个解决办法,后续会继续查找解决办法
* @return
*/
public static String[][] getExpectationData(String path, String sheetName) {
try {
File file = new File(path);
FileInputStream fis = new FileInputStream(file);
POIFSFileSystem POIStream = new POIFSFileSystem(fis);
HSSFWorkbook workBook = new HSSFWorkbook(POIStream);
//得到工作表
HSSFSheet sheet1 = workBook.getSheet(sheetName);
//得到总行数
int rowNum = sheet1.getLastRowNum();
List results = new ArrayList();
for (int i=1;i<=rowNum;i++){
//当前行
HSSFRow row = sheet1.getRow(i);
int colNum = row.getLastCellNum();
String[] data = new String[colNum];
//当前行所有列
for (int j = 0; j < colNum; j++) {
try {
data[j] = getCellValue(row.getCell(j));
}catch (NullPointerException e){ //如果单元格为空的时候,则用这个来处理
data[j] = "";
}
}
//把data[]数组的数据存在list<[]>中
results.add(data);
}
fis.close();
String[][] returnArray = new String[results.size()][rowNum];
for (int i = 0; i < returnArray.length; i++) {
returnArray[i] = (String[]) results.get(i);
}
return returnArray;
}catch (Exception e){
return null;
}
}
/**
* 对Excel的各个单元格的格式进行判断并转换
*/
public static String getCellValue(HSSFCell cell) {
String cellValue = "";
DecimalFormat df = new DecimalFormat("#");
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_STRING:
cellValue =cell.getRichStringCellValue().getString().trim();
break;
case HSSFCell.CELL_TYPE_NUMERIC:
cellValue =df.format(cell.getNumericCellValue()).toString();
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
cellValue = String.valueOf(cell.getBooleanCellValue()).trim();
break;
case HSSFCell.CELL_TYPE_FORMULA:
cellValue =cell.getCellFormula();
break;
default:
cellValue = "";
}
return cellValue;
}
}
修改类FirstTest.java,在该类中添加一个方法,如下面内容:
@DataProvider(name = "LoginData")
public Object[][] login() {
// 测试数据准备
String file = "." + File.separator + "TestData" + File.separator + "LoginTest.xls";
Object[][] records ;
records = ExcelReader.getExpectationData(file, "login");
return records ;
}
@Test(dataProvider = "LoginData")
public void loginJDTest(String caseDescription,String loginURL, String uuid,String eid,String fp,String _t, String loginType,String loginname,String nloginpwd, String chkRememberMe, String authcode,String pubKey,String sa_token,String seqSid) {
System.out.println("=====" + caseDescription + "=====");
//创建一个httppost请求
httppost = new HttpPost(loginURL);
//创建Post请求参数
List formparams1 = new ArrayList();
formparams1.add(new BasicNameValuePair("uuid",uuid));
formparams1.add(new BasicNameValuePair("eid",eid));
formparams1.add(new BasicNameValuePair("fp",fp));
formparams1.add(new BasicNameValuePair("_t",_t));
formparams1.add(new BasicNameValuePair("loginType",loginType));
formparams1.add(new BasicNameValuePair("loginname",loginname));
formparams1.add(new BasicNameValuePair("nloginpwd",nloginpwd));
formparams1.add(new BasicNameValuePair("chkRememberMe",chkRememberMe));
formparams1.add(new BasicNameValuePair("authcode",authcode));
formparams1.add(new BasicNameValuePair("pubKey",pubKey));
formparams1.add(new BasicNameValuePair("sa_token",sa_token));
formparams1.add(new BasicNameValuePair("seqSid",seqSid));
try {
httppost.setEntity(new UrlEncodedFormEntity(formparams1,"UTF-8"));
response = httpClient.execute(httppost);
entity = response.getEntity();
// 在这里可以用Jsoup之类的工具对返回结果进行分析,以判断创建是否成功
postResult = EntityUtils.toString(entity, "UTF-8");
System.out.println("查看登录接口请求返回的结果:" + postResult);
} catch (Exception e) {
e.printStackTrace();
}
httppost.releaseConnection();
}
上面可看出,loginJDTest方法带了若干个参数,这里定义的参数要注意:
参数的个数必须和之前创建excel表格中的一样,如excel表格里面有14列参数,则这里也必须对应14个参数。而且定义参数的顺序也必须和excel表格里面参数的顺序保持一样。
再次运行程序,运行结束后查看日志,一切正常,如下图所示