寫在開頭: 技術渣作接口自動化,大神們請輕噴!多提提優化方案和問題點。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:數據庫
- public static JSON getAPI(URI uri) throws URISyntaxException, IOException {
- CloseableHttpClient httpclient = HttpClients.createDefault();
- try {
- httpget = new HttpGet(uri);
- log.info("執行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("請求錯誤,狀態碼爲:"+response.getStatusLine().getStatusCode());
- throw new ClientProtocolException("意外的狀態返回: " + status);
- }
- }
- };
- String responseBody = httpclient.execute(httpget, responseHandler);
- JSONObject dataObject = JSONObject.fromObject(responseBody);
- return dataObject;
- } finally {
- httpclient.close();
- }
- }
那請求能夠發起了,接口URL 怎麼來? 剛說經過excel來管理接口了,例如我新建了下面這麼個文件: json
TID 用來標識我須要讀取哪行數據,TName僅僅作說明這個接口是什麼接口,Method 來表示接口是什麼類型,根據不一樣類型作調用不一樣的httpclient 封裝方法,而後後面就是去拼接接口的URL:api
拼接URL的關鍵代碼以下:安全
- public static URI returnURI(String tid, String... parameters) {
- String path = System.getProperty("user.dir") + File.separator + "src" + File.separator + "main" + File.separator + "resources" + File.separator + "excel" + File.separator + "api.xls";
- ExcelEngine.filepath = path;
- ExcelEngine.sheetname = "api";
-
- List apiData = getApiData(tid);
- String getorpost = ((String) apiData.get(2)).toLowerCase();
- String scheme = (String) apiData.get(3);
- String apiHost = (String) apiData.get(4);
- String apiPath = (String) apiData.get(5);
-
- StringBuffer stringBuffer = new StringBuffer(scheme + "://" + apiHost + apiPath + "?");
- HashMap<String, String> hashmap = new HashMap();
- int p = 0;
- while (p < parameters.length) {
- hashmap.put((String) apiData.get(p + 6), parameters[p]);
- p = p + 1;
- }
- hashmap.put("autoKey", String.valueOf(Parameters.timeStamp_Long()));
- int num = 0;
- for (HashMap.Entry<String, String> entry : hashmap.entrySet()) {
- num++;
- if (num == hashmap.size()) {
- stringBuffer.append(entry.getKey() + "=" + entry.getValue());
- } else {
- stringBuffer.append(entry.getKey() + "=" + entry.getValue() + "&");
- }
- }
- String url = stringBuffer.toString();
- URI uri = URI.create(url);
- return uri;
- }
如今接口的URL拼接完成了,請求也發起了,也能夠拿到返回的json數據了,最後就得對返回的數據作校驗了,這裏我是從新封裝了下TestNG 提供的Assert類爲TaquAssert類,其實沒作多大改變加了幾個方法而已,下面是一個完整的登錄例子:app
- public class LoginTest {
- static LoggerControler log = LoggerControler.getLogger(LoginTest.class);
-
- AccountsTest accountsTest = new AccountsTest();
-
- String tid = "v1_Account_login";
-
- @Test
- public void loginSuccess() {
-
- JSONObject json = ApiEngine.taquAPI(tid, "username", "password");
-
- log.info(json);
-
-
- String account_id = json.getJSONObject("info").getJSONObject("data").getString("account_id");
- Accounts accounts = accountsTest.byAccount_id(Integer.valueOf(account_id));
-
-
- String response_status = json.getString("response_status");
- TaquAssert.assertEquals("校驗response_status", "success", response_status);
-
-
- String account_name_sql = accounts.getAccount_name();
- String account_name_api = json.getJSONObject("info").getJSONObject("data").getString("nickname");
- TaquAssert.assertEquals("校驗account_name", account_name_api, account_name_sql);
- }
- }
後期還會把這塊放到Jenkins環境去運行,以前把Jenkins環境搞壞了,苦逼還得去重搭建 。
OK 以上就是目前作接口自動化的大概思路,這其中確定還有很是多須要去作優化的, 望各大神提提優化意見和方案,不勝感激。框架