休息前

通过参考资料开始使用Spring 5和Spring Boot 2学习春天课程:

>>查看课程
杰克逊前

通过。开始使用Spring 5和Spring Boot 2学习春天课程:

>>查看课程

1.介绍

旨在简化休息API的测试和验证休息,并受到动态语言(如Ruby和Groovy)的测试技术受到高度影响。

这个库对HTTP有坚实的支持,当然从动词和标准HTTP操作开始,但也远不止这些基础。

在本指南中,我们将会探索休息我们将使用Hamcrest来做断言。如果你还不熟悉Hamcrest,你应该先温习一下教程:用哈克斯特测试

此外,要了解更多高级使用情况,金宝搏官网188be请休息,查看我们的其他文章:

现在让我们潜入一个简单的例子。

2.简单的示例测试

在我们开始之前,让我们确保我们的测试有以下静态导入:

io.restassured.RestAssured。* io.restassured.matcher.RestAssuredMatchers。* org.hamcrest.Matchers。*

我们需要它可以简单地保持测试,并且可以轻松访问主API。

现在,让我们开始使用简单的示例 - 一个基本的投注系统,暴露游戏的一些数据:

{“ID”:“390”,“数据”:{“LeagueID”:35,“Hometeam”:“挪威”,“VisitingTeam”:“英格兰”,},“赔率”:[{“价格”:“1.30“,”名称“:”1“},{”价格“:”5.25“,”名称“:”X“}”}

假设这是命中本地部署的API -的JSON响应http://localhost: 8080 /事件? id = 390。:

现在让我们休息用来验证响应JSON的一些有趣功能:

@Test public void givenUrl_whenSuccessOnGetsResponseAndJsonHasRequiredKV_thenCorrect() {get("/事件?id=390").then(). statuscode (200).assert (). body("data. "leagueId”,等于(35));}

所以,我们在这里做了什么 - 我们验证了对终点的调用/事件?ID = 390响应包含a的身体JSON字符串谁的leagueId数据对象是35。

让我们看一个更有趣的例子。假设你想验证赔率array有价格记录1.305.25:

@Test public void givenUrl_whenJsonResponseHasArrayWithGivenValuesUnderKey_thenCorrect() {get("/事件?id=390").then().assert (). body("赔率。价格”,hasItems(“1.30”、“5.25”));}

3.休息保证设置

如果您最喜欢的依赖工具是Maven,则会添加以下依赖项pom.xml文件:

<依赖项>  io.rest-sleared  休息 - 放心  3.3.0   test  

要获得最新版本,请跟随这个链接
休息保证利用HAMCRETT匹配者执行其断言的力量,因此我们也必须包括该依赖性:

<依赖项>  org.hamcrest   HAMCRETT-ALL   2.1  

最新版本将始终可用这个链接

4.匿名JSON根验证

考虑一个由原语而不是对象组成的数组:

(1、2、3)

这称为匿名JSON根,这意味着它没有键值对,但仍然是有效的JSON数据。

在这样的场景中,我们可以使用美元符号或空字符串(" ")作为路径。假设我们公开了上面的服务http://localhost:8080/json然后我们可以用休息验证的方式验证它:

当(). get (" / json "),然后()。身体("$", hasItems(1, 2, 3));

或者喜欢这个:

当(). get (" / json "),然后()。身体("", hasItems(1, 2, 3));

5.浮点数和双精度数

当我们开始使用休息才能测试我们的REST服务时,我们需要了解JSON响应中的浮点数映射到原始类型漂浮。

指某东西的用途漂浮类型不可互换双倍的正如Java中许多方案的情况一样。

在点的情况是此响应:

{“奇怪”:{“价格”:“1.30”,“ck”:12.2,“名字”:" 1 "}}

假设我们正在运行以下测试值ck:

得到(“/奇数”)。然后()。assertthat()。身体(“奇数,”奇数,等于(12.2));

即使我们正在测试的值等于响应中的值,此测试也会失败。这是因为我们与a相比双倍的而不是一个漂浮

要使它工作,我们必须显式地指定操作数等于匹配方法作为一个漂浮,如下所示:

得到(“/奇数”)。然后()。assertthat()。身体(“奇数.ck”,等于(12.2f));

6.指定请求方法

通常,我们将通过调用诸如的方法来执行请求得到(),对应于我们想要使用的请求方法。

此外,属性还可以指定HTTP谓词请求()方法:

@test public vod whileRequestget_thenok(){何时()。请求(“get”,“/users/eugenp").then()()().S.StatusCode(200);}

上面的例子等同于使用得到()直接地。

同样,我们可以发送,连接选项要求:

@test公共void whenRequestHead_thenok(){何时()。请求(“head”,“/users/eugenp").then()()()ratuscode(200);}

帖子请求还遵循类似的语法,我们可以指定身体通过使用和()身体()方法。

因此,要创建一个新的奇怪的通过发送A.帖子要求:

@test公共void whenrequestedpost_thencreated(){with()。身体(新奇数(5.25f,1,13.1f,“x”)).wher().request(“帖子”,“/ odds / new”)。然后().statuscode(201);}

奇怪的物体发送为身体将自动转换为JSON。我们也可以通过任何字符串我们想把它作为我们的帖子身体。

7.默认值配置

我们可以为测试配置大量默认值:

@Before public void setup(){RESTASSURED.BASEURI =“https://api.github.com”;RESEASICURED.PORT = 443;}

在这里,我们为我们的请求设置基本URI和端口。除此之外,我们还可以配置基础路径,root pat和身份验证。

注意:我们也可以通过以下方式重置为标准的REST-assured默认值:

RestAssured.reset ();

8.测量响应时间

我们来看看怎么做度量响应时间时间()timein()方法的方法回复对象:

@test public void whenmeasurereponseTime_thenok(){response response = RestAseSured.get(“/用户/ eugenp”);长时间=响应.Time();长时间=响应.Timein(TimeUnit.Seconds);assertequals(时滞,时间inms / 1000);}

注意:

  • 时间()用于获得响应时间以毫秒为单位
  • timein()是用来获得在指定的时间单位的响应时间

8.1。验证响应时间

我们还可以验证响应时间 - 以毫秒为单位 - 在简单的帮助下匹配:

@test公共void whenvalidatereSponseTime_thensccess(){何时()。获取(“/用户/ eugenp”)。然后()。时间(LISHOTHAN(5000L));}

如果我们想在不同的时间单位验证响应时间,那么我们将使用时间()匹配有一秒钟TimeUnit范围:

@Test公共void whenvalidatereSponseTimeInseConds_thensucess(){何时()。获取(“/用户/ eugenp”)。然后()。时间(lessthan(5l),timeUnit.seconds);}

9. XML响应验证

它不仅可以验证JSON响应,还可以验证XML。

让我们假设我们向http://localhost:8080/employees我们得到如下响应:

  Jane Daisy f  

我们可以证明直呼其名的喜欢:

@test public void redurl_whenxmlresponsevaluetestsequal_thencorrect(){post(“/ employees”)。然后()。sharertthat().body(“员工.Employee.first-name”,等于(“简”);}

我们还可以通过将身体匹配器在一起的方式验证所有值与我们的预期值相匹配:

@test public void geturl_whenmultiplexmlvaluestesteStequal_thencorrect(){post(“/雇员”)。然后()。sharertthat().body(“员工.Employee.first-name”,等于(“简”).body(“员工.Employee.last-name“,等于(”菊花“)).body(”employees.employee.sex“,等于(”f“));}

或者使用带有变量参数的简写版本:

@test public void geturl_whenmultiplexmlvaluestesteStequalinshorthand_thencorrect(){post(“/雇员”).then()。sharertthat()。body(“雇员。”,等于(“简”),“员工.Employee.last-名称“,等于(”菊花“),”employees.employee.sex“,等于(”f“));}

10. XPAT for XML

我们还可以使用XPath验证我们的回复。考虑下面的示例,该示例在直呼其名的:

@Test public void givenurl_whenvalidatesxmlusingxpath_thcorrect () {post("/employees").then(). assertthat()。身体(hasXPath(" /员工/员工/名字”,containsString(“Ja”)));}

XPath还接受替代运行的方式等于匹配:

@Test public void givenUrl_whenValidatesXmlUsingXpath2_thenCorrect() {post("/employees").then().assert () .body(hasXPath("/employees/employee/first-name[text()='Jane']"));}

11.记录测试详细信息

11.1。日志请求详细信息

首先,让我们看看如何使用。记录整个请求详细信息log()。所有():

@test公共空白whonlogrequest_thenok(){给定()。log()。all().when()。get()。get()。stationcode(200); statuscode(200);}

这将像这样记录:

Request方法:GET Request URI: https://api.github.com:443/users/eugenp Proxy:  Request params:  Query params:  Form params:  Path params:  Multiparts:  Headers: Accept=*/* Cookies:  Body: 

为了只记录请求的特定部分,我们使用日志()结合方法参数(),(),标题(),饼干(),()方法(),路径.params日志。()()。

注意,使用的其他库或过滤器可能会改变实际发送到服务器的内容,所以这应该只用于记录初始请求规范。

11.2。日志响应详细信息

类似地,我们可以记录响应细节。

在下面的例子中,我们只记录响应体:

@Test公共void whonlogresponse_thenok(){何时()。get(“/ repos / eugenp / tutorials”).then()。log()。body()。statuscode(200);}

样例输出:

{“ID”:9754983,“名称”:“教程”,“full_name”:“eugenp / tutorials”,“private”:false,“html_url”:false,“html_url”:“https:/github.com/eugenp/tutorials”,描述“:”:“\”休息,带有Spring \“课程:”,“fork”:false,“size”:72371,“许可证”:{“键”:“MIT”,“名称”:“MIT许可证”,“spdx_id”:“mit”,“url”:“https://api.github.com/licenses/mit”},...}

11.3。如果发生条件,则日志响应

我们还可以选择只在发生错误或状态码匹配给定值时记录响应:

@Test公共void whonlogresponseiferroroccurred_thensccess(){何时()。get()。get()。()。log()。iferror();什么时候()。get(“/ users / eugenp”).then()。log()。ifstatuscodeisequalto(500);什么时候()。get(“/ users / eugenp”).then()。log()。ifstatuscodematches(gryalthan(200));}

11.4。日志如果验证失败

只有当我们的验证失败时,我们才能记录请求和响应:

@Test公共void whenlogonlyifvalidationfailed_thensccess(){何时()。get()。get().then()。log()。log()。IfValidationFails()。statuscode(200);给定()。log()。ifvalidationfails().wher()。get(“/ users / eugenp”).then()。statuscode(200);}

在此示例中,我们希望验证状态代码为200.仅当此失败时,才会记录请求和响应。

12.结论

在本教程中,我们有探索了休息保证的框架并寻找最重要的功能,我们可以用来测试我们的恢复服务并验证他们的回复。

所有这些示例和代码片段的完整实现可以在休息保证中找到GitHub项目

休息下

通过。开始使用Spring 5和Spring Boot 2学习春天课程 :

>>查看课程
杰克逊底部

通过。开始使用Spring 5和Spring Boot 2学习春天课程:

>>查看课程
评论在本文上关闭!