您的位置:首页 > 移动开发

Appium自动化-----数据驱动读取外部Excel文件

2017-11-16 17:50 615 查看
=====要进行操作的Excel======



=====对以上Excel的操作==============
//Excel的文件操作
public class ExcelUtilTest {

private XSSFWorkbook excelWBook;//Excel工作薄
private XSSFSheet excelWSheet;//工作表
private XSSFRow row;//行
private XSSFCell cell;//列
private String filePath;//Excel工作薄路径

/**构造方法*/
//设定要操作的Excel的文件路径和Excel文件中的sheet名称
//在读写Excel的时候,均需要调用此方法,设定要操作的Excel文件路径和要操作的sheet名称
public ExcelUtilTest(String path,String sheetName) throws Exception{
FileInputStream excelFile;
this.filePath=path;

try {
//实例化Excel文件的FileInputStream对象
excelFile = new FileInputStream(path);
//实例化Excel文件的XSSFWorkbook对象
excelWBook = new XSSFWorkbook();
//实例化Excel文件的XSSFSheet对象,指定Excel文件中的sheet名称;
excelWSheet = excelWBook.getSheet(sheetName);

} catch (Exception e) {
throw (e);
}
}

/**读取Excel文件指定单元格的函数,此函数只支持后缀为xlsx的Excel文件*/
public String getCellData(int rowNum,int cellNum)throws Exception{
try {
//通过函数参数指定单元格的行号和列表,获取指定的单元格对象
cell = excelWSheet.getRow(rowNum).getCell(cellNum);
//如果单元格的内容为字符串类型,则使用getStringCellValue()获取单元格的内容
//如果单元格的内容为数字类型,则使用getNumericCellValue()获取单元格的内容
String cellData="";
/**获取单元格类型*/
if(cell.getCellType() == XSSFCell.CELL_TYPE_STRING){
cellData = cell.getStringCellValue();
}else if(cell.getCellType() == XSSFCell.CELL_TYPE_NUMERIC){
DecimalFormat df = new DecimalFormat("0");//保留小数的方法,0为不保留小数
cellData = df.format(cell.getNumericCellValue());//format()格式化
}
return cellData;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "";
}

}

/**在Excel文件的执行单元格中写输入数据,此函数只支持后缀为xlsx的文件写入
* @param result 结果
* @param rowNum 行数
* @param cellNum 列数
* */
public void setCellData(int rowNum,int cellNum,String result) throws Exception{

try{
//获取Excel文件中的行对象
row=excelWSheet.getRow(rowNum);
//如果单元格为空,则返回Null
cell = row.getCell(cellNum,Row.RETURN_BLANK_AS_NULL);

if(cell == null){
//当单元格对象是null的时候,则创建单元格,因为单元格为空,无法调用单元格对象的setCellValue方法设定单元格的值
cell=row.createCell(cellNum);
//创建单元格后可以调用单元格对象的setCellValue方法设定单元格的值
cell.setCellValue(result);
}else{
//单元格中如果有内容,则可以直接调用单元格对象的setCellValue方法设定单元格的值
cell.setCellValue(result);
System.out.println("单元格值设定完成");
}

//实例化写入Excel文件的文件输出流对象
FileOutputStream fileOut = new FileOutputStream(filePath);
//将内容写入Excel文件中
excelWBook.write(fileOut);
//调用flush方法强制刷新写入文件
fileOut.flush();
//关闭文件输出流对象
fileOut.close();

}catch(Exception e){
e.printStackTrace();
throw(e);
}

}

/**从Excel文件获取测试数据的静态方法
* @throws IOException
* */
public static Object[][] getTestData(String excelFilePath,String sheetName) throws IOException{
//根据参数传入的数据文件路径和文件名称,组合出Excel数据文件的绝对路径
File file=new File(excelFilePath);

//创建FileInputStream对象用于读取Excel文件
FileInputStream inputStream = new FileInputStream(file);

//声明Workbook对象
Workbook workBook = null;

//获取文件类型的后缀名;
String fileExtensionName = excelFilePath.substring(excelFilePath.indexOf("."));

//判断如果是xlsx,则使用 XSSFWorkbook 对象进行实例化
//如果是xls,则使用 SSFWorkbook 对象进行实例化
if(fileExtensionName.equals(".xlsx")){

workBook = new XSSFWorkbook(inputStream);

}else if(fileExtensionName.equals(".xls")){
workBook = new HSSFWorkbook(inputStream);
}

//通过sheetName参数,生成sheet对象
Sheet sheet = workBook.getSheet(sheetName);

//获取Excel数据文件中sheet1中数据的行数,getLastRowNum方法获取数据的最后行号
//getFirstRowNum方法获取数据的第一行行号,相减之后算出数据的行数
int rowCount = sheet.getLastRowNum()-sheet.getFirstRowNum();
System.out.println(sheet+"总行数是"+rowCount);

//创建名为records的list对象来存储从Excel数据文件中获取的数据
List<Object[]> records = new ArrayList<Object[]>();

//使用2个for循环遍历Excel数据文件中的所有数据(除了第一行,第一行是数据列名称),所以从1开始
for(int i =1;i<=rowCount;i++){
//使用getRow()获取行对象
Row row=sheet.getRow(i);

/*声明一个数组,来存储Excel数据文件每行中的测试用例和数据,数组的大小用getLastCellNum-1来进行动态声明,实现测试数据个数和数组大小相一致
* 因为Excel数据文件中的测试数据航的最后一个单元格为测试执行结果,倒数第二个单元格为此测试数据行
* 是否运行的状态。所最后两列的单元格数据并不需要传入到测试方法中,所以使用getLastCellNum-2的方法去掉每行中的最后两个单元格数据
* 计算出需要存储的测试数据个数,并作为测试数据数组的初始化大小
*/
String fields[]=new String[row.getLastCellNum()-2];//创建一个String类型的数组,并指定大小

/*if用来判断数据行是否要参加测试的执行,Excel文件的倒数第二行为数据行的状态位,标记为*
* “y”表示此数据要被测试脚本执行,标记为非“y”的数据行均被认为不会参与测试脚本的执行,会被跳过
* */
String yesOrNot=row.getCell(row.getLastCellNum()-2).getStringCellValue();
// System.out.println(row.getCell(row.getLastCellNum()-2).getCellType()==XSSFCell.CELL_TYPE_NUMERIC);

if(row.getCell(row.getLastCellNum()-2).getStringCellValue().equals("y")){
for(int j=0;j<row.getLastCellNum()-2;j++){
//判断Excel的单元格字段是数字还是字符,字符串格式调用getStringCellValue()获取
//数字格式调用getNumericCellValue()获取
//System.out.println(row.getCell(j).getCellType()== XSSFCell.CELL_TYPE_NUMERIC);
if(row.getCell(j).getCellType() == XSSFCell.CELL_TYPE_STRING){
fields[j]=row.getCell(j).getStringCellValue();
}else if(row.getCell(j).getCellType() == XSSFCell.CELL_TYPE_NUMERIC){
DecimalFormat df= new DecimalFormat("0");
fields[j]=df.format(row.getCell(j).getNumericCellValue());
}else{
System.out.println("格式错误");
}
//System.out.println(fields[j]);
}

//fields的数据对象存储到records的list中
records.add(fields);
}

}

//定义函数返回值,即object[][]
//将存储测试数据的list转换为一个Object的二维数据
Object[][] results=new Object[records.size()][];

//设置二维数据每行的值,每行是个object对象
for(int i=0;i<records.size();i++){
results[i]=records.get(i);
}
//关闭Excel文件
inputStream.close();
return results;
}

//遍历二维数组
public void printArray(Object[][] arr){
for (int x = 0; x < arr.length; x++) {
for (int y = 0; y < arr[x].length; y++) {
System.out.print(arr[x][y] + " ");
}
System.out.println("");
}
}
}

