合肥做网站设计,简历wordpress,如何做网站软件,wordpress总访问不了1 . 初识 REST Assured
在 REST Assured 的官方 GitHub 上有这样一句简短的描述#xff1a; Java DSL for easy testing of REST services 简约的 REST 服务测试 Java DSL
1.1 优点#xff1a;
REST Assured 官方的 README 第一句话对进行了一个优点的概述#xff0c;总的… 1 . 初识 REST Assured
在 REST Assured 的官方 GitHub 上有这样一句简短的描述 Java DSL for easy testing of REST services 简约的 REST 服务测试 Java DSL
1.1 优点
REST Assured 官方的 README 第一句话对进行了一个优点的概述总的意思表达的就是简单好用。那么 REST Assured 有哪些优点又该如何使用呢 用 Java 做接口自动化测试首选 REST Assured具体原因如下
开源
简约的接口测试 DSL
支持 xml json 的结构化解析
支持 xpath jsonpath gpath 等多种解析方式
对 spring 的支持比较全面
功能很齐全部分我自己也还没有具体用到了解到了方向需要时随时查找学习
2. 如何使用
添加 maven 依赖
dependencygroupIdio.rest-assured/groupIdartifactIdrest-assured/artifactIdversion4.0.0/versionscopetest/scope
/dependency2.1 基本三步曲
我们对接口进行测试一般由三步曲传参、发请求、响应结果断言REST Assured给我们提供了清晰的三步曲以given、when、then的结构来实现基本写法如下
//使用参数
given().param(key1, value1).param(key2, value2).
when().post(/somewhere).
then().body(containsString(OK))//使用X-Path (XML only)
given().params(firstName, John, lastName, Doe).
when().post(/greetMe).
then().body(hasXPath(/greeting/firstName[text()John]))2.2 分步拆解
前提现有一个post请求的登录接口。
http://47.103.xxx.133/auth/oauth/token
请求体body如下
{password: elcrD28ZSLLtR0VLs/jERA\u003d\u003d\n,grant_type: password,scope: server,userType: 1,username: xxx
}Request Header 如下
Headers: AuthorizationBasic c3lzdGVtxxxRlbQHost47.103.xxx.133Accept*/*Content-Typeapplication/json; charsetISO-8859-1分步拆解一
Givern
我们发送请求经常需要带有参数使用 given() 就可以实现当时当我们使用 given() 的时候发现其中有很多传参方法如下 没错在传参的方法中包含了 param、pathParam、queryParam 和 formParam下面来研究下这几个传参方法的区别
param
通常我们都会使用 given().param 方法来传参REST Assured 会根据 HTTP 方法自动尝试确定哪种参数类型即查询或表单参数如果是 GET则查询参数将自动使用如果使用 POST则将使用表单参数
queryParam 和 formParam
有时候在 PUT 或 POST 请求中需要区分查询参数和表单参数时就需要使用queryParam 和 formParam 方法了具体写法如下
given().formParam(formParamName, value1).queryParam(queryParamName, value2).
when().post(/something)pathParam
使用given时指定请求路径的参数这个方法很少用到或者说我本人几乎没用到过(可能我的修行还不够踩坑还太少~)具体写法如下
given().pathParam(OAuth, oauth).pathParam(accessToken, token).
when(). post(/auth/{OAuth}/{accessToken}).
then()...header/headers
经常还需要在请求头中带入参数这个时候就可以使用header或headers方法写法如下
given().header(Authorization,Basic c3lzdGVtOxxxbQ).header(Host,47.xxx.xxx.133)或者用headers将多个参数写在一起
given().headers(Authorization,Basic c3lzdGVtxxx3RlbQ,Host,47.xxx.xxx.133)cookie
有时候需要在请求中带入cookierestassured提供了cookie方法来实现
given().cookie(c_a,aaaaaa).cookie(c_b,bbbbbb). ..contentType
经常还会设置contentType最常见的就是application/json了写法如下
given().contentType(application/json). ..
//或者
given().contentType(ContentType.JSON). ..body
在POST, PUT 或 DELETE请求中我们经常还需要带上请求体body写法如下
given().body({\n \t\password\: \elcrD28xxxR0VLs/jERA\\u003d\\u003d\\n\,\n \t\grant_type\: \password\,\n \t\scope\: \server\,\n \t\userType\: 1,\n \t\username\: \xxx\\n })也可以用request更为明确的指出是请求body
given().request().body({\n \t\password\: \elcrD28xxxR0VLs/jERA\\u003d\\u003d\\n\,\n \t\grant_type\: \password\,\n \t\scope\: \server\,\n \t\userType\: 1,\n \t\username\: \xxx\\n })没有参数
如果我们没有参数需要传递也可以省略掉given()
get(/lotto).then().assertThat().body(lotto.lottoId, equalTo(5));proxy
有时候我们需要进行接口的调试抓包是最常用的一种方式rest-assured 提供了 proxy 方法可以设置代理写法如下
given().proxy(127.0.0.1,8888). ..实际运行结果 分步拆解二
When
when主要用来触发请求在when后面接着请求URL
given().when().post(http://47.103.xxx.133/auth/oauth/token). ..前面在 given 中我们设置了很多请求参数在 when 中也可以设置只不过要注意的是在请求之前设置这也比较好理解如果再请求之后的话参数都设置怎么发请求呢 given().when().contentType(ContentType.JSON).headers(Authorization,Basic c3lzxxx3RlbQ,Host,47.xxx.xxx.133).request().body({\n \t\password\: \elcrD28ZSLLtR0VLs/jERA\\u003d\\u003d\\n\,\n \t\grant_type\: \password\,\n \t\scope\: \server\,\n \t\userType\: 1,\n \t\username\: \qinzhen\\n }).post(http://47.xxx.xxx.133/auth/oauth/token). ..分步拆解三
Then
then后面可以跟断言也可以获取响应值
断言-then().body()
then().body() 可以对响应结果进行断言在 body 中写入断言
.. post(http://47.xxx.xxx.133/auth/oauth/token).then().statusCode(200).body(code,equalTo(1));其中statusCode(200)是对状态码的断言判断状态码是否为200 body(“code”,equalTo(1))是对返回体中的 code 进行断言要求返回 code值为1 。
注这里的equalTo使用的是hamcrest断言不了解的小伙伴可参考另外一篇文章Junit原生断言和hamcrest断言的区别及使用
实操演示
我们将上述的 given、when、then 结合起来看一下实际运行效果这里在运行之前再提一个功能我们可以在 when 和 then 后面加上.log().all()这样在运行过程中就可以把请求和响应的信息都打印出来 获取响应-then().extract().body().path(“code”)
我们可以在 then 后面利用 .extract().body() 来获取我们想要 body 的返回值它们也可以直接接在断言后面写法如下
注意这里的body() 不要和请求体body()以及断言的body()混淆了
.. .then().log().all().statusCode(200).body(code,equalTo(1)).extract().body().path(code);实操演示
演示前再来看一个新的功能上面我们再写请求体 body 时时这样的
body({\n \t\password\: \elcrD28ZxxxVLs/jERA\\u003d\\u003d\\n\,\n \t\grant_type\: \password\,\n \t\scope\: \server\,\n \t\userType\: 1,\n \t\username\: \qinzhen\\n })看起来有点丑改造一下rest-assured 为我们提供了一个利用 HashMap 来创建json 文件的方法先把要传的字段放入 hashmap 中然后用 contentType 指明JSON 就可以了具体写法如下
HashMap map new HashMap();
map.put(password,elcrD28ZSLLtR0VLs/jERA\u003d\u003d\n);
map.put(grant_type,password);
map.put(scope,server);
map.put(userType,1);
map.put(username,xxx);
given().headers(Authorization,Basic c3lzdGVtxxxlbQ,Host,47.xxx.xxx.133).contentType(JSON).body(map). ..现在进行完整的请求获取返回值 code 并打印
HashMap map new HashMap();
map.put(password,elcrD28ZSLLtR0VLs/jERA\u003d\u003d\n);
map.put(grant_type,password);
map.put(scope,server);
map.put(userType,1);
map.put(username,xxx);
Integer code
given().headers(Authorization,Basic c3lzdGVtxxxlbQ,Host,47.xxx.xxx.133).contentType(JSON).body(map).
when().log().all().post(http://47.xxx.xxx.133/auth/oauth/token).
then().log().all().statusCode(200).body(code,equalTo(1)).extract().body().path(code);
System.out.println(返回code的值是code);运行结果 推荐学习
关于REST Assured这里仅仅算是初步认识。认识它的语法结构和功能对于更多丰富的用法还需要慢慢探索研究特别是断言的部分是测试工程师最常用最终要的功能之一。REST Assured提供的完整断言手段在后续文章中我们一起探讨。
最后感谢每一个认真阅读我文章的人礼尚往来总是要有的虽然不是什么很值钱的东西如果你用得到的话可以直接拿走 这些资料对于【软件测试】的朋友来说应该是最全面最完整的备战仓库这个仓库也陪伴上万个测试工程师们走过最艰难的路程希望也能帮助到你