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

680 阅读5分钟

应用背景

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

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

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

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

官网地址: rest-assured.io/

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

Github项目地址: github.com/rest-assure…

简单的实践

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

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

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

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

public class OurTest{

@Test
public void getAddress(){
given() requestApplication.get(s:”https://ip:8090/trueTest/com/ourname/226514”) Response .then()ValidateReponse.statusCode(200);
}

@Test
public 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年,以数据智能分析能力为核心,通过构建客户数据平台,打造增长营销闭环,帮助企业提升数据驱动能力,赋能商业决策、实现业务增长。