码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2017-11-16 18:45:04      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:学习记录

=====要进行操作的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;
    } 


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

标签:学习记录

原文地址:http://13478818.blog.51cto.com/13468818/1982494

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!