写点什么

针对 Restful 协议下的接口测试平台设计

发布于: 2021 年 05 月 17 日
针对 Restful 协议下的接口测试平台设计

应用背景


目前市场上很多 Web 应用转向了 RESTful 的架构,往往暴露给用户的往往就是一组 REST API,这样的好处就是,研发人员可以根据需要调用不同的 API,整合出自己的应用出来。

这样每组 API 就会形成一个信息中心,各个信息中心结合在一起,就形成了一个互联互通的信息架构。所以针对此种轻量级的流行架构,接口服务的场景测试必不可少,目前主流的 postman 或者 jmeter 之类的工具虽然也可以胜任,但是对于整体设计来说总是欠缺一些什么。

像阿里巴巴之类的大厂一直在推举自己自定义去做一些质量平台,有针对性的去设计适合自己产品的测试方案,这里存在一个开源的接口服务框架,可以支持 restful 协议,并可以支持 xml、json 之类的数据格式的传输、验证、断言等。

REST Assured 是一套由 Java 实现的 REST API 测试框架,它是一个轻量级的 REST API 客户端,可以直接编写代码向服务器端发起 HTTP 请求,并验证返回结果;它的语法非常简洁,是一种专为测试 REST API 而设计的 DSL。


官网地址: https://rest-assured.io/

官方文档: https://rest-assured.io/#docs

Github 项目地址: https://github.com/rest-assured/rest-assured


简单的实践


如果在 IDE 配置一个简单些的接口测试环境,那我们首先可以将 REST Assured 配置到 Maven 中:




配置好后,我们来看一个典型的测试案例:

在 src/test/java 下创建一个包,起名叫 OurTest,在该包下创建一个 GioApiTests 类

接下来我们来看一下代码:


public class OurTest{
@Testpublic void getAddress(){given() requestApplication.get(s:”https://ip:8090/trueTest/com/ourname/226514”) Response .then()ValidateReponse.statusCode(200);}
@Testpublic void postOurName(){String json=”{“\firstName\“:\”wangtao\”,\”secondName\”:\”tao\”}”;given() RequestApplication.contentType(“application/json“)RequestApplication.body(json)RequestApplication.post(s:”ip:8090/trueTest/com/ourname”)response.then()ValidateReponse.statusCode(200);}
}
复制代码


下面我们来解释一下:


首先就是 given( )就是 REST Assured 的一个典型的方法,所有的请求的内容( header、body 等)都是在这里描述。get 和 post 我就不用多说了,发送请求的方式,then ( ) 是请求后需要做哪些,statusCode 是用来判断返回值是不是 200。

这样讲下来我们很容易理解,基本就是基于一系列简单的发送、绑定、验证的过程。

当然,我们在设计自动化 API 平台的时候,我们还是需要有平台化的理念在里面,对于不熟悉代码开发的测试团队,我们需要将输入项以页面的形式呈现,而有一定开发功底的团队,我们则可以像上面一样,基于代码和 rest-assured 的语法去进行一系列的开发工作。


进阶的实践


1、REST Assured 有一种要求就是需要我们最好进行静态导入:


io.restassured.RestAssured.*io.restassured.matcher.RestAssuredMatchers.*org.hamcrest.Matchers.*
复制代码


这样可以提高使用中的一些效率。


2、REST Assured 将自动尝试基于 HTTP 方法确定哪个参数类型(即查询或表单参数)


在 GET 的情况下,查询参数将被自动使用,在 POST 的情况下将使用表单参数。在某些情况下,重要的是在 PUT 或 POST 中分离表单和查询参数:


given(). formParam("formParamName", "value1"). queryParam("queryParamName", "value2"). when(). post("/something");
复制代码


一些参数也可以在 url 上进行设置:


when().get("/name?firstName=wang&lastName=tao");
复制代码


3、关于 cookies 的使用


通常模式下,您可以通过以下方法指定 Cookie:


given().cookie("username", "John").when().get("/cookie").then().body(equalTo("username"));
复制代码


也可以像这样给 cookie 指定多个值:

这将创建两个 cookie:

cookieName = value1 和 cookieName = value2。


还可以使用以下方式指定详细的 Cookie:


Cookie someCookie = new Cookie.Builder("some_cookie", "some_value").setSecured(true).setComment("some comment").build(); given().cookie(someCookie).when().get("/cookie").then().assertThat().body(equalTo("x"));
复制代码


或同时指定 多个 cookie:


Cookie cookie1 = Cookie.Builder("username", "John").setComment("comment 1").build(); Cookie cookie2 = Cookie.Builder("token", 1234).setComment("comment 2").build(); Cookies cookies = new Cookies(cookie1, cookie2); given().cookies(cookies).when().get("/cookie").then().body(equalTo("username, token"));
复制代码


4、还像点样子的断言


状态码的断言:


get("/x").then().assertThat().statusCode(200). .. get("/x").then().assertThat().statusLine("something"). .. get("/x").then().assertThat().statusLine(containsString("some"))
复制代码


完全匹配的断言:


get("/x").then().assertThat().body(equalTo("something"))
复制代码


表单的验证:

表单的代码:


<html><head><title>Login</title></head> <body><form action="j_spring_security_check" method="POST"><table><tr><td>User:&nbsp;</td><td><input type='text' name='j_username'></td></tr> <tr><td>Password:</td><td><input type='password' name='j_password'></td></tr> <tr><td colspan='2'><input name="submit" type="submit"/></td></tr> </table></form> </body></html>
复制代码


断言:


given(). auth().form("wang", "tao"). when(). get("/formAuth"); then(). statusCode(200);
复制代码


经验总结


基于目前市面的主流质量平台的框架,本人推荐 VUE+Springboot+Mybatis+Mysql 的基本框架,API 接口测试以及其所设计的场景架构,推荐 REST Assured 的二次封装的方法(形成 REST Assured API),与基于 VUE 的前端框架相配合,前端收集报文参数,转化成 Json 格式传输给 REST Assured API ,首先预判 URL 是否可用,再转化接受解析报文,返回 Response 再解析断言结果,单线程之间的变量与参数储存在缓存中,关闭即可消失,但是在场景中,建议存储在本地文件或者 appolo 这种配置文件存储介质中。

希望大家多多发散,多多总结,结合产品特性,灵活设计质量平台的定制化功能。


作者:王涛/测试经理


招聘信息


GrowingIO 技术团队是一个活力四射、对技术充满激情的团队,多个岗位持续招聘中!诚招 大数据工程师 / Java 工程师 / 数据挖掘工程师 等。欢迎有兴趣的同学投递简历至:jianli@growingio.com(邮件标题请注明具体岗位名称)。更多职位及信息可进入招聘官网查看!


关于 GrowingIO


GrowingIO 是国内领先的一站式数据增长引擎整体方案服务商,创立于 2015 年,以数据智能分析能力为核心,通过构建客户数据平台,打造增长营销闭环,帮助企业提升数据驱动能力,赋能商业决策、实现业务增长。


点击「https://accounts.growingio.com/signup」获取 GrowingIO 15 天免费试用!

发布于: 2021 年 05 月 17 日阅读数: 36
用户头像

GrowingIO 技术团队经验分享 2020.05.09 加入

GrowingIO(官网网站www.growingio.com)的官方技术专栏,内容涵盖微服务架构,前端技术,数据可视化,DevOps,大数据方面的经验分享。 公众号:GrowingIO技术团队

评论

发布
暂无评论
针对 Restful 协议下的接口测试平台设计