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

以前做接口测试一直通过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. Linux磁盘配额

    Step1:修改fstab文件,增加磁盘限额用户和用户组信息 # /etc/fstab# Created by anaconda on Sat Dec 29 04:48:18 2018## Acces ...

  2. sqlplus中设定行大小、页大小、字符列格式、数字列格式、清屏

    sqlplus虽然是DBA们最为经常使用的Oracle客户端工具,但是它在输出结果格式化上不是很好,如折行.分页不好等,所以一般启动sqlplus后多少都要做些设置,如linesize.pagesiz ...

  3. JVM思考-init和clinit区别

    JVM思考-init和clinit区别 目录:JVM总括:目录 clinit和init的区别其实也就是Class对象初始化对象初始化的区别,详情看我上一篇博客: JVM总括四-类加载过程.双亲委派模型 ...

  4. Eigen使用矩阵作为函数参数

    1 使用矩阵作为函数参数介绍 文章来源Writing Functions Taking %Eigen Types as Parameters Eigen为了在函数中传递不同的类型使用了表达式模板技术. ...

  5. SQL 不常用的一些命令sp_OACreate,xp_cmdshell,sp_makewebtask

    开启和关毕xp_cmdshell   EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cm ...

  6. SpringBoot编写自定义Starter

    根据SpringBoot的Starter编写规则,需要编写xxxStarter依赖xxxAutoConfigurer,xxxStarter是一个空的jar,仅提供辅助性的依赖管理,引入其他类库 1.建 ...

  7. TensorFlow笔记之常见七个参数

    对TensorFlow深度学习中常见参数的总结分析 神经网络中常见的参数有:初始学习率.学习率衰减率.隐藏层节点数量.迭代轮数.正则化系数.滑动平均衰减率.批训练数量七个参数. 对这七个参数,大部分情 ...

  8. python 实践项目 强密码检测

    需求:写一个函数,它使用正则表达式,确保传入的口令字符串是强口令.强口令的定义是:长度不少于 8 个字符,同时包含大写和小写字符,至少有一位数字.你可能需要用多个正则表达式来测试该字符串,以保证它的强 ...

  9. 使用注解配置Spring

    使用注解配置Spring 1.为主配置文件引入新的命名空间(约束) 2.开启使用注解代理配置文件 3.在类中使用注解完成配置 将对象注册到容器 修改对象的作用范围 值类型注入 引用类型注入 注意: 初 ...

  10. ABP框架系列之四十二:(Object-To-Object-Mapping-对象映射)

    Introduction It's a common to map a similar object to another object. It's also tedious and repeatin ...