REST Assured ile API Testi

Anılcan Gül
Wingie / Enuygun Tech
4 min readMay 6, 2021

Merhaba, bu yazıda Java Rest Assured kütüphanesi kullanarak api istekleri atacağız ve dönen response’daki değişkenlerin değerlerini ayrıştırarak test senaryomuzdaki kontrolleri sağlayacağız. Dinamik bir yapı oluşturmayı amaçlıyoruz bu yüzden fonksiyonlardan dönen response’u test içerisinde ayrıştırıp kontrol edeceğiz.

Senaryo:

Omdb film afiş sitesinin public api’ını kullanacağız. Omdb “By Search” ve “By ID or Title” olarak iki farklı istekte bulunmamıza olanak sağlıyor. By Search parametrelerini kullanarak film adıyla bir arama yapacağız. Belirlediğimiz filmin imdbID’sini ayrıştırıp, By ID or Title parametrelerine ekleyerek ayrı bir istek atacağız. (Parametre tablosuna Omdb üzerinden erişebilirsiniz)

  • Omdb sayfasında By Search request’i için “s” parametresine ‘Batman’ değeri eklenerek arama yapılır.
  • Listelenen filmler arasında “Batman: The Dark Knight Returns, Part 1”; filminin ‘imdbID’si ayrıştırılır.
  • Alınan id’yi By ID or Title request’i için “i” parametresine değer olarak eklenir ve arama yapılır.
  • Dönen Response’da ‘imdbRating’ değerinin 8.0'a eşit olduğu kontrol edilir ve doğrulanır.

FindMovie

FindMovie class’ında Omdb sayfasına atılacak olan request fonksiyonları bulunuyor.

import io.restassured.response.Response;
import static io.restassured.RestAssured.baseURI;
import static io.restassured.RestAssured.given;
import static org.hamcrest.Matchers.emptyOrNullString;
import static org.hamcrest.Matchers.not;

