使用REST Assured測驗驗證REST服務
建立和維護API與其他應用程式非常相似,建立它可能是最容易的部分,但是,當架構完成時,你的工作還沒有完成,接下來,需要測試API以確保其按預期執行。
使用哪些工具進行測試或一系列測試?即使你沒有預先設計API,也可能需要測試API,REST Assured是一個API測試框架。
REST Assured是一種特定於Java 領域的語言,它簡化了在HTTP Builder之上構建的測試和驗證REST服務的過程,REST Assured支援多種請求格式的驗證,並且具有非常直觀的語法,使其易於學習。
當公司不斷通過RESTful API提供服務時,API測試在開發中變得越來越重要,但是API測試具有挑戰性,又必須正確完成,API中幾乎沒有存在錯誤的餘地,它們會一直處於啟動狀態,具有合理的響應時間,並有效地處理負載。
想象一下Google Maps API如果發生故障。我們每天使用的許多服務都會受到影響,因為它們的核心功能都需要Google地圖,對於Uber,Lyft和Airbnb來說,谷歌地圖至關重要。
在下面的示例中,我們將探索REST Assured並確切瞭解如何在API測試中使用它。
構建
有幾種方法可以實現REST Assured設定,這使得在任何專案中都可以輕鬆使用該框架。
Gradle使用者需要新增以下行:
testCompile 'io.rest-assured:rest-assured:3.1.0'
Maven使用者,使用:
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<version>3.1.0</version>
<scope>test</scope>
</dependency>
請注意,上述方式會包括XmlPath和JsonPath。
在下面的示例中,我們將僅使用JSON,儘管Rest Assured也支援XML。
讓我們測試一些API
設定完成後,讓我們為Spotify API建立一個Java測試類,但不提供令牌。此請求會因返回401 狀態程式碼而失敗,因為Spotify API需要令牌,正如所料,REST Assured將通過使用斷言比較預期結果和API實際查詢的結果來驗證我們的查詢。
import io.restassured.RestAssured;
import io.restassured.response.Response;
import org.testng.Assert;
public class RestTest {
static String link = "https://api.spotify.com/v1/artists/1vCWHaC5f2uS3yhpwWbIA6/albums?album_type=SINGLE&offset=20&limit=1";
public static void main(String[] args) {
Response response = RestAssured.get(link);
response.then().assertThat().statusCode(200);//This fails
response.then().assertThat().statusCode(401);//This passes
}
}
這裡有幾點需要注意。首先是語法,很容易理解,因為它更接近自然語言,可能遇到的其他語法糖包括 given,then和 expect。
此時,我們將使用ReqRes執行POST和DELETE請求。ReqRes能模擬具有虛假資料的API,但卻是真實的響應,因此,我們不必從頭開始構建一個測試應用了;POST將使我們能夠建立新資源,並且如名稱所示,DELETE將刪除資源。
// POST REQUEST
import io.restassured.RestAssured;
import io.restassured.response.Response;
import io.restassured.specification.RequestSpecification;
import org.testng.Assert;
public class RestTest {
static String json = "{place: 'earth', message: 'Hello'}";
static String link = "https://reqres.in/api/users";
public static void main(String[] args) {
RequestSpecification spec = RestAssured.given();
spec.body(json);
Response result = spec.post(link);
result.then().assertThat().statusCode(201);// Success
System.out.println(result.asString());// Response body
}
}
現在我們已在伺服器上成功建立了一些資料,斷言確保資料確實成功寫入。請注意,成功POST請求的相應狀態程式碼是201,而不是200。
// DELETE REQUEST
import io.restassured.RestAssured;
import io.restassured.response.Response;
import io.restassured.specification.RequestSpecification;
import java.util.concurrent.TimeUnit;
import org.testng.Assert;
public class RestTest {
static String link = "https://reqres.in/api/users/10";
public static void main(String[] args) {
RequestSpecification spec = RestAssured.given();
Response done = spec.delete(link);
done.then().assertThat().statusCode(204);
System.out.println(done.getTimeIn(TimeUnit.NANOSECONDS));
}
}
這個刪除請求會失敗的,因為我們無法刪除伺服器上的資料; 因此,返回204(無內容)。但是,我們得到請求所需的時間(以納秒為單位),當你想知道API的執行速度時,這種辦法可以派上用場。
這些示例只是可以使用REST Assured執行的一些簡單操作,不僅僅限制在JSON,也能為其他格式的API建立更復雜的自動化測試。