最近项目比较悠闲,想找点事干,写了个 Excel 接口测试的 "框架" 以前用 python 写过一个,这次用 java, 应该说框架都不算,反正就是写了,能帮我解决问题就行。
当然咯,也许会问干嘛那么麻烦直接用 feed4testng, 或者 testng 就行了,没事找事干还专门写个这玩意... 呵呵,就闲的蛋疼!
文笔有限不知道怎么写,直接上代码:
欢迎各位指定,或提出好的意见,总觉得还有很多不好的地方。
结构就这破样了, E 文也不好, 随便捣鼓,开心就好。 哈哈
ExcelUtil.java 类:
1 package com.hozhu.excel; 2 3 import java.io.BufferedInputStream; 4 import java.io.File; 5 import java.io.FileInputStream; 6 import java.io.FileOutputStream; 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 import org.apache.log4j.Logger; 14 import org.apache.poi.ss.usermodel.CellStyle; 15 import org.apache.poi.ss.usermodel.IndexedColors; 16 import org.apache.poi.xssf.usermodel.XSSFCell; 17 import org.apache.poi.xssf.usermodel.XSSFCellStyle; 18 import org.apache.poi.xssf.usermodel.XSSFRow; 19 import org.apache.poi.xssf.usermodel.XSSFSheet; 20 import org.apache.poi.xssf.usermodel.XSSFWorkbook; 21 22 /** 23 * 只支持读取 .xlsx 所有方法读取数据时, 未对 Excel 格式类型进行判断处理 如 Excel 中有特殊数据类型, 需在 Excel 24 * 中标注为文本类型, 程序才能正常处理 25 * 26 * @author Roger 27 * @version 1.0 28 */ 29 public class ExcelUtil { 30 private static Logger logger = Logger.getLogger(ExcelUtil.class); 31 32 private String filePath = null; 33 private String sheetName = null; 34 35 public String getSheetName() { 36 return sheetName; 37 } 38 39 public void setSheetName(String sheetName) { 40 this.sheetName = sheetName; 41 } 42 43 public String getFilePath() { 44 return filePath; 45 } 46 47 public void setFilePath(String filePath) { 48 this.filePath = filePath; 49 } 50 51 /** 52 * 判断成员变量 filePath 是否为空 53 * 54 * @return 55 */ 56 private boolean isFilePathEmpty() { 57 boolean flag = false; 58 if ((null != filePath && (!filePath.equals("")))) { 59 flag = true; 60 } 61 return flag; 62 } 63 64 private boolean isSheetNameEmpty() { 65 boolean flag = false; 66 if ((null != sheetName && (!sheetName.equals("")))) { 67 flag = true; 68 } 69 return flag; 70 } 71 72 // 使用静态内部类创建外部类对象 73 private static class Excel { 74 private static ExcelUtil excelUtil = new ExcelUtil(); 75 } 76 77 private ExcelUtil() { 78 } 79 80 // 获取 ExcelUtil 实例 81 public static ExcelUtil getInstance() { 82 return Excel.excelUtil; 83 } 84 85 /** 86 * 检查传入的文件后缀是否为 xlsx 87 * 88 * @param filePacht 89 * @return 90 */ 91 public boolean checkXlsx(File file) { 92 boolean flag = false; 93 94 if (file.exists()) { 95 String str = file.getName(); 96 if (str.substring(str.lastIndexOf(".") + 1).equals("xlsx")) 97 flag = true; 98 } else { 99 logger.info(file.getName() + ", 文件不存在...");100 // System.out.println("文件不存在...");101 }102 103 return flag;104 }105 106 /**107 * 108 * @param file109 * @return true: 文件未被操作; false: 文件正在被操作.110 */111 public boolean isFile(File file) {112 return file.renameTo(file);113 }114 115 public File createFile() {116 File file = null;117 if (isFilePathEmpty()) {118 file = new File(filePath);119 } else {120 logger.error("filePath 不能为: "121 + filePath122 + ", 请先使用 'ExcelUtil.getInstance().setFilePath(filePath)' 设置!");123 // System.out.println("filePath 不能为: " + filePath +124 // ", 请先使用 'ExcelUtil.getInstance().setFilePath(filePath)' 设置!");125 System.exit(-1);126 }127 return file;128 }129 130 /**131 * 创建 XSSFWorkbook132 * 133 * @param 文件路径134 * @return135 */136 public XSSFWorkbook createExcelWorkBook() {137 File file = createFile();138 139 BufferedInputStream in = null;140 XSSFWorkbook book = null;141 142 if (checkXlsx(file)) {143 try {144 in = new BufferedInputStream(new FileInputStream(file));145 book = new XSSFWorkbook(in);146 } catch (IOException e) {147 e.printStackTrace();148 }149 }150 return book;151 }152 153 /**154 * 创建 XSSFSheet155 * 156 * @param sheetName157 * @return158 */159 public XSSFSheet createExcelSheet(String sheetName) {160 XSSFSheet sheet = null;161 if (isSheetNameEmpty()) {162 XSSFWorkbook book = createExcelWorkBook();163 if (book != null) {164 int sheetCount = book.getNumberOfSheets();165 for (int i = 0; i < sheetCount; i++) {166 if (sheetName.equals(book.getSheetName(i))) {167 sheet = book.getSheet(sheetName);168 break;169 }170 }171 }172 } else {173 logger.error("sheetName 不能为: "174 + sheetName175 + ", 请先使用 'ExcelUtil.getInstance().setSheetName(SheetName)' 设置!");176 // System.out.println("sheetName 不能为: " + sheetName +177 // ", 请先使用 'ExcelUtil.getInstance().setSheetName(SheetName)' 设置!");178 System.exit(-1);179 }180 181 return sheet;182 }183 184 /**185 * 获取指定行186 * 187 * @param sheetName188 * @param line189 * 行索引, 从 0 开始190 * @return191 */192 public XSSFRow getExcelRow(int line) {193 XSSFRow row = null;194 if (line <= getSheetMaxRow())195 row = createExcelSheet(sheetName).getRow(line);196 return row;197 }198 199 /**200 * 获取指定 sheet 中最大行数201 * 202 * @param sheetName203 * @return204 */205 public int getSheetMaxRow() {206 int maxRow = -1;207 if (createExcelSheet(sheetName) != null)208 maxRow = createExcelSheet(sheetName).getLastRowNum();209 return maxRow;210 }211 212 /**213 * 使用正则表达式去掉多余的.与0214 * 215 * @param s216 * @return217 */218 private String subZeroAndDot(String s) {219 if (s.indexOf(".") > 0) {220 // 去掉多余的 0221 s = s.replaceAll("0+?$", "");222 // 如果最后一位是.则去掉223 s = s.replaceAll("[.]$", "");224 }225 return s;226 }227 228 /**229 * 获取 Excel 指定行数据230 * 231 * @param sheetName232 * @param line233 * @return 返回一个一维数组234 */235 public String[] readExcelRows(int line) {236 String[] result = null;237 XSSFRow row = getExcelRow(line);238 int maxRow = getSheetMaxRow();239 if (row != null && maxRow > -1) {240 int columnNum = row.getLastCellNum();241 result = new String[columnNum];242 for (int i = 0; i < columnNum; i++) {243 // 判断单元格是否为空, 不进行判断时, 如遇到空白单元格时, 抛出空指针异常244 if (null != row.getCell(i))245 result[i] = subZeroAndDot(row.getCell(i).toString().trim());246 }247 }248 return result;249 }250 251 /**252 * 获取指定单元格中内容253 * 254 * @param sheetName255 * @param line256 * 行257 * @param column258 * 列259 * @return260 */261 public String readExcelCell(int line, int column) {262 String[] value = null;263 String result = "";264 value = readExcelRows(line);265 if (value != null) {266 result = value[column];267 }268 return result;269 }270 271 /**272 * 从指定行开始读取 Excel 中所有数据273 * 274 * @param sheetName275 * sheet 名称276 * @param line277 * 表标题所在行278 * @return 返回一个包含 HashMap的 ArrayList; 格式:[{第一行数据},{第二行数据}]279 * {列 1 标题 = 列 1 值, 列 2 标题 = 列 2 值}280 */281 public List
HttpRequester.java类:
1 package com.hozhu.api; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStreamReader; 6 import java.io.PrintWriter; 7 import java.net.HttpURLConnection; 8 import java.net.URL; 9 import java.util.HashMap; 10 import java.util.Map; 11 12 public class HttpRequester { 13 /** 14 * 向指定 URL 发送POST方法的请求 15 * 16 * @param method 17 * 指定请求方法:GET, POST 等 18 * @param url 19 * 发送请求的 URL 20 * @param param 21 * 请求参数,请求参数是 name1=value1&name2=value2 的形式。 22 * @return result 返回结果 23 */ 24 public static MapsendPost(String method, String url, 25 String param) { 26 PrintWriter out = null; 27 BufferedReader br = null; 28 String result = ""; 29 int responseCode = 0; 30 Map map = new HashMap (); 31 try { 32 // 打开和URL之间的连接 33 HttpURLConnection httpConn = (HttpURLConnection) new URL(url) 34 .openConnection(); 35 36 // 发送POST请求必须设置如下两行 37 // 设置可输入、 可输出 38 httpConn.setDoInput(true); 39 httpConn.setDoOutput(true); 40 41 httpConn.setReadTimeout(150000); 42 httpConn.setConnectTimeout(15000); 43 44 // 连接后不自动跳转 45 httpConn.setInstanceFollowRedirects(false); 46 47 // 设置通用的请求属性 48 httpConn.setRequestProperty("Accept-Charset", "utf-8"); 49 httpConn.setRequestProperty("User-Agent", "systempatch"); 50 httpConn.setRequestProperty("Accpet-Encoding", "gzip"); 51 52 // 设置提交方式 53 httpConn.setRequestMethod(method); 54 55 // httpConn.connect(); 56 57 // 获取HttpURLConnection对象对应的输出流 58 out = new PrintWriter(httpConn.getOutputStream()); 59 60 // 发送请求参数 61 out.print(param); 62 out.flush(); 63 responseCode = httpConn.getResponseCode(); 64 map.put("code", String.valueOf(responseCode)); 65 // 打印 http 状态码 66 // System.out.println("responseCode: " + responseCode); 67 68 if (HttpURLConnection.HTTP_OK == responseCode) { 69 // 定义BufferedReader输入流来读取URL的响应 70 br = new BufferedReader(new InputStreamReader( 71 httpConn.getInputStream(), "utf-8")); 72 String strLine; 73 StringBuffer responseBuf = new StringBuffer(); 74 75 while ((strLine = br.readLine()) != null) { 76 responseBuf.append(strLine); 77 } 78 79 result = responseBuf.toString(); 80 map.put("result", result); 81 } 82 83 } catch (Exception e) { 84 System.out.println("发送 POST 请求出现异常!" + e); 85 e.printStackTrace(); 86 } 87 // 使用finally块来关闭输出流、输入流 88 finally { 89 try { 90 if (out != null) { 91 out.close(); 92 } 93 if (br != null) { 94 br.close(); 95 } 96 } catch (IOException ex) { 97 ex.printStackTrace(); 98 } 99 }100 return map;101 }102 }
MobileApiTools.java 类
1 package com.hozhu.api; 2 3 import java.io.IOException; 4 import java.text.SimpleDateFormat; 5 import java.util.Date; 6 7 import com.hozhu.excel.ExcelUtil; 8 9 public class MobileApiTools { 10 private MobileApiTools() { 11 } 12 13 /** 14 * 获取当前系统时间 15 * 16 * @return 17 */ 18 public static String getDate() { 19 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 20 return df.format(new Date()); 21 } 22 23 /** 24 * 期望结果与实际结果比较 25 * 26 * @param expectedResult 27 * @param actualResult 28 * @return 29 */ 30 public static String assertResult(String expectedResult, String actualResult) { 31 String result; 32 if (expectedResult.equals(actualResult)) 33 result = "OK"; 34 else 35 result = "NG"; 36 return result; 37 38 } 39 40 /** 41 * 初始化 Excel 中指定列数据 42 * 43 * @param filePath 44 * 文件路径 45 * @param sheetName 46 * sheet 名称 47 * @param titleLineIndex 48 * 表标题所在行索引 49 * @param columnName 50 * 列名称 51 * @param content 52 * 需写入的内容 53 * @param color 54 * 需设置的单元格颜色 55 * @throws IOException 56 */ 57 public static void initializeData(int titleLineIndex, String columnName, 58 String content, int color) throws IOException { 59 int maxRow = ExcelUtil.getInstance().getSheetMaxRow(); 60 int columnIndex = ExcelUtil.getInstance().getColumnIndex( 61 titleLineIndex, columnName); 62 if (maxRow != -1 && columnIndex != -1) { 63 for (int i = titleLineIndex + 1; i <= maxRow; i++) { 64 // 初始化单元格内容 65 ExcelUtil.getInstance().writeExcelCell(i, columnIndex, content); 66 // 设置单元格颜色 67 ExcelUtil.getInstance().setCellBackgroundColor(titleLineIndex, 68 columnName, i, color); 69 } 70 } 71 } 72 73 /** 74 * 将执行结果写入 Excel 中 75 * 76 * @param filePath 77 * 文件路径 78 * @param sheetName 79 * sheet 名称 80 * @param titleLineIndex 81 * 标题所在索引行 82 * @param writeStartRow 83 * 写入起始行 84 * @param columnName 85 * 列名称 86 * @param content 87 * 写入内容 88 */ 89 public static void writeResult(int titleLineIndex, int writeStartRow, 90 String columnName, String content) { 91 92 int columnIndex = ExcelUtil.getInstance().getColumnIndex( 93 titleLineIndex, columnName); 94 if (columnIndex != -1) { 95 try { 96 ExcelUtil.getInstance().writeExcelCell(writeStartRow, 97 columnIndex, content); 98 } catch (IOException e) { 99 e.printStackTrace();100 }101 }102 }103 104 /**105 * 表标题行是否包含指定参数106 * @param argLineIndex 参数名称所在单元格行索引107 * @param argColumnIndex 参数名称所在单元格列索引108 * @param titleLineIndex 表标题所在行索引109 * @return110 */111 public static boolean isArgEquals(int argLineIndex, int argColumnIndex,112 int titleLineIndex) {113 String[] argArray = null;114 boolean flag = false;115 116 // 获取所在单元格的参数列表117 String args = ExcelUtil.getInstance().readExcelCell(argLineIndex, argColumnIndex);118 if (!args.equals("")) {119 argArray = args.split("\\|");120 } else {121 System.out.println("文件: " + ExcelUtil.getInstance().getFilePath()122 + ", sheetName: " + ExcelUtil.getInstance().getSheetName()123 + ", 获取参数失败...");124 }125 126 if (argArray != null) {127 for (int i = 0; i < argArray.length; i++) {128 int tempIndex = ExcelUtil.getInstance().getColumnIndex(129 titleLineIndex, argArray[i]);130 if (tempIndex >= 0)131 flag = true;132 else133 System.out.println("参数: " + argArray[i]134 + ", 不存在表标题行中, 请检查...");135 }136 }137 return flag;138 }139 140 public void info() {141 142 }143 }
LoginAPI.java 类
1 package com.hozhu.cases; 2 3 import java.io.IOException; 4 import java.util.List; 5 import java.util.Map; 6 7 import org.apache.log4j.Logger; 8 import org.json.JSONException; 9 import org.json.JSONObject; 10 11 import com.hozhu.api.HttpRequester; 12 import com.hozhu.api.MobileApiTools; 13 import com.hozhu.excel.ExcelUtil; 14 15 public class LoginAPI { 16 private static Logger logger = Logger.getLogger(LoginAPI.class); 17 18 private final String FILE_PATH = "mobileApiCase.xlsx"; 19 private final String SHEET_NAME = "Login"; 20 private final int TITLE_LINE_INDEX = 4; 21 22 private final String RESULT_CODE = "ResultCode"; 23 private final String TEST_RESULT = "TestResult"; 24 private final String RUNNING_TIME = "RunningTime"; 25 private final String ACTUAL_RESULT = "ActualResult"; 26 private final String RUN = "Run"; 27 28 // 需要的参数常量 29 private final String MAIL = "mail"; 30 private final String MOBILE = "mobile"; 31 private final String PASS_WORD = "password"; 32 33 public LoginAPI() { 34 try { 35 logger.info(LoginAPI.class); 36 37 ExcelUtil.getInstance().setFilePath(FILE_PATH); 38 ExcelUtil.getInstance().setSheetName(SHEET_NAME); 39 40 logger.info("初始化: " + ExcelUtil.getInstance().getFilePath() + ", " + ExcelUtil.getInstance().getSheetName()); 41 42 MobileApiTools.initializeData(TITLE_LINE_INDEX, RUN, "N", 4); 43 MobileApiTools.initializeData(TITLE_LINE_INDEX, ACTUAL_RESULT, "", 44 4); 45 MobileApiTools.initializeData(TITLE_LINE_INDEX, RESULT_CODE, "", 4); 46 MobileApiTools.initializeData(TITLE_LINE_INDEX, TEST_RESULT, "NT", 47 2); 48 MobileApiTools 49 .initializeData(TITLE_LINE_INDEX, RUNNING_TIME, "", 4); 50 51 logger.info(ExcelUtil.getInstance().getFilePath() + ", " + ExcelUtil.getInstance().getSheetName() + "初始化完成"); 52 } catch (IOException e) { 53 e.printStackTrace(); 54 } 55 } 56 57 public void login() throws JSONException, IOException { 58 String url = ""; 59 String act = ""; 60 String method = ""; 61 List> data = null; 62 boolean flag = false; 63 64 url = ExcelUtil.getInstance().readExcelCell(0, 1); 65 act = ExcelUtil.getInstance().readExcelCell(1, 1); 66 method = ExcelUtil.getInstance().readExcelCell(2, 1); 67 flag = MobileApiTools.isArgEquals(3, 1, TITLE_LINE_INDEX); 68 69 if (url.equals("") || act.equals("") || method.equals("") || !flag) { 70 logger.error("请检查 Excel 中 Interface、Act、Method、ArgName 是否设置正确..."); 71 //System.out 72 // .println("请检查 Excel 中 Interface、Act、Method、ArgName 是否设置正确..."); 73 System.exit(-1); 74 } 75 76 data = ExcelUtil.getInstance().readExcelAllData(4); 77 78 if (data != null) { 79 for (int i = 0; i < data.size(); i++) { 80 Map map = data.get(i); 81 String mail = map.get(MAIL); 82 String mobile = map.get(MOBILE); 83 String password = map.get(PASS_WORD); 84 String state = map.get("State"); 85 String expectedResult = map.get("ExpectedResult"); 86 String loginName; 87 88 // 如果 state == 0 则用 邮箱登录, 否则使用手机号码登录 89 if (Integer.parseInt(state) == 0) 90 loginName = mail; 91 else 92 loginName = mobile; 93 94 String param = "Act=" + act + "&" + "LoginName=" + loginName 95 + "&" + "Pwd=" + password; 96 97 Map result = HttpRequester.sendPost(method, 98 url, param); 99 String code = result.get("code");100 String rsTmp = result.get("result");101 102 // 将字符串转换为 JSON103 JSONObject object = new JSONObject(rsTmp);104 String actualResult = object.getString("msg");105 106 String testResult = MobileApiTools.assertResult(expectedResult,107 actualResult);108 109 // 写入 Run 列, 执行纪录110 MobileApiTools.writeResult(TITLE_LINE_INDEX, TITLE_LINE_INDEX111 + 1 + i, RUN, "Y");112 113 // 写入 http code114 MobileApiTools.writeResult(TITLE_LINE_INDEX, TITLE_LINE_INDEX115 + 1 + i, RESULT_CODE, code);116 117 // 设置单元格颜色118 if (Integer.parseInt(code) == 200)119 ExcelUtil.getInstance().setCellBackgroundColor(120 TITLE_LINE_INDEX, RESULT_CODE,121 TITLE_LINE_INDEX + 1 + i, 1);122 else123 ExcelUtil.getInstance().setCellBackgroundColor(124 TITLE_LINE_INDEX, RESULT_CODE,125 TITLE_LINE_INDEX + 1 + i, 1);126 127 // 写入实际结果128 MobileApiTools.writeResult(TITLE_LINE_INDEX, TITLE_LINE_INDEX129 + 1 + i, ACTUAL_RESULT, actualResult);130 131 // 写入测试通过与否132 MobileApiTools.writeResult(TITLE_LINE_INDEX, TITLE_LINE_INDEX133 + 1 + i, TEST_RESULT, testResult);134 135 if (testResult.equals("OK"))136 ExcelUtil.getInstance().setCellBackgroundColor(137 TITLE_LINE_INDEX, TEST_RESULT,138 TITLE_LINE_INDEX + 1 + i, 1);139 else140 ExcelUtil.getInstance().setCellBackgroundColor(141 TITLE_LINE_INDEX, TEST_RESULT,142 TITLE_LINE_INDEX + 1 + i, 0);143 144 // 写入执行时间145 MobileApiTools.writeResult(TITLE_LINE_INDEX, TITLE_LINE_INDEX146 + 1 + i, RUNNING_TIME, MobileApiTools.getDate());147 148 logger.info("CaseID: " + map.get("CaseID") + ", CaseName: " + map.get("CaseName") + ", ExpectedResult: " +149 map.get("ExpectedResult") + ", ActualResult: " + actualResult + ", ResultCode: " + code +150 ", TestResult: " + testResult);151 }152 }153 154 }155 156 public static void main(String[] args) throws JSONException, IOException {157 LoginAPI loginAPI = new LoginAPI();158 loginAPI.login();159 160 }161 162 }
RunCase.java : 所有的 case 都放这里运行
1 package com.hozhu.cases; 2 3 import java.io.IOException; 4 5 import org.json.JSONException; 6 import org.testng.Assert; 7 import org.testng.annotations.Test; 8 9 import com.hozhu.excel.ExcelUtil;10 11 public class RunCase {12 @Test13 public void testLogin() throws JSONException, IOException {14 LoginAPI login = new LoginAPI();15 login.login();16 String [] result = ExcelUtil.getInstance().readExcelColumnData(4, "TestResult");17 for (int i = 0; i < result.length; i++) {18 Assert.assertEquals(result[i], "OK");19 }20 }21 }
好了, 上传完毕,等等, 还有那 excel 也上截图吧,呵呵
原文:https://www.cnblogs.com/peng-lan/p/5335654.html