• 接口自动化思路_JAVA


    写在开头: 技术渣做接口自动化,大神们请轻喷!多提提优化方案和问题点。

    以前做接口测试一直通过postman 和 soapUI来做,Postman 是Chrome的一个插件Case多了不好管理,同时执行起来麻烦,得一个一个去点击执行,平时做调试可以用用真正用来做接口自动化不合适。
    SoapUI (改名叫Ready!API)是个不错的工具,同时支持了soap类型和rest 类型的接口,而且还支持安全,性能等测试,当然它是个商业工具,高级功能都是需要收费的,想那啥也是可以的,但是工具提供了方便同样可扩展性差了点,而且我经常遇到莫名其妙的工具问题,也许是因为我用的是那啥版本,稳定性差吧。 
    也是有人直接用Jmeter 或者loadrunner 来做接口自动化的,当然也是行的当用例管理上也是较为麻烦,有个框架robot framework,关键字驱动来做接口也是一朋友一再推荐的做法,可惜我对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等框架包。

    在这过程做了一些封装一些主要代码如下: 
    对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来管理接口了,例如我新建了下面这么个文件: 

    TID 用来标识我需要读取哪行数据,TName仅仅做说明这个接口是什么接口,Method 来表示接口是什么类型,根据不同类型做调用不同的httpclient 封装方法,然后后面就是去拼接接口的URL:

    拼接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类,其实没做多大改变加了几个方法而已,下面是一个完整的登陆例子:

    [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 以上就是目前做接口自动化的大概思路,这其中肯定还有非常多需要去做优化的, 望各大神提提优化意见和方案,不胜感激。

  • 相关阅读:
    Android开发——嘀咕客户端Demo版
    Android开发——对sdcard扩展卡文件操作
    Android开发——数据存储之ContentProvider(1)
    Android开发——应用程序生命周期
    Android开发——多媒体开发之MediaPlayer
    Android开发——Intent
    Windows环境下Apache的reverse proxy报OS 10048的原因和解决办法
    windows下,Unable to load dynamic library php_mcrypt
    一些Arduino 测试代码
    字符串转化为16进制内容
  • 原文地址:https://www.cnblogs.com/jackyroc/p/7688195.html
Copyright © 2020-2023  润新知