应用背景
目前市场上很多 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-assur...
简单的实践
如果在 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: </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年,以数据智能分析能力为核心,通过构建客户数据平台,打造增长营销闭环,帮助企业提升数据驱动能力,赋能商业决策、实现业务增长。
点击「此处」获取 GrowingIO 15 天免费试用!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。