Java + Excel 接口自动化
2021-05-17 15:29
阅读:516
最近项目比较悠闲,想找点事干,写了个 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 file
109 * @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 + filePath
122 + ", 请先使用 ‘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 * 创建 XSSFWorkbook
132 *
133 * @param 文件路径
134 * @return
135 */
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 * 创建 XSSFSheet
155 *
156 * @param sheetName
157 * @return
158 */
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 0) {
220 // 去掉多余的 0
221 s = s.replaceAll("0+?$", "");
222 // 如果最后一位是.则去掉
223 s = s.replaceAll("[.]$", "");
224 }
225 return s;
226 }
227
228 /**
229 * 获取 Excel 指定行数据
230 *
231 * @param sheetName
232 * @param line
233 * @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 的 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 Map sendPost(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 = 0)
131 flag = true;
132 else
133 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 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 // 将字符串转换为 JSON
103 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_INDEX
111 + 1 + i, RUN, "Y");
112
113 // 写入 http code
114 MobileApiTools.writeResult(TITLE_LINE_INDEX, TITLE_LINE_INDEX
115 + 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 else
123 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_INDEX
129 + 1 + i, ACTUAL_RESULT, actualResult);
130
131 // 写入测试通过与否
132 MobileApiTools.writeResult(TITLE_LINE_INDEX, TITLE_LINE_INDEX
133 + 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 else
140 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_INDEX
146 + 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 @Test
13 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
好了, 上传完毕,等等, 还有那 excel 也上截图吧,呵呵

原文:https://www.cnblogs.com/peng-lan/p/5335654.html
下一篇:Python3:OOP Demo
评论
亲,登录后才可以留言!