======Excel的文件操作类的--测试类=====
public class TestExcelUticl {

public static void main(String[] args) throws Exception {
ExcelUtilTest eut = new ExcelUtilTest("configs/测试用例.xlsx", "登录数据");//excel名字,sheet名字
// eut.getCellData(3, 3);
Object[][] arr=eut.getTestData("configs/测试用例.xlsx", "登录数据");
eut.printArray(arr);
}

}

=====应用到自动化数据驱动里,实现自动化数据驱动读取外部Excel文件=========

/**查找元素*/
@Test(dataProvider="loginTestData")
public static void testCase(String loginTestData1,String loginTestData2){
Thread.sleep(5000);//等待
//进入
driver.findElementById("元素定位id").click();
//手机号
AndroidElement modile= driver.findElementById("元素定位id");
modile.clear();
modile.sendKeys(loginTestData1);
//验证码
AndroidElement pws=driver.findElementById("元素定位id");
pws.clear();
pws.sendKeys(loginTestData2);
//点击登录
driver.findElementById("元素定位id").click();

}

/**登录数据驱动
* */
@DataProvider(name="loginTestData")
public static Object[][] data() throws IOException
{
Object[][] arr=ExcelUtilTest.getTestData("configs/测试用例.xlsx", "登录数据");
return arr;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  学习记录