本文共 4742 字,大约阅读时间需要 15 分钟。
前面文章,让我们稍微对RestAssured这个框架有一点点认识和基础。given()这是一个请求对象,get(url)这个是做GET类型请求的发送操作,then()这个是验证相关的对象,前面get()执行完了就能拿到response对象,然后response对象下有一些验证相关的类,then()就是验证类的一个方法。目前就知道这么多,我们这篇开始,一个一个介绍RestAssured的基本功能。
因为只有我们遍历一个一个基本功能,也就是覆盖我们接口测试中的一个一个一个测试场景以及相关的设置,这些我们都会了之后,然后我们下一个阶段就是考虑,基于RestAssured框架,搭建或开发一个属于自己风格的接口自动化测试框架。
1. 打印全部响应内容到控制台
这个目前对我们很重要,打印响应内容,可以帮助我们debug和更改代码,调整测试用例的检查点。上一篇入门的例子,我们只是知道判断响应状态码是不是200,现在我们来学习如何在控制台输出全部的响应内容。响应内容就包括,响应起始行,响应头字段,响应正文内容。
还是在demo这个包下的BasicFeatures.java 新写下面这个测试用例。
/** * 验证状态码,并且打印全部响应内容到控制台 */ @Test public void testPrintContents() { given(). get("http://jsonplaceholder.typicode.com/posts/3"). then(). statusCode(200). log().all(); }
这里我换了一个请求地址,百度首页请求回来肯定好多内容,我找到了一个响应内容比较少的。
HTTP/1.1 200 OKDate: Sat, 20 Jul 2019 02:55:39 GMTContent-Type: application/json; charset=utf-8Transfer-Encoding: chunkedConnection: keep-aliveSet-Cookie: __cfduid=df32505fc01884b6740e3b87aec5d54091563591339; expires=Sun, 19-Jul-20 02:55:39 GMT; path=/; domain=.typicode.com; HttpOnlyX-Powered-By: ExpressVary: Origin, Accept-EncodingAccess-Control-Allow-Credentials: trueCache-Control: public, max-age=14400Pragma: no-cacheExpires: Sat, 20 Jul 2019 06:55:39 GMTX-Content-Type-Options: nosniffEtag: W/"11b-USacuIw5a/iXAGdNKBvqr/TbMTc"Via: 1.1 vegurCF-Cache-Status: HITAge: 158Server: cloudflareCF-RAY: 4f91a850bb0da2c4-HKGContent-Encoding: gzip{ "userId": 1, "id": 3, "title": "ea molestias quasi exercitationem repellat qui ipsa sit aut", "body": "et iusto sed quo iure\nvoluptatem occaecati omnis eligendi aut ad\nvoluptatem doloribus vel accusantium quis pariatur\nmolestiae porro eius odio et labore et velit aut"}
上面是控制台输出的响应消息,你可以把这个地址贴在浏览器,回车,看看浏览器显示内容和控制台是不是一模一样。
然后,我们来看看log().all() 这个方法的源码,尝试去看看如何实现的。
首先查到这个源码
ValidatableResponseLogSpec<T, R> log();
这行代码告诉我们log() 操作返回的对象是一个ValidatableResponseLogSpec,也就是和验证响应有关的一个日志功能类或者接口,再看这个继承谁。
public interface ValidatableResponseLogSpec<T extends ValidatableResponseOptions<T, R>, R extends ResponseBody<R> & ResponseOptions<R>>
知道了ValidatableResponseLogSpec是一个接口,继承了ValidatableResponseOptions,也继承了ResponseBody和ResponseOptions
也就是说log()这个对象具有了上面三个对象的属性和方法,主要是验证类的响应选项,响应正文,响应选项。
再来看看all()这个方法的定义。
ValidatableResponseLogSpec这个接口下,可以找到all()方法的定义,文档注释这么写的,能够打印出响应中一切内容(响应头,cookie,body),而且是比较美观的格式打印,不管响应内容是json还是xml,还是html。
好了,关于打印响应全部内容到控制台,学习完毕。
2.判断响应正文某一个字符串
这个场景是解析响应正文中的某一个字符串是否和我们已知的相等,一般来说正文是json或者xml,这个我们直接使用RestAssured的body()方法,直接可以获取。
我们来判断body中的id是不是等于3,title是不是上面这一串,这个好像有点像巴西葡萄牙语言,不管了,代码中直接来字符串匹配,RestAssured有一个方法是equalTo().
首先,这里有一个坑,关于使用equalTo() 无法自动识别和导入包提示的坑。
import static org.hamcrest.Matchers.*;
这个hamcrest就是我们pom.xml最后导入的一个依赖包,我记得我在JUnit单元测试框架的文章中介绍和使用过这个在正则匹配方面很强大的工具包。
/** * 测试 equalTo()方法 */ @Test public void testEqualToMethod() { given(). get("http://jsonplaceholder.typicode.com/posts/3"). then(). body("id", equalTo(3)); }
运行结果
[RemoteTestNG] detected TestNG version 6.14.3PASSED: testEqualToMethod
上面这个body方法是
具体api文档可以看这里:
点击Index,然后点击B开头索引,选择body方法,可以看到好多Body重载方法。
上面是判断响应正文中一个字符串,那么我们要写多个判断,怎么写呢。
/** * 测试 equalTo()方法 */ @Test public void testEqualToMethod() { given(). get("http://jsonplaceholder.typicode.com/posts/3"). then(). body("id", equalTo(3), "title", equalTo("ea molestias quasi exercitationem repellat qui ipsa sit aut")); }
多个条件进行判断,可以在同一个body()中写,用逗号隔开多个判断,具体断言方法可以去看看hamcrest这个工具,常见还有hasItem()这个,OneOf, AllOf()等。
还有这种写法,一个body().body()这个串下去,多个body()之间用and()串起来。
/** * 测试 equalTo()方法 */ @Test public void testEqualToMethod() { given(). get("http://jsonplaceholder.typicode.com/posts/3"). then(). body("id", equalTo(3)).and().body("title", equalTo("ea molestias quasi exercitationem repellat qui ipsa sit aut")); }
上面第二个条件字符串太长,我这里用hasItem()来测试下。
/** * 测试 equalTo()方法 */ @Test public void testEqualToMethod() { given(). get("http://jsonplaceholder.typicode.com/posts/3"). then(). body("id", equalTo(3)).and().body("title", hasItem("exercitationem repellat")); }
针对同一个key,我们不能使用hasItems()这个正则匹配,会出问题,上面是hasItem只匹配一个结果,hasItem是指定一个路径节点下,匹配多个value。下面一个key匹配多个value是运行失败的。
/** * 测试 equalTo()方法 */ @Test public void testEqualToMethod() { given(). get("http://jsonplaceholder.typicode.com/posts/3"). then(). body("id", equalTo(3)).and().body("title", hasItems("exercitationem", "repellat", "sit aut")); }
如果title有多个value,可以这么使用,例如
{ { "userId": 1, "id": 3, "title": "value1", "body": "et iusto sed quo iure\nvoluptatem occaecati omnis "},{ "userId": 1, "id": 3, "title": "value2", "body": "et iusto sed quo iure\nvoluptatem occaecati omnis "},{ "userId": 1, "id": 3, "title": "value3", "body": "et iusto sed quo iure\nvoluptatem occaecati omnis "}}
就可以使用body("title", hasItems("value1", "value2", "value3"))
通过这两个例子,我们感受到了,如果要写好断言操作,学会hamcrest的常用正则匹配的方法的使用是十分有必要的。
转载地址:http://vjows.baihongyu.com/