使用的自動化框架
java + httpclient + log4j + json + mybatis + excel + testng
- excel : API 管理
- httpclient:接口請求
- log4j:腳本log記錄
- json-lib:接口返回數(shù)據(jù)的解析
- mybatis: 腳本與數(shù)據(jù)庫的交互
- testng:測試用例管理要出,斷言
excel
httpclient ( get / post)
/** * get 形式請求API *
* @param uri url 和 對應(yīng)參數(shù)
* @param @key key
* @return 返回相應(yīng)信息
* @throws java.net.URISyntaxException
* @throws java.io.IOException
*/
public static JSON getAPI(URI uri) throws URISyntaxException, IOException {
CloseableHttpClient httpclient = HttpClients.createDefault();
try {
httpget = new HttpGet(uri);
log.info("執(zhí)行API請求" + httpget.getRequestLine());
ResponseHandler<String> responseHandler = new ResponseHandler<String>() {
public String handleResponse(final HttpResponse response) throws ClientProtocolException, IOException {
int status = response.getStatusLine().getStatusCode();
if (status >= 200 && status < 300) {
HttpEntity entity = response.getEntity();
return entity != null ? EntityUtils.toString(entity) : null;
} else {
log.error("請求錯誤鸳君,狀態(tài)碼為:" + response.getStatusLine().getStatusCode());
throw new ClientProtocolException("意外的狀態(tài)返回: " + status);
}
}
};
String responseBody = httpclient.execute(httpget, responseHandler);
JSONObject dataObject = JSONObject.fromObject(responseBody.trim());
return dataObject;
} finally {
httpclient.close();
}
}
/** * Post 形式請求API *
* @param uri url 和 對應(yīng)參數(shù)
* @param @key key
* @return 返回相應(yīng)信息
* @throws java.net.URISyntaxException
* @throws java.io.IOException
*/
public static JSON postAPI(URI uri) throws URISyntaxException, IOException {
CloseableHttpClient httpclient = HttpClients.createDefault();
try {
httpPost = new HttpPost(uri);
log.info("執(zhí)行API接口請求" + httpPost.getRequestLine());
ResponseHandler<String> responseHandler = new ResponseHandler<String>() {
public String handleResponse(
final HttpResponse response) throws ClientProtocolException, IOException {
int status = response.getStatusLine().getStatusCode();
if (status >= 200 && status < 300) {
HttpEntity entity = response.getEntity();
return entity != null ? EntityUtils.toString(entity) : null;
} else {
throw new ClientProtocolException("意外的狀態(tài)返回: " + status);
}
}
};
String responseBody = httpclient.execute(httpPost, responseHandler);
JSONObject dataObject = JSONObject.fromObject(responseBody);
return dataObject;
} finally {
httpclient.close();
}
}
log4g
###set output encoding###
log4j.appender.logfile.encoding=UTF-8
### set log levels ###
log4j.rootLogger = INFO , ERROR ,stdout , logfile
### 控制臺輸出 ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} %p %t [%c]%M(line:%L)%m%n
### save error log ###
log4j.appender.ERROR = org.apache.log4j.DailyRollingFileAppender
log4j.appender.ERROR.File = logs/error.log
log4j.appender.ERROR.Append = true
log4j.appender.ERROR.Threshold = ERROR
log4j.appender.ERROR.layout = org.apache.log4j.PatternLayout
log4j.appender.ERROR.layout.ConversionPattern =%-d{yyyy-MM-dd HH:mm:ss} %p %t [%c]%M(line:%L)%m%n
### write in log ###
log4j.appender.logfile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.File=logs/debug.log
log4j.appender.logfile.Append = true
log4j.appender.logfile.Threshold = DEBUG
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} %p %t [%c]%M(line:%L)%m%n
mybatis:跟mysql交互
- 根據(jù)表名創(chuàng)建各跟表名一樣的類 例如Account_info表如下,并定義跟表結(jié)構(gòu)一樣的字段患蹂。
- 新建一個interface(如Account_infoDao) 創(chuàng)建一個方法或颊,參數(shù)為mysql語句中你想通過什么查詢的砸紊,例如下面我想通過account_id來查詢出Accounts_info表的某行數(shù)據(jù)
- 實現(xiàn)接口interface(如Account_infoDaoImpl)
- 新建mapper文件(如新建個Accounts_infoMapper.xml文件)
- 在config.xml文件配置上mapper文件路徑,如下Accounts_infoMapper.xml 路徑
- 新建個類囱挑,用于接口需要時調(diào)用
- 接口需要處使用
public class Accounts_infoTest {
static Accounts_infoDao accountsDao = new Accounts_InfoDaoImpl();
/*** 通過account_id查詢出 accounts_info表數(shù)據(jù)
* @param account_id 用戶id
* @return account_info 表數(shù)據(jù)
*/
public static Accounts_Info byAccount_id(String account_id){
Accounts_info a = accountsDao.account_id(account_id);
return a;
}
Accounts_info accounts_info=Accounts_infoTest.byAccount_id(Integer.valueOf(account_id));
int coin_num_sql = accounts_info.getCoin();// 拿到數(shù)據(jù)庫中 coin_num 字段
返回json解析
- 例1
// 拿到response_status對應(yīng)的值success
String response_status = jsonObject .getString("response_status");
// 拿到post_enable的值1
String post_enable = json.getJSONObject("info").getJSONObject("data").getJSONObject("priv_option").getString("post_enable");
- 例2 返回的json是一組一組的
// 拿到list下多個組數(shù)據(jù)
JSONArray jsonArray = json.getJSONObject("info").getJSONObject("data").getJSONArray("list");
// 獲取組數(shù)據(jù)中第一個數(shù)據(jù)(數(shù)組從0開始)并強制轉(zhuǎn)成json格式
JSONObject jsonObject = (JSONObject) jsonArray.get(0);
String id = jsonObject.getString("id");// 獲取強制轉(zhuǎn)成json后的id
創(chuàng)建一個自動化API腳本的步驟
- 從api文檔地址查找到對應(yīng)api
- 配置對應(yīng)api的 信息到 excel 表格
- 唯一標(biāo)示(tid)醉顽,協(xié)議(http),服務(wù)器地址與端口平挑,api路徑游添,api參數(shù)(0到多個)
- 新建個跟API 同名的類(例如LoginTest)
- 發(fā)起請求
- JSONObject jsonObject = ApiEngine.taquAPI(唯一標(biāo)識, Parameters.KEY,參數(shù)1的值,參數(shù)2的值);
- Html例子
- Document document= ApiEngine.XXXAPIHtml(tid, m, a, ticket_id);
- log.info(jsonObject) 輸出jsonObject 便于控制臺查看結(jié)果
可能遇到的問題
-
控制臺輸出如下通熄,可能你代碼中的tid唯一標(biāo)示在excel不存在或者excel編寫后未能保存
-
控制臺輸入如下 可能原因 excel 配置的參數(shù)個數(shù)和代碼發(fā)起請求是給的參數(shù)值的個數(shù)不一致通常發(fā)起請求代碼給的參數(shù)個數(shù)大于excel配置的個數(shù)
錯誤提示 【x】【y】單元格為空唆涝,請。棠隐。石抡。。 類似問題基本上解決方案是打開excel 找到第X+1 行 第Y+1 列助泽,隨便數(shù)據(jù)數(shù)據(jù)啰扛,保存,右鍵清空數(shù)據(jù)