Testowanie klienta REST za pomocą narzędzia Restito

Spisie treści:

Anonim

Co to jest REST?

REST oznacza „REpresentational State Transfer”, czyli nowy sposób komunikacji między dowolnymi dwoma systemami w danym momencie. Jeden z systemów nosi nazwę „Klient REST”, a drugi „Serwer REST”.

W tym samouczku REST dowiesz się:

  • Co to jest REST?
  • Co to jest klient REST?
  • Co to jest serwer REST?
  • Co to jest Restito?
  • Jak przetestować klienta REST za pomocą Restito?
  • Zalety korzystania z Restito Framework do testowania klienta REST
  • Wady używania Restito Framework do testowania klienta REST

Zanim zapoznamy się z Restito Framework do testowania klientów REST, najpierw nauczmy się kilku podstaw.

Co to jest klient REST?

Klient REST to metoda lub narzędzie do wywoływania interfejsu API usługi REST, który jest udostępniany do komunikacji przez dowolny system lub dostawcę usług. Na przykład: jeśli interfejs API jest narażony na uzyskiwanie w czasie rzeczywistym informacji o ruchu na trasie z Google, oprogramowanie / narzędzie, które wywołuje interfejs API ruchu Google, nazywane jest klientem REST.

Co to jest serwer REST?

Jest to metoda lub interfejs API, który jest narażony na komunikację przez dowolny system lub dostawcę usług. Na przykład Google udostępnia API, aby uzyskać informacje o ruchu drogowym na danej trasie w czasie rzeczywistym.

W tym przypadku serwer Google musi być uruchomiony, aby nasłuchiwać wszelkich żądań do udostępnionego interfejsu API od różnych klientów.

Przykład:

Nadszedł czas, aby ustanowić kompletny scenariusz od końca do końca na podstawie powyższych definicji.

Rozważmy aplikacje do rezerwacji taksówek, takie jak Uber, ponieważ firma potrzebuje w czasie rzeczywistym informacji o sytuacji drogowej na trasach, na których znajduje się dany pojazd.

Klient odpoczynku:

W tym przypadku klientem jest aplikacja mobilna Uber, do której jest zalogowany kierowca. Ta aplikacja wysyła żądanie do REST API udostępnianego przez mapy Google w celu uzyskania danych w czasie rzeczywistym. Na przykład żądanie HTTP GET.

Serwer odpoczynku:

W tym przykładzie Google jest dostawcą usług, a interfejs API map Google odpowiada wymaganymi szczegółami na żądanie aplikacji Uber.

Zarówno klient, jak i serwer są równie ważne w komunikacji REST.

Tutaj zaimplementowaliśmy przykłady testowania automatyzacji tylko klienta REST. Aby przetestować serwer REST, zobacz https://www.guru99.com/top-6-api-testing-tool.html.

Co to jest Restito?

Restito to framework opracowany przez Mkotsur. Jest to lekka aplikacja, która pomaga wykonywać wszelkiego rodzaju żądania HTTP. Możesz użyć Restito do testowania interfejsów API REST i wyszukiwania problemów w swojej aplikacji lub sieci.

Jak przetestować klienta REST za pomocą Restito?

Podzielmy to ćwiczenie na 4 następujące kroki:

  1. Utwórz klienta HTTP i metodę wysyłania żądania HTTP GET do dowolnego punktu końcowego serwera. Na razie przyjmijmy, że punkt końcowy to http: // localhost: 9092 / getevents.
  1. Uruchom serwer Restito, aby nasłuchiwać i przechwytywać żądania wysyłane do punktu końcowego „getevents” w localhost http: // localhost: 9092 / getevents.
  1. Utwórz klasę testową, aby przetestować powyższego klienta. Wywołaj metodę „sendGETRequest” klienta HTTP, aby zainicjować żądanie GET do interfejsu API „getevents”.
  1. Sprawdź poprawność wywołania HTTP GET przy użyciu struktury Restito.

