RestAssured接口自动化从入门到框架搭建-4-RestAssured基本功能1-打印响应内容和body解析

       前面文章,让我们稍微对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 OK
Date: Sat, 20 Jul 2019 02:55:39 GMT
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Set-Cookie: __cfduid=df32505fc01884b6740e3b87aec5d54091563591339; expires=Sun, 19-Jul-20 02:55:39 GMT; path=/; domain=.typicode.com; HttpOnly
X-Powered-By: Express
Vary: Origin, Accept-Encoding
Access-Control-Allow-Credentials: true
Cache-Control: public, max-age=14400
Pragma: no-cache
Expires: Sat, 20 Jul 2019 06:55:39 GMT
X-Content-Type-Options: nosniff
Etag: W/"11b-USacuIw5a/iXAGdNKBvqr/TbMTc"
Via: 1.1 vegur
CF-Cache-Status: HIT
Age: 158
Server: cloudflare
CF-RAY: 4f91a850bb0da2c4-HKG
Content-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.3
PASSED: testEqualToMethod

上面这个body方法是ResponseSpecificationImpl类中的方法,而且有多个重载的body方法,都是用来判断Body中规则匹配。

具体api文档可以看这里:https://www.javadoc.io/doc/io.rest-assured/rest-assured/4.0.0

点击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的常用正则匹配的方法的使用是十分有必要的。

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
TestNG 是一种流行的测试框架,它提供了丰富的功能来进行单元测试、集成测试和端到端测试。TestNG 结合 TestAssured 可以进行接口自动化测试,以下是 TestNG TestAssured 接口自动化测试框架的优点: 1. 简单易用:TestNG TestAssured 框架易于学习和使用。TestNG 的注解可以方便地对测试用例进行分组、依赖、优先级等操作,而 TestAssured 提供了直观的 API,可以轻松地完成接口测试。 2. 支持多种验证方式:TestAssured 提供了多种验证方式,如 body、header、cookie、statusCode、responseTime 等,可以全面地验证接口的正确性。 3. 支持数据驱动:TestNG TestAssured 框架可以通过数据驱动的方式进行接口测试,可以通过 Excel、CSV、JSON 等数据源进行参数化测试,提高了测试效率和覆盖率。 4. 支持并发测试:TestNG TestAssured 框架支持并发测试,可以提高测试效率。可以通过 TestNG 的 parallel 属性来设置并发线程数,也可以通过 TestAssuredRestAssured.config() 方法来设置并发连接数。 5. 集成度高:TestNG TestAssured 框架可以与其他测试工具和框架集成,如 Maven、Jenkins、ExtentReports 等,可以方便地进行持续集成和测试报告生成。 总之,TestNG TestAssured 接口自动化测试框架具有易用性高、多种验证方式、数据驱动、并发测试、集成度高等优点,是进行接口自动化测试的不二选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值