接口自動化思路_JAVA

寫在開頭: 技術渣作接口自動化,大神們請輕噴!多提提優化方案和問題點。java

之前作接口測試一直經過postman 和 soapUI來作,Postman 是Chrome的一個插件Case多了很差管理,同時執行起來麻煩,得一個一個去點擊執行,平時作調試能夠用用真正用來作接口自動化不合適。
SoapUI (更名叫Ready!API)是個不錯的工具,同時支持了soap類型和rest 類型的接口,並且還支持安全,性能等測試,固然它是個商業工具,高級功能都是須要收費的,想那啥也是能夠的,可是工具提供了方便一樣可擴展性差了點,並且我常常遇到莫名其妙的工具問題,也許是由於我用的是那啥版本,穩定性差吧。 
也是有人直接用Jmeter 或者loadrunner 來作接口自動化的,固然也是行的當用例管理上也是較爲麻煩,有個框架robot framework,關鍵字驅動來作接口也是一朋友一再推薦的作法,惋惜我對python 不熟悉,儘管上手容易我仍是放棄。python

還有個開源框架rest-assured,具體看地址:https://code.google.com/p/rest-assured/ 也是至關有意思,完了幾天本想引入用這個框架,後來。。。咱家開發寫的接口不規範,只好忍心幹掉了。
如今我改用這麼一套思路在作,由於目前個人接口協議都是http的,我就乾脆直接用java的HttpClient,而後接口返回是json格式,我就引入了json-lib來方便解析獲取,一樣由於須要跟數據庫交互因此又引入了MyBatis,同時用例仍是沿用TestNG ,爲了更方便管理接口(地址,路徑,參數等等)又經過excel來管理接口,經過excel來驅動測試。 
這樣下來整個項目就涉及了 httpclient+json+mybaits+testng+poi(excel)+log4j等框架包。sql

在這過程作了一些封裝一些主要代碼以下: 
對httpclient 封裝,只要把接口的完整請求傳進來若是請求正常,就會return 的接口返回的json:數據庫

 

[java]  view plain  copy
 
  1. public static JSON getAPI(URI uri) throws URISyntaxException, IOException {  
  2.         CloseableHttpClient httpclient = HttpClients.createDefault();  
  3.         try {  
  4.             httpget = new HttpGet(uri);  
  5.             log.info("執行API請求" + httpget.getRequestLine());  
  6.             ResponseHandler<String> responseHandler = new ResponseHandler<String>() {  
  7.                 public String handleResponse(  
  8.                         final HttpResponse response) throws ClientProtocolException, IOException {  
  9.                     int status = response.getStatusLine().getStatusCode();  
  10.                     if (status >= 200 && status < 300) {  
  11.                         HttpEntity entity = response.getEntity();  
  12.                         return entity != null ? EntityUtils.toString(entity) : null;  
  13.                     } else {  
  14.                         log.error("請求錯誤,狀態碼爲:"+response.getStatusLine().getStatusCode());  
  15.                         throw new ClientProtocolException("意外的狀態返回: " + status);  
  16.                     }  
  17.                 }  
  18.             };  
  19.             String responseBody = httpclient.execute(httpget, responseHandler);  
  20.             JSONObject dataObject = JSONObject.fromObject(responseBody);  
  21.             return dataObject;  
  22.         } finally {  
  23.             httpclient.close();  
  24.         }  
  25.     }       


那請求能夠發起了,接口URL 怎麼來? 剛說經過excel來管理接口了,例如我新建了下面這麼個文件: json

 

TID 用來標識我須要讀取哪行數據,TName僅僅作說明這個接口是什麼接口,Method 來表示接口是什麼類型,根據不一樣類型作調用不一樣的httpclient 封裝方法,而後後面就是去拼接接口的URL:api

拼接URL的關鍵代碼以下:安全

 

