前言
不知道大家的项目是否都有对接口API进行自动化测试,反正像我们这种小公司是没有的。由于最近一直被吐槽项目质量糟糕,只能研发自己看看有什么接口测试方案。那么在本文中,我将探索如何使用 Rest Assured
自动化 API 测试,Rest Assured
是一个基于 Java 的流行的用于测试 RESTful API
的库。
什么是Rest Assured
Rest Assured
是一个基于 Java 的开源库,主要用于测试 RESTful API
。它为编写测试用例提供了一种简单直观的 DSL(领域特定语言),这使得开发人员可以轻松编写和维护自动化测试。Rest Assured
支持 GET
、POST
、PUT
、DELETE
、PATCH
等各种 HTTP 方法,并且可以轻松与流行的测试框架(如 TestNG
和 JUnit
)集成。
github地址:https://github.com/rest-assured/rest-assured
安装Rest Assured
在maven中引入相关依赖
1 2 3 4 5 6 | < dependency > < groupId >io.rest-assured</ groupId > < artifactId >rest-assured</ artifactId > < version >5.3.0</ version > < scope >test</ scope > </ dependency > |
Rest Assured结构
Rest Assured
代码的整体结构分为 3 个主要部分:
1.Given
Given
是 API 测试的先决条件,可以在其中设置测试所需的一切,例如URL、请求头或参数,或任何需要满足的先决条件。- 可以在“
Given
”中设置的内容:URL、请求头、请求参数和请求正文。
2.When
When
是实际向服务器发送 HTTP 请求并获得响应的时间。可以在When
中定义请求方法,如 GET
、POST
、PUT
等。
3.Then
Then
是您检查从服务器获得的响应并确保它符合您的预期的地方。在这您可以检查状态代码、响应正文、标头或任何其他对您的测试很重要的内容。
Show Me Code
我们现在通过一个例子来演示下如何使用Rest Assured
,首先我们看下postman
的例子:
1.请求参数
2.请求头
3.请求体
现在我们用Rest Assured
这个框架来测试下上面postman的这个接口。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | import io.restassured.builder.RequestSpecBuilder; import io.restassured.response.Response; import io.restassured.specification.RequestSpecification; import org.testng.annotations.Test; import static io.restassured.RestAssured.given; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.lessThan; public class TestRestAssured { @Test public void testMyApi() { String jsonBody = "{" email ":" dhadiprasetyo @gmail .com "," uid ":" Jzr0sOORprar10kay6CweZ5FNYP2 "}" ; Response response = given().baseUri( "http://127.0.0.1:8000" ) .queryParam( "version" , "1.0" ) .header( "Authorization" , "yourauthhere" ) .header( "Signature" , "yoursignaturehere" ) .body(jsonBody) .when().post( "/getuserdata/" ) .then().assertThat().statusCode( 200 ) .header( "Content-Type" , "application/json" ) .header( "Cache-Control" , "max-age=3600" ) .body( "name" , equalTo( "Darmawan Hadiprasetyo" )) .time(lessThan(5000L)) .extract().response(); } } |
1.首先我们在 given()
中设置前置条件
1 2 3 4 5 | given().baseUri( "http://127.0.0.1:8000" ) .queryParam( "version" , "1.0" ) .header( "Authorization" , "yourauthhere" ) .header( "Signature" , "yoursignaturehere" ) .body(jsonBody) |
2.然后在when()
中定义请求方法,本例中为POST
1 | .when().post( "/getuserdata/" ) |
3.然后我们从我们的请求中断言状态代码、标头、正文和响应时间
1 2 3 4 5 6 | .then().assertThat().statusCode( 200 ) .header( "Content-Type" , "application/json" ) .header( "Cache-Control" , "max-age=3600" ) .body( "name" , equalTo( "Darmawan Hadiprasetyo" )) .time(lessThan(5000L)) .extract().response(); |
如何提取响应体?
例如,这将是我们对之前请求的回应:
1 2 3 4 | { "name" : "alvin" , "role" : "SDET" } |
以下是我们如何提取这些数据:
1 2 3 | JsonPath responseBody = response.jsonPath(); String fullName = responseBody.getString( "name" ); String role = responseBody.getString( "role" ); |
统一抽象封装
在大多数情况下,需要测试许多 API,但前提条件相同,例如 BaseURL、参数和请求头等,为了消除代码中的冗余,我们可以统一抽象封装一个 RequestSpecification
类作为我们的规范构建器,并在我们的其他测试中重用它,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | import io.restassured.builder.RequestSpecBuilder; import io.restassured.path.json.JsonPath; import io.restassured.response.Response; import io.restassured.specification.RequestSpecification; import org.testng.annotations.Test; import static io.restassured.RestAssured.given; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.lessThan; public class TestRestAssured { public static RequestSpecification requestSpecification() { return new RequestSpecBuilder().setBaseUri( "http://127.0.0.1:8000" ) .addQueryParam( "version" , "1.0" ) .addHeader( "Authorization" , "yourauthhere" ) .addHeader( "Signature" , "yoursignaturehere" ) .build(); } @Test public void testMyApi() { String jsonBody = "{" email ":" dhadiprasetyo @gmail .com "," uid ":" Jzr0sOORprar10kay6CweZ5FNYP2 "}" ; Response response = given().spec(requestSpecification()) .body(jsonBody) .when().post( "/getuserdata/" ) .then().assertThat().statusCode( 200 ) .header( "Content-Type" , "application/json" ) .header( "Cache-Control" , "max-age=3600" ) .body( "name" , equalTo( "Darmawan Hadiprasetyo" )) .time(lessThan(5000L)) .extract().response(); JsonPath responseBody = response.jsonPath(); String fullName = responseBody.getString( "name" ); String linkedIn = responseBody.getString( "linkedin" ); String role = responseBody.getString( "role" ); } } |
现在,您可以在具有相同前提条件的任何其他需要的测试中重用 requestSpecification()
方法。查看与我们之前代码的区别:
1 2 3 4 5 6 7 8 9 10 11 12 | // previous Response response = given().baseUri( "http://127.0.0.1:8000" ) .queryParam( "version" , "1.0" ) .header( "Authorization" , "yourauthhere" ) .header( "Signature" , "yoursignaturehere" ) .body(jsonBody) .when().post( "/getuserdata/" ) // then Response response = given().spec(requestSpecification()) .body(jsonBody) .when().post( "/getuserdata/" ) |
通过使用 given().spec()
,我们的代码现在变得简单多了。
现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】