博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RestAssured接口自动化从入门到框架搭建-4-RestAssured基本功能1-打印响应内容和body解析
阅读量:4302 次
发布时间:2019-05-27

本文共 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/

你可能感兴趣的文章
MFC 定时器用法 SetTimer、KillTimer
查看>>
WaitForSingleObject的详细用法
查看>>
线程中CreateEvent和SetEvent及WaitForSingleObject的用法
查看>>
MFC消息详解 (WindowProc|OnCommand|OnNotify)
查看>>
windows消息机制(MFC)
查看>>
测试—自定义消息处理
查看>>
MFC中关于虚函数的一些问题
查看>>
MFC多线程各种线程用法 .
查看>>
MFC GDI绘图基础
查看>>
VS2010/MFC编程入门之五十(图形图像:GDI对象之画笔CPen)
查看>>
MFC通过对话框窗口句柄获得对话框对象指针
查看>>
MFC获得主窗口和父窗口指针
查看>>
MFC设置主界面背景图片、设置子窗体背景图片
查看>>
MFC——在视图窗口加载背景图片
查看>>
CreateMutex、WaitForSingleObject、ReleaseMutex——创建互斥对象
查看>>
关于Visual Studio "当前不会命中断点.还没有为该文档加载任何符号"的解决方法
查看>>
CImage与OpenCV兼容问题
查看>>
在vc或mfc中显示IplImage的方法
查看>>
VC6.0下opencv1.0的环境配置
查看>>
MFC程序提示 0xC0000005: 读取位置 0x00000020 时发生访问冲突。
查看>>