Zanurzmy się szczegółowo w każdym z powyższych kroków.

Krok 1) Utwórz klienta HTTP i metodę wysyłania żądania HTTP GET do dowolnego punktu końcowego serwera.

========== JAVA CODE Starts ===========

pakiet com.chamlabs.restfulservices.client;import java.util.HashMap;import java.util.Map;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.entity.StringEntity;import org.apache.http.impl.client.HttpClientBuilder;import org.json.JSONObject;/ *** Ta klasa tworzy klienta HTTP i ma metodę wysyłania żądań HTTP GET:* sendGETRequest (…)* /klasa publiczna RestClient {/ *** Konstruktor dla klasy RestClient* /public RestClient () {System.out.println ("Tworzenie konstruktora RestClient");}/ *** Metoda wysyłania żądania GET do http: // localhost: <
> / getevents* Port @param* @return true, jeśli żądanie GET zostało pomyślnie wysłane. W przeciwnym razie fałsz.* /public static boolean sendGETRequest (int port) {próbować {HttpClient client = HttpClientBuilder.create (). Build ();HttpGet getRequest = new HttpGet ("http: // localhost: + port + "/ getevents");// HttpResponse response = client.execute (żądanie);client.execute (getRequest);System.out.println ("Żądanie HTTP zostało wysłane pomyślnie."+ „Przywraca prawdę”);powrót prawda;}catch (wyjątek e) {e.printStackTrace ();}System.out.println ("Wystąpił wyjątek podczas tworzenia klienta HTTP."+ „Zwracanie fałszu”);return false;}}

========== KOD JAVA kończy się ===========

Krok 2) Uruchom serwer Restito, aby nasłuchiwać i przechwytywać żądania wysyłane do punktu końcowego „getevents” w localhost http: // localhost: 9092 / getevents.

========== JAVA CODE Starts ===========

pakiet com.chamlabs.restfultesting.util;import static com.xebialabs.restito.builder.stub.StubHttp.whenHttp;import static com.xebialabs.restito.semantics.Action.status;import static com.xebialabs.restito.semantics.Condition.get;import static com.xebialabs.restito.semantics.Condition.post;import java.util.List;import org.glassfish.grizzly.http.util.HttpStatus;import com.xebialabs.restito.semantics.Call;import com.xebialabs.restito.server.StubServer;/ *** Ta klasa narzędziowa zawiera kilka metod narzędziowych, takich jak:* restartRestitoServerForGETRequests (…)* restartRestitoServerForPOSTRequests (…)* waitAndGetCallList (…)** @author cham6* @email: [email protected]* @fork: https://github.com/cham6/restfultesting.git** /public class TestUtil {/ *** Metoda narzędziowa do uruchamiania serwera restito stub w celu akceptowania żądań GET* Serwer @param* Port @param* Status @param* /public static void restartRestitoServerForGETRequests (serwer StubServer, port int, status HttpStatus){// Zabij serwer restitoif (server! = null) {server.stop ();}// Zainicjuj i skonfiguruj nowszą instancję serwera pośredniczącegoserwer = nowy StubServer (port) .run ();whenHttp (serwer) .match (get ("/ getevents")). then (status (status));}/ *** Metoda narzędziowa, aby uruchomić serwer pośredniczący restito w celu akceptowania żądań POST* Serwer @param* Port @param* Status @param* /public static void restartRestitoServerForPOSTRequests (serwer StubServer, port int, status HttpStatus){// Zabij serwer restitoif (server! = null) {server.stop ();}// Zainicjuj i skonfiguruj nowszą instancję serwera pośredniczącegoserwer = nowy StubServer (port) .run ();whenHttp (serwer) .match (post ("/ postevents")). then (status (status));}/ *** Dla danego serwera restito, pętla przez podaną ilość sekund i* przerwij i zwróć listę połączeń z serwera.** Serwer @param* @param waitTimeInSeconds* @powrót* @throws InterruptedException* /public static List  waitAndGetCallList (serwer StubServer, int waitTimeInSeconds)zgłasza InterruptedException{int timeoutCount = 0;List  callList = server.getCalls ();while (callList.isEmpty ()) {Thread.sleep (1000);timeoutCount ++;if (timeoutCount> = waitTimeInSeconds) {przerwa;}callList = server.getCalls ();}// Poczekaj 2 sekundy, aby uzyskać wszystkie wywołania w callList, aby wyeliminować wszelkie falkiness.Thread.sleep (2000);return server.getCalls ();}}

========== KOD JAVA kończy się ===========

Krok 3) Utwórz klasę testową, aby przetestować powyższego klienta. Wywołaj metodę sendGETRequest klienta HTTP, aby zainicjować żądanie GET do interfejsu API „getevents”.

========== JAVA CODE Starts ===========

import junit.framework.TestCase;import com.chamlabs.restfulservices.client.RestClient;import com.chamlabs.restfultesting.util.TestUtil;import com.xebialabs.restito.semantics.Call;import com.xebialabs.restito.server.StubServer;import static org.glassfish.grizzly.http.util.HttpStatus.ACCEPTED_202;import org.json.JSONObject;import java.util.List;import java.util.Map;/ *** Ta klasa zawiera kilka testów junit do walidacji operacji RestClient, takich jak:* wysłać prośbę(… )* sendRequestWithCustomHeaders (…)* sendPOSTRequestWithJSONBody (…)** /public class RestClientTester rozszerza TestCase {prywatny statyczny końcowy Integer PORT = 9098;prywatny statyczny końcowy Integer PORT2 = 9099;prywatny statyczny końcowy Integer PORT3 = 9097;public RestClientTester () {System.out.println ("Uruchamianie testu RestClientTester");}/ *** Test Junit w celu sprawdzenia poprawności żądania GET z RestClient* Kroki:* 1) Utwórz serwer pośredniczący przy użyciu struktury Restito i skonfiguruj go do nasłuchiwania na podanym porcie* 2) Wywołaj metodę sendGETRequest (…) RestClient* 3) Restito przechwytuje odpowiednie wysłane żądania GET, jeśli takie istnieją.* 4) Sprawdź, czy Restito przechwycił żądania GET na danym punkcie końcowym* Spodziewane zachowanie:*> Restito powinno przechwycić żądanie GET i powinno przechwycić tylko jedno żądanie GET.* Wreszcie:*> Zatrzymaj serwer pośredniczący uruchomiony przy użyciu restito.* /public void testGETRequestFromClient () {Serwer StubServer = null;próbować {// Spowoduje to uruchomienie serwera pośredniczącego na „PORT” i odpowie komunikatem HTTP 202 „ACCEPTED_202”TestUtil.restartRestitoServerForGETRequests (serwer, PORT, ACCEPTED_202);RestClient.sendGETRequest (PORT);List  callList = TestUtil.waitAndGetCallList (serwer, 30);assertTrue ("Żądanie GET nie zostało odebrane od RestClient. Test nie powiódł się.",(callList! = null) && (callList.size () == 1));}catch (wyjątek e) {e.printStackTrace ();niepowodzenie („Test nie powiódł się z powodu wyjątku:” + e);}Wreszcie {if (server! = null) {server.stop ();}}}

========== KOD JAVA kończy się ===========

Krok 4) Jak zweryfikować żądanie GET z nagłówkami i żądanie POST z treścią przy użyciu struktury Restito.

========== JAVA CODE Starts ===========

/ *** Test Junit w celu sprawdzenia poprawności żądania GET z nagłówkami z RestClient* Kroki:* 1) Utwórz serwer pośredniczący przy użyciu struktury Restito i skonfiguruj go do nasłuchiwania na podanym porcie* 2) Wywołaj metodę sendGETRequestWithCustomHeaders (…) RestClient* 3) Restito przechwytuje odpowiednie wysłane żądania GET, jeśli takie istnieją.* 4) Sprawdź, czy Restito przechwycił żądania GET na danym punkcie końcowym* Spodziewane zachowanie:*> Restito powinno było przechwycić żądanie GET i powinno było przechwycić tylko jedno żądanie GET.*> Pobierz nagłówki przechwyconego żądania GET* i upewnij się, że nagłówki są zgodne ze skonfigurowanymi.* Wreszcie:*> Zatrzymaj serwer pośredniczący uruchomiony przy użyciu restito.* /public void testGETRequestWithHeadersFromClient () {Serwer StubServer = null;próbować {// Spowoduje to uruchomienie serwera pośredniczącego na „PORT” i odpowie komunikatem HTTP 202 „ACCEPTED_202”TestUtil.restartRestitoServerForGETRequests (serwer, PORT2, ACCEPTED_202);RestClient.sendGETRequestWithCustomHeaders (PORT2);List  callList = TestUtil.waitAndGetCallList (serwer, 30);assertTrue ("Żądanie GET nie zostało odebrane od RestClient. Test nie powiódł się.",(callList! = null) && (callList.size () == 1));// Sprawdź poprawność nagłówków żądania GET od klienta RESTMap > headersFromRequest = callList.get (0) .getHeaders ();assertTrue ("Żądanie GET zawiera akceptację nagłówka i jego wartość",headersFromRequest.get ("Akceptuj"). zawiera ("text / html"));assertTrue ("Żądanie GET zawiera autoryzację nagłówka i jego wartość",headersFromRequest.get ("Autoryzacja"). zawiera ("Nośnik 1234567890qwertyuiop"));assertTrue ("Żądanie GET zawiera nagłówek Cache-Control i jego wartość",headersFromRequest.get ("Cache-Control"). zawiera ("no-cache"));assertTrue ("Żądanie GET zawiera nagłówek Połączenie i jego wartość",headersFromRequest.get ("Połączenie"). zawiera ("utrzymuj przy życiu"));assertTrue ("Żądanie GET zawiera nagłówek Content-Type i jego wartość",headersFromRequest.get ("Content-Type"). zawiera ("application / json"));}catch (wyjątek e) {e.printStackTrace ();niepowodzenie („Test nie powiódł się z powodu wyjątku:” + e);}Wreszcie {if (server! = null) {server.stop ();}}}
/ *** Test Junit w celu sprawdzenia poprawności żądania POST z treścią i nagłówkami z RestClient* Kroki:* 1) Utwórz serwer pośredniczący przy użyciu struktury Restito i skonfiguruj go do nasłuchiwania na podanym porcie* 2) Wywołaj metodę sendPOSTRequestWithJSONBody (…) RestClient* 3) Restito przechwytuje odpowiednie wysłane żądania POST, jeśli takie istnieją.* 4) Sprawdź, czy Restito przechwycił żądania POST na danym punkcie końcowym* Spodziewane zachowanie:*> Restito powinno przechwycić żądanie POST i powinno przechwycić tylko jedno żądanie POST.*> Pobierz treść przechwyconego żądania POST i sprawdź poprawność wartości JSON* Wreszcie:*> Zatrzymaj serwer pośredniczący uruchomiony przy użyciu restito.* /public void testPOSTRequestWithJSONBody () {Serwer StubServer = null;próbować {// Spowoduje to uruchomienie serwera pośredniczącego na „PORT” i odpowie komunikatem HTTP 202 „ACCEPTED_202”TestUtil.restartRestitoServerForPOSTRequests (serwer, PORT3, ACCEPTED_202);RestClient.sendPOSTRequestWithJSONBody (PORT3);List  callList = TestUtil.waitAndGetCallList (serwer, 30);assertTrue ("Żądanie POST nie zostało odebrane z RestClient. Test nie powiódł się.",(callList! = null) && (callList.size () == 1));// Sprawdź poprawność nagłówków żądania GET od klienta RESTString requestBody = callList.get (0) .getPostBody ();JSONObject postRequestJSON = new JSONObject (requestBody);assertTrue ("Czas aktualizacji w json jest niepoprawny",postRequestJSON.get ("timeUpdated"). toString (). equalsIgnoreCase ("1535703838478"));assertTrue ("Access_token w json jest nieprawidłowy",postRequestJSON.get ("access_token"). toString ().equalsIgnoreCase ("abf8714d-73a3-42ab-9df8-d13fcb92a1d8"));assertTrue ("The refresh_token w json jest niepoprawny",postRequestJSON.get ("refresh_token"). toString ().equalsIgnoreCase ("d5a5ab08-c200-421d-ad46-2e89c2f566f5"));assertTrue ("Typ token_type w json jest niepoprawny",postRequestJSON.get ("token_type"). toString (). equalsIgnoreCase ("bearer"));assertTrue ("The expires_in w json jest niepoprawne",postRequestJSON.get ("expires_in"). toString (). equalsIgnoreCase ("1024"));assertTrue ("Zakres w json jest nieprawidłowy",postRequestJSON.get ("scope"). toString (). equalsIgnoreCase (""));}catch (wyjątek e) {e.printStackTrace ();niepowodzenie („Test nie powiódł się z powodu wyjątku:” + e);}Wreszcie {if (server! = null) {server.stop ();}}}}

========== KOD JAVA kończy się ===========

Zalety korzystania z Restito Framework do testowania klienta REST

Oto zalety / zalety Restito Framework do testowania klientów ReST

  • Nie potrzebujemy tworzenia rzeczywistego serwera REST w celu przetestowania klienta REST.
  • Restito zapewnia silne i zróżnicowane narzędzia i metody do naśladowania różnych zachowań serwera. Na przykład: aby przetestować, jak zachowuje się klient REST, gdy serwer odpowiada błędem HTTP 404 lub HTTP 503.
  • Serwery Restito można skonfigurować w kilka milisekund i można je wyłączyć po zakończeniu testów.
  • Restito obsługuje wszystkie typy zawartości metod HTTP, takie jak skompresowane, nieskompresowane, ujednolicone, aplikacja / tekst, aplikacja / JSON itp.

Wady używania Restito Framework do testowania klienta REST

Oto wady / wady Restito Framework do testowania klienta ReST

  • Źródło klienta REST powinno zostać zmodyfikowane, aby traktować „localhost” jako maszynę serwera.
  • Otwarcie serwera w dowolnym porcie może powodować konflikt, jeśli użyjemy jakiegoś powszechnie używanego portu, takiego jak „8080” lub „9443” itp.
  • Zaleca się używanie portów takich jak 9092 lub 9099, które nie są powszechnie używane przez inne narzędzia.

Podsumowanie:

  • REST oznacza „REpresentational State Transfer”, który jest nowym standardowym sposobem komunikacji między dowolnymi dwoma systemami w danym momencie.
  • Klient REST to metoda lub narzędzie do wywoływania interfejsu API usługi REST, który jest narażony na komunikację przez dowolny system lub dostawcę usług.
  • W metodzie RestServer lub API, które jest udostępniane do komunikacji przez dowolny system lub usługodawcę.
  • Restito to lekka aplikacja, która pomaga wykonywać wszelkiego rodzaju żądania HTTP
  • Utwórz klienta HTTP i metodę wysyłania żądania HTTP GET do dowolnego punktu końcowego serwera
  • Uruchom serwer Restito, aby nasłuchiwać i przechwytywać żądania wysyłane do punktu końcowego „getevents”.
  • Uruchom serwer Restito, aby nasłuchiwać i przechwytywać żądania wysyłane do punktu końcowego „getevents” w localhost
  • Tutaj zaimplementowaliśmy przykłady testowania automatyzacji tylko klienta REST.
  • Nie potrzebujemy tworzenia rzeczywistego serwera REST w celu przetestowania klienta REST.
  • Źródło klienta REST powinno zostać zmodyfikowane, aby traktować „localhost” jako maszynę serwera.

Ten artykuł jest autorstwa Chandrasekhara Muttineni