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

以前做接口测试一直通过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:

  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的关键代码如下:

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

  1. public class LoginTest {
  2. static LoggerControler log = LoggerControler.getLogger(LoginTest.class);
  3. // accounts 表
  4. AccountsTest accountsTest = new AccountsTest();
  5. String tid = "v1_Account_login";
  6. @Test
  7. public void loginSuccess() {
  8. // 发起api请求
  9. JSONObject json = ApiEngine.taquAPI(tid, "username", "password");
  10. // 打印出json
  11. log.info(json);
  12. // 通过api获取该用户的account_id,然后查询Accounts表
  13. String account_id = json.getJSONObject("info").getJSONObject("data").getString("account_id");
  14. Accounts accounts = accountsTest.byAccount_id(Integer.valueOf(account_id));
  15. // 校验返回的 状态是不是 success.
  16. String response_status = json.getString("response_status");
  17. TaquAssert.assertEquals("校验response_status", "success", response_status);
  18. // 从数据库获取用户名和接口返回的用户名做对比检查是否一致
  19. String account_name_sql = accounts.getAccount_name();
  20. String account_name_api = json.getJSONObject("info").getJSONObject("data").getString("nickname");
  21. TaquAssert.assertEquals("校验account_name", account_name_api, account_name_sql);
  22. }
  23. }

后期还会把这块放到Jenkins环境去运行,之前把Jenkins环境搞坏了,苦逼还得去重搭建 。
OK 以上就是目前做接口自动化的大概思路,这其中肯定还有非常多需要去做优化的, 望各大神提提优化意见和方案,不胜感激。

接口自动化思路_JAVA的更多相关文章

  1. python+pytest接口自动化(12)-自动化用例编写思路 (使用pytest编写一个测试脚本)

    经过之前的学习铺垫,我们尝试着利用pytest框架编写一条接口自动化测试用例,来厘清接口自动化用例编写的思路. 我们在百度搜索天气查询,会出现如下图所示结果: 接下来,我们以该天气查询接口为例,编写接 ...

  2. 接口自动化的根基--HTTP协议

    点击标题下「蓝色微信名」可快速关注 坚持的是分享,搬运的是知识,图的是大家的进步,没有收费的培训,没有虚度的吹水,喜欢就关注.转发(免费帮助更多伙伴)等来交流,想了解的知识请留言,给你带来更多价值,是 ...

  3. python+request接口自动化框架

    python+request接口自动化框架搭建 1.数据准备2.用python获取Excel文件中测试用例数据3.通过requests测试接口4.根据接口返回的code值和Excel对比 但本章只讲整 ...

  4. 转载:python + requests实现的接口自动化框架详细教程

    转自https://my.oschina.net/u/3041656/blog/820023 摘要: python + requests实现的接口自动化框架详细教程 前段时间由于公司测试方向的转型,由 ...

  5. 自动化测试 接口自动化及UI自动化测试平台设计演示

    接口自动化及UI自动化测试平台设计演示   by:授客  QQ:1033553122 欢迎加入全国软件测试交流qq群:7156436 大家好,我是授客. 本视频意在分享个人,基于Python,Djan ...

  6. Jmeter(二十八)_Docker+Jmeter+Gitlab+Jenkins+Ant(容器化的接口自动化持续集成平台)

    这套接口自动化持续集成环境已经部署差不多了,现在说说我的设计思路 1:利用Docker容器化Gitlab,Jenkins,Jmeter,Ant,链接如下 Docker_容器化gitlab Docker ...

  7. WEB 自动化思路

    前期做了一个关键字驱动模型的WEB自动化项目,特意写文章归纳和总结下. 框架架构图 已经实现的部分: 1. 读写excel数据模板 2.配置中心,支持properties,xml格式的配置文件 3.参 ...

  8. python接口自动化24-有token的接口项目使用unittest框架设计

    获取token 在做接口自动化的时候,经常会遇到多个用例需要用同一个参数token,并且这些测试用例跨.py脚本了. 一般token只需要获取一次就行了,然后其它使用unittest框架的测试用例全部 ...

  9. 新手入门贴之基于 python 语言的接口自动化 demo 小实战

    大家好,我是正在学习接口测试的菜鸟.近期通过自己的学习,完成了一个关于测试接口的接口自动化demo.下面想跟大家分享一下,主要的思路是根据接口文档确定测试用例,并将测试用例写在excel中.因为只是小 ...

随机推荐

  1. 在Laravel中使用mongoDB

    https://blog.csdn.net/weixin_38682852/article/details/80840678?utm_source=blogxgwz1 https://blog.csd ...

  2. 用java开发图形界面项目,如何实现从本地选择图片文件并以二进制流的形式保存到MySQL数据库,并重新现实到面板

  3. 100-days: nineteen

    Title: Figure skating(花样滑冰): Olympic(奥林匹克的) champion Hanyu says '100 percent' on(引出时机) return to ice ...

  4. PHP+ajax实现二级联动

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Django模型层(2)

    <!DOCTYPE html><html lang="zh-cn"><head><meta charset="utf-8&quo ...

  6. cmd输入appium-doctor,运行时提示'node'不是内部或外部的命令

    一.提示'node'不是内部或外部命令,先按照下面步骤操作: 1.设置APPIUM_HOME系统变量,值为当前appium安装目录,例如:D:\software_install\Appium 2.设置 ...

  7. C语言输出格雷码

    格雷码是以n位的二进制来表示数. 与普通的二进制表示不同的是,它要求相邻两个数字只能有1个数位不同. 首尾两个数字也要求只有1位之差. 有很多算法来生成格雷码.以下是较常见的一种: 从编码全0开始生成 ...

  8. The current state of generics in Delphi( 转载)

    The current state of generics in Delphi   To avoid duplication of generated code, the compiler build ...

  9. POJ1862 Stripies 贪心 B

    POJ 1862 Stripies https://vjudge.net/problem/POJ-1862 题目:     Our chemical biologists have invented ...

  10. JavaScript基础视频教程总结(031-040章)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...