public class FindMovie {

public FindMovie() {
baseURI = "http://www.omdbapi.com/"; // Base url'i bu şekilde tanımlıyoruz.
}

Burada gerekli kütüphaneleri import ediyoruz ve ardından requestleri göndereceğimiz sayfanın adresini baseURI olarak tanımlıyoruz. Bu sayede Metodları gönderirken “baseURI”ı tekrardan tanımlamaya gerek kalmayacak.

package com.omdb;

import io.restassured.http.ContentType;
import io.restassured.response.Response;
import static io.restassured.RestAssured.baseURI;
import static io.restassured.RestAssured.given;
import static org.hamcrest.Matchers.emptyOrNullString;
import static org.hamcrest.Matchers.not;

public class FindMovie {

public FindMovie() {
baseURI = "http://www.omdbapi.com/"; // Base url'i bu şekilde tanımlıyoruz.
}

public Response getSearchResponse(String apiKey, String searchWord) {

Response searchResponse =
given()
.param("apikey", apiKey)
.param("s", searchWord)
.when().get()
.then().log().all()
.contentType(ContentType.JSON)
.statusCode(200) //status code 200 olmalı
.extract()
.response();
return searchResponse;


}

Ardından “getSearchResponse” fonksiyonuna gönderdiğimiz ‘Batman’ yazısı ve gerekli parametrelerle bir request atıyoruz. Burada request’in başarılı olduğunu statusCode(200) döndüğünü iddia ederek onaylamış oluyoruz ve burada hazırladığımız Response objesini döndürüyoruz.

package com.omdb;

import io.restassured.http.ContentType;
import io.restassured.response.Response;
import static io.restassured.RestAssured.baseURI;
import static io.restassured.RestAssured.given;
import static org.hamcrest.Matchers.emptyOrNullString;
import static org.hamcrest.Matchers.not;

public class FindMovie {

public FindMovie() {
baseURI = "http://www.omdbapi.com/"; // Base url'i bu şekilde tanımlıyoruz.
}
public Response getSearchResponse(String apiKey, String searchWord) {

Response searchResponse =
given()
.param("apikey", apiKey)
.param("s", searchWord)
.when().get()
.then().log().all()
.contentType(ContentType.JSON)
.statusCode(200) //status code 200 olmalı
.extract()
.response();
return searchResponse;
}

public Response searchByID(String apiKey, String imdbId) {

Response searchId =
given()
.param("apikey", apiKey)
.param("i",imdbId) // ID'si alinan film icin arama yapiyoruz
.when().get() //methodumuzun türünü belirtiyoruz (method içine yazdığımız değer baseURI'in sonuna eklenir)
.then().log().all()
.statusCode(200) //statuscode 200 dönmelidir
.body("imdbRating", not(emptyOrNullString()))
.extract()
.response();
return searchId; //Dönen response'u Test fonksiyonumuza Response olarak döndürüyoruz

}

}

Bu fonksiyonda “imdbId”yi parametre değeri olarak gönderip aranılan filmin bilgilerini çekiyoruz. “imdbRating”in empty veya nullString dönemeyeceğini iddia ediyoruz. Ardından Response objesini döndürüyoruz.

TestApi

Test içerisinde çağrılan fonksiyonlar bize Response Objesi olarak dönüyor. Bu Response objelerinin içindeki değerleri ayrıştırıp bir değişkene atıyoruz böylece bu değerleri bir sonraki testimizde kullanabiliyor ve test edebiliyoruz.

package com.omdb;

import org.junit.Test;
import io.restassured.response.Response;
import static org.hamcrest.Matchers.*;

public class TestApi {

FindMovie findMovie = new FindMovie();
String apiKey = System.getProperty("apiKey","49e530b5"); // Api key
String movieTitle = "Batman: The Dark Knight Returns, Part 1";
public static String imdbId;


@Test
public void Test_001_Batman(){
String searchWord = "Batman";
Response searchResponse = findMovie.getSearchResponse(apiKey,searchWord);
String imdbId = searchResponse.then().extract().response().path("Search.find{it.Title=='"+movieTitle+"'}.imdbID");
this.imdbId = imdbId; // aldığımız imdbId değerini class içine tanımlıyoruz.
}

@Test
public void Test_002_Batman_CheckTheRating(){
Response searchID = findMovie.searchByID(apiKey, imdbId); // Önceki fonk'da aldıgımız id'yi yolluyoruz.
searchID.then().body("imdbRating",equalTo("8.0")); // imbId ile arattığım filmin puanını 8.0 olacağını iddia ediyorum.



}

}

Test_001_Batman

Response searchResponse = findMovie.getSearchResponse(apiKey,searchWord);

Fonksiyonu çağırıp response’u “searchRespose”a atadık.

String imdbId =  searchResponse.then().extract().response().path("Search.find{it.Title=='"+movieTitle+"'}.imdbID");

Burada “Title” key değeri “Batman: The Dark Knight Returns, Part 1” ile eşleşen filmin “imdbID” parametresinin değerini bir değişkene atıyoruz.

this.imdbId = imdbId; 

Aldığımız değişkeni class içinde bir değişkene atıyoruz sonra fonksiyona göndermek için bu değişkeni çağıracağız.

Test_002_Batman_CheckTheRating

Response searchID = findMovie.searchByID(apiKey, imdbId);

Burada bir önceki testimizde aldığımız “imdbid”yi parametre olarak fonksiyona yolluyoruz ve dönen Response objesini bir değişkene atıyoruz.

searchID.then().body("imdbRating",equalTo("8.0")); 

Response objesi içerisinde “imdbRating” değerinin “8.0” a eşit olduğunu equalTo ile iddia edip doğruluyoruz.

Not: Bu ikinci testte aslında bir ayrıştırma yapmadık sadece dönen response içindeki bir değeri kontrol ettik. imdbRating değeri başka bir fonksiyonda kullanılmayacağı için ayrıştırıp bir değişkene atamadan da response’un body’sinde kontrol edebiliyoruz.

Sonuç

Bu projede dinamik bir test yapısı oluşturularak farklı test ihtiyaçları için ayrı bir request-body oluşturulmadan request fonksiyonları çağrılarak Response Objeleri oluşturulmuş bu objeler test içerisinde ayrıştırılarak kontrol edilmiştir. Tüm testlerimiz için geçerli olan status code(200) gibi kontroller bu fonksiyonlara yazılarak ortak ve dinamik bir yapı oluşturulmuştur. Tüm testlerinizde her zaman kontrol etmeniz gereken değerleri bu şekilde fonksiyonlara yazarak kod tekrarından kurtularak daha temiz bir yapıya sahip olabilirsiniz.

Sormak istediğiniz veya görüş belirtmek istediğiniz her şey için bana buradan ulaşabilirsiniz okuduğunuz için teşekkürler.

KAYNAKLAR

Rest Assured kütüphanesinde çok detaylı kontroller ve zincir methodlar mevcut bu yüzden faydalı olacağını düşündüğüm kaynaklarla beraber bu projenin github reposunu ekliyorum.

Wingie / Enuygun’un büyüyen ekibinin bir parçası olmak ister misin? Açık pozisyonlarımızı LinkedIn sayfamızda bulabilirsin. Tech ekibimize başvurmak için CV’ni kariyer@enuygun.com’a iletebilirsin.

--

--