TestNG+Excel+(HTTP+JSON) 简单接口测试
Posted linbobo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TestNG+Excel+(HTTP+JSON) 简单接口测试相关的知识,希望对你有一定的参考价值。
说明:
1.使用Exce作为数据存放地;
2.使用TestNG的Datarprovide 做数据供应;
3.不足的地方没有指定明确的result_code , error_code , ERROR_MSG ,如果知道明确规定error_code就可以直接用error_code来作为测试结果;
4.代码有许多需要改动的地方本次是第一版;
5.可以将整个小项目打成jar包执行,将excle的文件放入C盘根目录即可(毕竟每个电脑都有C盘,这样就不受机器的限制了)
6.关于本次用到的jar包有
一,读取EXCLE的相关代码
1 package main.java; 2 3 import org.apache.poi.ss.usermodel.*; 4 5 import java.io.File; 6 import java.io.FileInputStream; 7 import java.io.IOException; 8 import java.util.ArrayList; 9 import java.util.HashMap; 10 import java.util.List; 11 import java.util.Map; 12 13 public class ExcelReader { 14 private String filePath; 15 private String sheetName; 16 private Workbook workBook; 17 private Sheet sheet; 18 private List<String> columnHeaderList; 19 private List<List<String>> listData; 20 private List<Map<String, String>> mapData; 21 private boolean flag; 22 public Object[][] results; 23 24 public ExcelReader(String filePath, String sheetName) { 25 this.filePath = filePath; 26 this.sheetName = sheetName; 27 this.flag = false; 28 this.load(); 29 } 30 31 private void load() { 32 FileInputStream inStream = null; 33 try { 34 inStream = new FileInputStream(new File(filePath)); 35 workBook = WorkbookFactory.create(inStream); 36 sheet = workBook.getSheet(sheetName); 37 } catch (Exception e) { 38 e.printStackTrace(); 39 } finally { 40 try { 41 if (inStream != null) { 42 inStream.close(); 43 } 44 } catch (IOException e) { 45 e.printStackTrace(); 46 } 47 } 48 } 49 50 private String getCellValue(Cell cell) { 51 String cellValue = ""; 52 DataFormatter formatter = new DataFormatter(); 53 if (cell != null) { 54 switch (cell.getCellType()) { 55 case Cell.CELL_TYPE_NUMERIC: 56 if (DateUtil.isCellDateFormatted(cell)) { 57 cellValue = formatter.formatCellValue(cell); 58 } else { 59 double value = cell.getNumericCellValue(); 60 int intValue = (int) value; 61 cellValue = value - intValue == 0 ? String.valueOf(intValue) : String.valueOf(value); 62 } 63 break; 64 case Cell.CELL_TYPE_STRING: 65 cellValue = cell.getStringCellValue(); 66 break; 67 case Cell.CELL_TYPE_BOOLEAN: 68 cellValue = String.valueOf(cell.getBooleanCellValue()); 69 break; 70 case Cell.CELL_TYPE_FORMULA: 71 cellValue = String.valueOf(cell.getCellFormula()); 72 break; 73 case Cell.CELL_TYPE_BLANK: 74 cellValue = ""; 75 break; 76 case Cell.CELL_TYPE_ERROR: 77 cellValue = ""; 78 break; 79 default: 80 cellValue = cell.toString().trim(); 81 break; 82 } 83 } 84 return cellValue.trim(); 85 } 86 87 private void getSheetData() { 88 89 listData = new ArrayList<>(); 90 mapData = new ArrayList<>(); 91 columnHeaderList = new ArrayList<>(); 92 int numOfRows = sheet.getLastRowNum() + 1; 93 for (int i = 0; i < numOfRows; i++) { 94 Row row = sheet.getRow(i); 95 Map<String, String> map = new HashMap<>(); 96 List<String> list = new ArrayList<>(); 97 98 if (row != null) { 99 for (int j = 0; j < row.getLastCellNum(); j++) { 100 Cell cell = row.getCell(j); 101 if (i == 0) { 102 columnHeaderList.add(getCellValue(cell)); 103 } else { 104 105 map.put(columnHeaderList.get(j), this.getCellValue(cell)); 106 107 } 108 list.add(this.getCellValue(cell)); 109 } 110 } 111 if (i > 0) { 112 mapData.add(map); 113 } 114 listData.add(list); 115 116 117 } 118 119 flag = true; 120 121 for (int i = 0; i < listData.size(); i++) { 122 for (int j = 0; j < listData.get(i).size(); j++) { 123 System.out.println(listData.get(i).get(j).toString()); 124 } 125 } 126 127 } 128 129 public String getCellData(int row, int col) { 130 if (row <= 0 || col <= 0) { 131 return null; 132 } 133 if (!flag) { 134 this.getSheetData(); 135 } 136 if (listData.size() >= row && listData.get(row - 1).size() >= col) { 137 return listData.get(row - 1).get(col - 1); 138 } else { 139 return null; 140 } 141 } 142 143 public String getCellData(int row, String headerName) { 144 if (row <= 0) { 145 return null; 146 } 147 if (!flag) { 148 this.getSheetData(); 149 } 150 if (mapData.size() >= row && mapData.get(row - 1).containsKey(headerName)) { 151 return mapData.get(row - 1).get(headerName); 152 } else { 153 return null; 154 } 155 } 156 157 158 public Object[][] getSheetData2() { 159 160 List<Object[]> result = new ArrayList<>(); 161 listData = new ArrayList<>(); 162 mapData = new ArrayList<>(); 163 columnHeaderList = new ArrayList<>(); 164 165 int numOfRows = sheet.getLastRowNum() + 1; 166 System.out.println("总共有 " + numOfRows + "行 !"); 167 for (int i = 0; i < numOfRows; i++) { 168 Row row = sheet.getRow(i); 169 Map<String, String> map = new HashMap<>(); 170 List<String> list = new ArrayList<>(); 171 Object[] o1 = new Object[row.getLastCellNum()]; 172 173 if (row != null) { 174 for (int j = 0; j < row.getLastCellNum(); j++) { 175 // System.out.println("第 "+i+" 行--- row.getLastCellNum()===="+row.getLastCellNum()); 176 Cell cell = row.getCell(j); 177 if (i == 0) { 178 o1[j] = this.getCellValue(cell); 179 // System.out.println(j+"------this.getCellValue(cell)="+this.getCellValue(cell)); 180 columnHeaderList.add(getCellValue(cell)); 181 } else { 182 o1[j] = this.getCellValue(cell); 183 // System.out.println(j+"------this.getCellValue(cell)="+this.getCellValue(cell)); 184 map.put(columnHeaderList.get(j), this.getCellValue(cell)); 185 186 } 187 list.add(this.getCellValue(cell)); 188 } 189 } 190 if (i > 0) { 191 mapData.add(map); 192 } 193 result.add(o1); 194 listData.add(list); 195 } 196 // 测试数据excel数据用 ; 197 /* for (int i = 0; i < result.size(); i++) { 198 for (int j = 0; j < result.get(i).length; j++) { 199 System.out.print(result.get(i)[j]+" | "); 200 } 201 System.out.println(); 202 }*/ 203 results = new Object[result.size()][]; 204 205 for (int i = 0; i < result.size(); i++) { 206 results[i] = result.get(i); 207 } 208 flag = true; 209 210 System.out.println("results.length==" + results.length); 211 return results; 212 } 213 214 public static void main(String[] args) { 215 /* Object[][] obj1; 216 ExcelReader eh = new ExcelReader("C:\\\\TEST.xlsx", "Sheet1"); 217 Object[][] sheetData2 = eh.getSheetData2(); 218 System.out.println(sheetData2.length + "------------"); 219 for (int i = 1; i < sheetData2.length; i++) { 220 for (int j = 0; j < sheetData2[i].length; j++) { 221 System.out.print(sheetData2[i][j] + " | "); 222 } 223 System.out.println(); 224 }*/ 225 226 227 } 228 }
二,ExcelUtil工具类
1 package main.java; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 import java.util.ArrayList; 7 import java.util.List; 8 9 import org.apache.poi.hssf.usermodel.HSSFWorkbook; 10 import org.apache.poi.ss.usermodel.Row; 11 import org.apache.poi.ss.usermodel.Sheet; 12 import org.apache.poi.ss.usermodel.Workbook; 13 import org.apache.poi.xssf.usermodel.XSSFCell; 14 import org.apache.poi.xssf.usermodel.XSSFRow; 15 import org.apache.poi.xssf.usermodel.XSSFSheet; 16 import org.apache.poi.xssf.usermodel.XSSFWorkbook; 17 18 19 public class ExcleUtil { 20 private static XSSFSheet ExcelWSheet; 21 private static XSSFWorkbook ExcelWBook; 22 private static XSSFCell Cell; 23 private static XSSFRow Row; 24 private static String ExcelFilePath="C:\\\\TEST.xlsx"; 25 26 // 设定要设置的Excel的文件路径和Excel 中Sheet名; 27 // 在读/写Excel 的时候先要调用此方法 28 public static void setExcleFile(String FilePath, String sheetName) throws Exception { 29 FileInputStream ExcleFile; 30 try { 31 // 实例化Excle文件的FileInputStream 对象; 32 ExcleFile = new FileInputStream(FilePath); 33 // 实例化Excle文件的XSSFWorkbook 对象; 34 ExcelWBook = new XSSFWorkbook(ExcleFile); 35 /* 36 * 实例化XSSFSheet 对象,指定ExcelFile中的sheet名称,用于后续对sheet中行和列的操作; 37 * 38 */ 39 ExcelWSheet = ExcelWBook.getSheet(sheetName); 40 41 } catch (Exception e) { 42 e.getStackTrace(); 43 } 44 45 } 46 /* 47 * 读取excle文件指定单元格的函数 ; 48 * 49 */ 50 51 public static String getCell(int row, int col) throws Exception { 52 53 try { 54 // 通过函数参数指定单元格的行号和列,获取指定单元格的对象; 55 Cell = ExcelWSheet.getRow(row).getCell(col); 56 /* 57 * 1.如果单元格的类型为字符串类型,使用getStringCellValue();来获取单元格的内容; 58 * 2.如果单元格的类型为数字类型,使用getNumberricCellValue();来获取单元格的内容; 59 * 注意:getNumberricCellValue();返回的值为double类型,转为为字符串类型,必须在 60 * getNumberricCellValue();前面加上(" ")双引号,用于强制转换为String类型,不加双引号 61 * 则会抛错;double类型无法转换为String类型的异常; 62 * 63 */ 64 String CellData = Cell.getCellType() == XSSFCell.CELL_TYPE_STRING ? Cell.getStringCellValue() + "" 65 : String.valueOf(Math.round(Cell.getNumericCellValue())); 66 return CellData; 67 } catch (Exception e) { 68 e.getStackTrace(); 69 return ""; 70 } 71 72 } 73 /* 74 * 在Excle中执行单元格写入数据; 75 * 76 * 77 */ 78 79 public static void setCellData(int rownum, int colnum, String Result) throws Exception { 80 81 try { 82 // 获取excle文件的中行对象; 83 Row = ExcelWSheet.getRow(rownum); 84 // 如果单元格为空则返回null; 85 Cell = Row.getCell(colnum, Row.RETURN_BLANK_AS_NULL); 86 if (Cell == null) { 87 // 当单元格为空是则创建单元格 88 // 如果单元格为空无法调用单元格对象的setCellValue方法设定单元格的值 ; 89 Cell = Row.createCell(colnum); 90 // 创建单元格和后可以通过调用单元格对象的setCellValue方法设置单元格的值了; 91 Cell.setCellValue(Result); 92 } else { 93 // 单元格中有内容,则可以直接调用单元格对象的 setCellValue 方法来设置单元格的值; 94 Cell.setCellValue(Result); 95 } 96 FileOutputStream fileout = new FileOutputStream(ExcelFilePath); 97 // 将内容写到Excel文件中 ; 98 ExcelWBook.write(fileout); 99 // j调用flush方法强制刷新写入文件; 100 fileout.flush(); 101 fileout.close(); 102 System.out.println("-----写入成功!------"); 103 } catch (Exception e) { 104 System.out.println(e.getMessage() + e.getStackTrace()); 105 throw (e); 106 } 107 108 } 109 110 public static void TangsetCellData(int RowNum, int ColNum, String Result) { 111 try { 112 // 获取行对象 113 Row = ExcelWSheet.getRow(RowNum); 114 // 如果单元格为空,则返回null 115 Cell = Row.getCell(ColNum, Row.RETURN_BLANK_AS_NULL); 116 if (Cell == null) { 117 // 当单元格对象是Null时,则创建单元格 118 // 如果单元格为空,无法直接调用单元格的setCellValue方法设定单元格的值 119 Cell = Row.createCell(RowNum); 120 // 调用setCellValue方法设定单元格的值 121 Cell.setCellValue(Result); 122 } else { 123 // 单元格中有内容,则可以直接调用seCellValue方法设定单元格的值 124 Cell.setCellValue(Result); 125 } 126 // 实例化写入Excel文件的文件输出流对象 127 FileOutputStream fileOut = new FileOutputStream(ExcelFilePath); 128 // 将内容写入Excel中 129 ExcelWBook.write(fileOut); 130 fileOut.flush(); 131 fileOut.close(); 132 } catch (Exception e) { 133 // TODO: handle exception 134 e.printStackTrace(); 135 } 136 } 137 138 // 从excel 文件中获取测试数据的静态方法; 139 public static Object[][] getTestData(String excelFilePath, String sheetName) throws Exception { 140 // 根据参数传入的数据文件路径和文件名称,组合出Excel 数据文件的绝对路径 141 // 声明一个文件; 142 File file = new File(excelFilePath); 143 // 创建FileInputStream 来读取Excel文件内容; 144 FileInputStream inputStream = new FileInputStream(file); 145 // 声明Workbook 对象; 146 Workbook workbook = null; 147 // 获取文件名参数的扩展名,判断是“.xlsx” 还是 “.xls” ; 148 String fileExtensionName = excelFilePath.substring(excelFilePath.indexOf(\'.\')); 149 if (fileExtensionName.equals(".xlsx")) { 150 workbook = new XSSFWorkbook(inputStream); 151 152 } else if (fileExtensionName.equals(".xls")) { 153 workbook = new HSSFWorkbook(inputStream); 154 155 } 156 Sheet sheet = workbook.getSheet(sheetName); 157 // 获取Excel 数据文件Sheet1 中数据的行数,getLastRowNum 方法获取数据的最后一行的行号, 158 // getFistRowNum 获取第一行 最后一行减去第一行就是总行数了 159 // 注意excle 的行和列都是从0开始的; 160 int rowCount = sheet.getLastRowNum() - sheet.getFirstRowNum(); 161 // 创建名为records 的List对象来存储从Excel文件中读取的数据; 162 List<Object[]> records = new ArrayList<Object[]>(); 163 // 使用for循环遍历Excel 数据文件的所有数据(除了第一行,第一行为标题行),所以i以上是关于TestNG+Excel+(HTTP+JSON) 简单接口测试的主要内容,如果未能解决你的问题,请参考以下文章
接口测试——Java + TestNG 国家气象局接口(json解析)实例
java结合testng,利用excel做数据源的数据驱动实例
selenium+testng+java+poi进行excel的数据参数化