无论是UI自动化测试还是接口自动化测试都需要进行数据驱动,一般很常见的一种方式就是用excel来管理数据,那么就涉及到一些代码对EXCEL的操作,之前我们介绍过用CSV来处理EXCEL,但是它的功能还不够强大。比如接口自动化测试框架搭建的时候我们用excel来进行数据驱动,用excel来进行用例的管理和测试结果的统计,那么我们就需要对excel进行读取,写入等编辑操作,如果做的更加全面的话还要对测试结果进行个统计。
先来谈下如何用excel来进行数据驱动吧。以我们公司的接口自动化测试框架为例,我们用excel来进行输入设计及输出对比,input表是请求输入数据,ouput表是期望输出数据,result表是实际输出结果,可以对这些用例进行相应地处理更直观的看到测试结果。
在这里还想谈下接口测试框架的搭建问题,之前也一直在论坛上看一些大神的框架设计,从技术层面上来讲涉及到的技术都是大同小异的,基本上都是用相关语言的一些测试框架加上一些数据解析,断言,数据请求。我认为接口测试框架的搭建,亦或者是UI自动化测试框架的搭建都是从需求出发,从项目本身出发去考虑如何搭建的,并不是从技术角度出发,不能说我做自动化测试做接口测试就要用这些技术搭建框架,要看项目本身的特点,看整体项目开发测试规范需要做到什么程度,再去考虑是否需要搭建框架。因为本身接口测试就由许多工具可以满足测试需要,如果说本身项目不会涉及到一些特殊需求,例如:
1.是否考虑特殊加密
2.是否考虑接口重复执行数据清理等问题(工具的话都是需要人工手动去处理测试数据的)
3.是否考虑测试批量执行,测试报告生成及邮件发送问题
4.是否考虑持续集成等问题
我认为当考虑了这些问题的时候才需要再去考虑搭建框架进行测试,而不是有了接口测试任务就各种技术各种查的去搭框架。自己有这种感想的原因也是在学习各种各样的测试技术,接口啊,性能啊,自动化啊等等之后,发现在实际的项目中是不一定都会用到的,那么我们学习这些技术的意义是什么呢?为了找工作加薪吗,是有这方面原因的。但是我认为还是应该回到测试工程师这个职位本职上来,我们的任务是什么,我越来越从思想上跳出测试者的禁锢,我希望我以后所学习的东西都是以软件质量管理质量控制为主,而不是各种各样的技术去堆砌,到最后发现掌握各种各样的技术却不知道怎么去测试,怎么当一名合格的测试,一名合格的QA。虽然自己会一直加强技术的学习,往测试开发方向发展,但是自己从思想深处还是坚定一下自己的定位,无论是测试,QA,测试开发,所做的所有工作应该是保证系统软件的质量,亦或者能在质量把控的工作上提供相应地技术支持,提供测试效率,辅助开发提高开发效率及质量,我想这才是测试应该做的工作,而不是一味的学习技术往开发靠拢来提高自己的市场竞争力。
好了废话不多说,简单地POI创建,读取,修改写入小Demo记录下:
package com.javaPOI; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.HashMap; import java.util.Map; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; public class POITest { public static void main(String[] args) { // TODO Auto-generated method stub POITest.createExcel(); //POITest.readExcel(); POITest.writeToExcel(); Map<String, String> student = new HashMap<String, String>(); student.put("名字", "小明"); student.put("性别", "男"); student.put("住址", "地球"); student.put("成绩", "良好"); String filePath = "/Users/macbookpro/Desktop/POITest/workbook.xls"; POITest.writeToExcel(filePath, student, "new sheet"); } public static void createExcel() { //创建工作表 Workbook wbook = new HSSFWorkbook(); //创建sheet页 Sheet sh = wbook.createSheet("new sheet"); //row 行 cell方格 Row row1 = sh.createRow(0); //创建cell Cell cell = row1.createCell(0); //设置方格显示 cell.setCellValue("姓名"); row1.createCell(1).setCellValue("性别"); row1.createCell(2).setCellValue("住址"); //创建文件 FileOutputStream fos = null; try { fos = new FileOutputStream("/Users/macbookpro/Desktop/POITest/workbook.xls"); wbook.write(fos); } catch (FileNotFoundException e) { e.printStackTrace(); }catch (IOException e) { e.printStackTrace(); }finally{ try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } public static void readExcel() { InputStream ips = null; try { //获取文件输入流 ips = new FileInputStream("/Users/macbookpro/Desktop/POITest/workbook.xls"); //根据输入流创建workbook对象 Workbook wbook = WorkbookFactory.create(ips); //得到第一个sheet页 Sheet sh1 = wbook.getSheetAt(0); //遍历行 for (Row row : sh1) { for (Cell cell : row) { System.out.print(cell.toString()+" "); } } } catch (Exception e) { e.printStackTrace(); } finally{ try { ips.close(); } catch (IOException e) { e.printStackTrace(); } } } public static void writeToExcel() { OutputStream ops = null; InputStream ips = null; try { ips = new FileInputStream("/Users/macbookpro/Desktop/POITest/workbook.xls"); //根据输出流创建workbook对象 Workbook wbook = WorkbookFactory.create(ips); //获取sheet页 Sheet sh = wbook.getSheetAt(0); for (Row row : sh) { for (Cell cell : row) { String str = cell.toString(); //把姓名改成名字 if (str.equals("姓名")) { cell.setCellValue("名字"); } } //新增一个字段 row.createCell(3).setCellValue("成绩"); } ops = new FileOutputStream("/Users/macbookpro/Desktop/POITest/workbook.xls"); wbook.write(ops); } catch (Exception e) { e.printStackTrace(); } finally{ try{ ops.close(); ips.close(); }catch(Exception e){ e.printStackTrace(); } } } public static void writeToExcel(String filePath,Map<String, String>student,String sheetName) { OutputStream ops = null; InputStream ips = null; try { ips = new FileInputStream(new File(filePath)); Workbook wbook = WorkbookFactory.create(ips); Sheet sh = wbook.getSheet(sheetName); //获得sheet行数 加1 int shRowCount = sh.getLastRowNum()+1; System.out.println(shRowCount); //获得表头列数 int shColumn = sh.getRow(0).getLastCellNum(); System.out.println(shColumn); Row titleRow = sh.getRow(0); //新增一行 Row newRow = sh.createRow(shRowCount); for (int i = 0; i < shColumn; i++) { //获取列名 String columnStr = titleRow.getCell(i).toString(); System.out.println(columnStr); newRow.createCell(i).setCellValue(student.get(columnStr)); } ops = new FileOutputStream(new File(filePath)); wbook.write(ops); } catch (Exception e) { e.printStackTrace(); } finally{ try{ ops.close(); ips.close(); }catch(Exception e){ e.printStackTrace(); } } } }
查看结果:
搭建框架的话,就是需要对相关的excel操作进行封装,这个过两天以我们的自动化测试框架为例分享下如何搭建。