前言
不知道大家的項(xiàng)目是否都有對(duì)接口API進(jìn)行自動(dòng)化測(cè)試,反正像我們這種小公司是沒(méi)有的。由于最近一直被吐槽項(xiàng)目質(zhì)量糟糕,只能研發(fā)自己看看有什么接口測(cè)試方案。那么在本文中,我將探索如何使用 Rest Assured
自動(dòng)化 API 測(cè)試,Rest Assured
是一個(gè)基于 Java 的流行的用于測(cè)試 RESTful API
的庫(kù)。
什么是Rest Assured?
Rest Assured
是一個(gè)基于 Java 的開(kāi)源庫(kù),主要用于測(cè)試RESTful API
。它為編寫(xiě)測(cè)試用例提供了一種簡(jiǎn)單直觀的 DSL(領(lǐng)域特定語(yǔ)言),這使得開(kāi)發(fā)人員可以輕松編寫(xiě)和維護(hù)自動(dòng)化測(cè)試。Rest Assured
支持 GET
、POST
、PUT
、DELETE
、PATCH
等各種 HTTP 方法,并且可以輕松與流行的測(cè)試框架(如 TestNG
和 JUnit
)集成。
github地址 :https://github.com/rest-assured/rest-assured
安裝Rest Assured
在maven中引入相關(guān)依賴
<dependency>
<groupId>io.rest-assured<span class="hljs-name"groupId>
<artifactId>rest-assured<span class="hljs-name"artifactId>
<version>5.3.0<span class="hljs-name"version>
<scope>test<span class="hljs-name"scope>
<span class="hljs-name"dependency>
Rest Assured結(jié)構(gòu)
Rest Assured
代碼的整體結(jié)構(gòu)分為 3 個(gè)主要部分:
- Given
Given
是 API 測(cè)試的先決條件,可以在其中設(shè)置測(cè)試所需的一切,例如URL、請(qǐng)求頭或參數(shù),或任何需要滿足的先決條件。- 可以在“
Given
”中設(shè)置的內(nèi)容:URL、請(qǐng)求頭、請(qǐng)求參數(shù)和請(qǐng)求正文。
- When
When
是實(shí)際向服務(wù)器發(fā)送 HTTP 請(qǐng)求并獲得響應(yīng)的時(shí)間??梢栽?code>When中定義請(qǐng)求方法,如GET
、POST
、PUT
等。
- Then
Then
是您檢查從服務(wù)器獲得的響應(yīng)并確保它符合您的預(yù)期的地方。在這您可以檢查狀態(tài)代碼、響應(yīng)正文、標(biāo)頭或任何其他對(duì)您的測(cè)試很重要的內(nèi)容。
Show Me Code
我們現(xiàn)在通過(guò)一個(gè)例子來(lái)演示下如何使用Rest Assured
,首先我們看下postman
的例子:
- 請(qǐng)求參數(shù)
- 請(qǐng)求頭
- 請(qǐng)求體
現(xiàn)在我們用Rest Assured
這個(gè)框架來(lái)測(cè)試下上面postman的這個(gè)接口。
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();
}
}
- 首先我們?cè)?code>given() 中設(shè)置前置條件
given().baseUri("http://127.0.0.1:8000")
.queryParam("version", "1.0")
.header("Authorization", "yourauthhere")
.header("Signature", "yoursignaturehere")
.body(jsonBody)
- 然后在
when()
中定義請(qǐng)求方法,本例中為POST
.when().post("/getuserdata/")
- 然后我們從我們的請(qǐng)求中斷言狀態(tài)代碼、標(biāo)頭、正文和響應(yīng)時(shí)間
.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();
如何提取響應(yīng)體?
例如,這將是我們對(duì)之前請(qǐng)求的回應(yīng):
{
"name": "alvin",
"role": "SDET"
}
以下是我們?nèi)绾翁崛∵@些數(shù)據(jù):
JsonPath responseBody = response.jsonPath();
String fullName = responseBody.getString("name");
String role = responseBody.getString("role");
統(tǒng)一抽象封裝
在大多數(shù)情況下,需要測(cè)試許多 API,但前提條件相同,例如 BaseURL、參數(shù)和請(qǐng)求頭等,為了消除代碼中的冗余,我們可以統(tǒng)一抽象封裝一個(gè) RequestSpecification
類作為我們的規(guī)范構(gòu)建器,并在我們的其他測(cè)試中重用它,如下所示:
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");
}
}
現(xiàn)在,您可以在具有相同前提條件的任何其他需要的測(cè)試中重用 requestSpecification()
方法。查看與我們之前代碼的區(qū)別:
// 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/")
通過(guò)使用 given().spec()
,我們的代碼現(xiàn)在變得簡(jiǎn)單多了。
-
JAVA
+關(guān)注
關(guān)注
19文章
2967瀏覽量
104763 -
API
+關(guān)注
關(guān)注
2文章
1501瀏覽量
62033 -
自動(dòng)化
+關(guān)注
關(guān)注
29文章
5581瀏覽量
79284
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論