[java]  view plain  copy
 
  1. /** 
  2.      * 請求連接拼接 
  3.      * 
  4.      * @param tid        哪一行的excel數據 
  5.      * @param parameters 參數 
  6.      * @return uri 
  7.      */  
  8.     public static URI returnURI(String tid, String... parameters) {  
  9.         String path = System.getProperty("user.dir") + File.separator + "src" + File.separator + "main" + File.separator + "resources" + File.separator + "excel" + File.separator + "api.xls";  
  10.         ExcelEngine.filepath = path;  
  11.         ExcelEngine.sheetname = "api";  
  12.         // 從excel 拿數據  
  13.         List apiData = getApiData(tid);  
  14.         String getorpost = ((String) apiData.get(2)).toLowerCase();  
  15. //        System.out.println(getorpost);  
  16.         String scheme = (String) apiData.get(3);  
  17.         String apiHost = (String) apiData.get(4);  
  18.         String apiPath = (String) apiData.get(5);  
  19.         // URI 拼接  
  20.         StringBuffer stringBuffer = new StringBuffer(scheme + "://" + apiHost + apiPath + "?");  
  21.         HashMap<String, String> hashmap = new HashMap();  
  22.         int p = 0;  
  23.         while (p < parameters.length) {  
  24.             hashmap.put((String) apiData.get(p + 6), parameters[p]);  
  25.             p = p + 1;  
  26.         }  
  27.         hashmap.put("autoKey", String.valueOf(Parameters.timeStamp_Long()));  
  28. //        int i = hashmap.size();  
  29. //        System.out.println("map 大小" + i);  
  30.         int num = 0;  
  31. //        System.out.println("map 裏面的值" + hashmap.entrySet());  
  32.         for (HashMap.Entry<String, String> entry : hashmap.entrySet()) {  
  33.             num++;  
  34.             if (num == hashmap.size()) {  
  35.                 stringBuffer.append(entry.getKey() + "=" + entry.getValue());  
  36.             } else {  
  37.                 stringBuffer.append(entry.getKey() + "=" + entry.getValue() + "&");  
  38.             }  
  39.         }  
  40.         String url = stringBuffer.toString();  
  41.         URI uri = URI.create(url);  
  42.         return uri;  
  43.     }  


如今接口的URL拼接完成了,請求也發起了,也能夠拿到返回的json數據了,最後就得對返回的數據作校驗了,這裏我是從新封裝了下TestNG 提供的Assert類爲TaquAssert類,其實沒作多大改變加了幾個方法而已,下面是一個完整的登錄例子:app

 

 

[java]  view plain  copy
 
  1. public class LoginTest {  
  2.     static LoggerControler log = LoggerControler.getLogger(LoginTest.class);  
  3.     // accounts 表  
  4.     AccountsTest accountsTest = new AccountsTest();  
  5.   
  6.     String tid = "v1_Account_login";  
  7.   
  8.     @Test  
  9.     public void loginSuccess() {  
  10.         // 發起api請求  
  11.         JSONObject json = ApiEngine.taquAPI(tid, "username", "password");  
  12.         // 打印出json  
  13.         log.info(json);  
  14.   
  15.         // 經過api獲取該用戶的account_id,而後查詢Accounts表  
  16.         String account_id = json.getJSONObject("info").getJSONObject("data").getString("account_id");  
  17.         Accounts accounts = accountsTest.byAccount_id(Integer.valueOf(account_id));  
  18.   
  19.         // 校驗返回的 狀態是否是 success.  
  20.         String response_status = json.getString("response_status");  
  21.         TaquAssert.assertEquals("校驗response_status", "success", response_status);  
  22.   
  23.         // 從數據庫獲取用戶名和接口返回的用戶名作對比檢查是否一致  
  24.         String account_name_sql = accounts.getAccount_name();  
  25.         String account_name_api = json.getJSONObject("info").getJSONObject("data").getString("nickname");  
  26.         TaquAssert.assertEquals("校驗account_name", account_name_api, account_name_sql);  
  27.     }  
  28. }  


後期還會把這塊放到Jenkins環境去運行,以前把Jenkins環境搞壞了,苦逼還得去重搭建 。
OK 以上就是目前作接口自動化的大概思路,這其中確定還有很是多須要去作優化的, 望各大神提提優化意見和方案,不勝感激。框架

相關文章
相關標籤/搜索