Cos'è REST?
REST sta per "REpresentational State Transfer", che è un nuovo modo di comunicazione tra due sistemi qualsiasi in un dato momento. Uno dei sistemi si chiama "REST Client" e l'altro si chiama "REST Server".
In questo tutorial REST imparerai:
- Cos'è REST?
- Cos'è il client REST?
- Cos'è il server REST?
- Cos'è Restito?
- Come testare il client REST utilizzando Restito?
- Vantaggi dell'utilizzo di Restito Framework per i test dei client REST
- Svantaggi dell'utilizzo di Restito Framework per i test dei client REST
Prima di conoscere Restito Framework per il test del client REST, impariamo prima alcune nozioni di base.
Cos'è il client REST?
Il client REST è un metodo o uno strumento per richiamare un'API del servizio REST esposta per la comunicazione da qualsiasi sistema o provider di servizi. Ad esempio: se un'API è esposta per ottenere informazioni sul traffico in tempo reale su un percorso da Google, il software / strumento che richiama l'API del traffico di Google viene chiamato client REST.
Cos'è il server REST?
È un metodo o un'API che è esposto alla comunicazione da qualsiasi sistema o fornitore di servizi. Ad esempio, Google espone un'API per ottenere informazioni sul traffico in tempo reale su un determinato percorso.
Qui, il server di Google deve essere attivo e funzionante per ascoltare qualsiasi richiesta all'API esposta da diversi client.
Esempio:
È il momento di stabilire uno scenario end-to-end completo dalle definizioni di cui sopra.
Consideriamo un'applicazione di prenotazione di taxi come Uber in quanto un'azienda necessita di informazioni in tempo reale sulla situazione del traffico attorno alle rotte in cui si trova un determinato veicolo.
Cliente di riposo:
Qui il client è un'applicazione mobile Uber a cui il conducente ha effettuato l'accesso. Questa app invia una richiesta all'API REST esposta da Google Maps per ottenere i dati in tempo reale. Ad esempio, una richiesta HTTP GET.
Rest Server:
In questo esempio, Google è il fornitore di servizi e l'API di Google Maps risponde con i dettagli richiesti alla richiesta dell'app Uber.
Sia il client che il server sono ugualmente importanti nella comunicazione REST.
Qui, abbiamo implementato esempi per il test di automazione del solo client REST. Per testare il server REST, fare riferimento a https://www.guru99.com/top-6-api-testing-tool.html.
Cos'è Restito?
Restito è un framework sviluppato da Mkotsur. È un'app leggera per aiutarti a eseguire qualsiasi tipo di richiesta HTTP. Puoi utilizzare Restito per testare le tue API REST e per cercare problemi nella tua applicazione o nella tua rete.
Come testare il client REST utilizzando Restito?
Dividiamo l'esercizio nei seguenti 4 passaggi:
- Creare un client HTTP e un metodo per inviare una richiesta HTTP GET a qualsiasi endpoint del server. Per ora, considera l'endpoint come http: // localhost: 9092 / getevents.
- Avvia un server Restito per ascoltare e acquisire le richieste inviate all'endpoint "getevents" in localhost http: // localhost: 9092 / getevents.
- Crea una classe di test per testare il client di cui sopra. Richiamare il metodo "sendGETRequest" del client HTTP per avviare una richiesta GET all'API "getevents".
- Convalida la chiamata HTTP GET utilizzando il framework Restito.
Immergiamoci in profondità in ciascuno dei passaggi precedenti.
Passaggio 1) Creare un client HTTP e un metodo per inviare una richiesta HTTP GET a qualsiasi endpoint del server.
========== JAVA CODE inizia ===========
pacchetto 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;/ *** Questa classe crea un client HTTP e ha un metodo per inviare la richiesta HTTP GET:* sendGETRequest (...)* /public class RestClient {/ *** Costruttore per la classe RestClient* /public RestClient () {System.out.println ("Creazione del costruttore RestClient");}/ *** Metodo per inviare la richiesta GET a http: // localhost: <> / getevents* @param port* @return true se la richiesta GET viene inviata correttamente. Falso, altrimenti.* /public static boolean sendGETRequest (int port) {provare {HttpClient client = HttpClientBuilder.create (). Build ();HttpGet getRequest = new HttpGet ("http: // localhost: + port + "/ getevents");// HttpResponse response = client.execute (richiesta);client.execute (getRequest);System.out.println ("La richiesta HTTP è stata inviata correttamente."+ "Restituire True");restituire vero;}catch (eccezione e) {e.printStackTrace ();}System.out.println ("Si è verificata un'eccezione durante la creazione del client HTTP."+ "Restituzione di false");return false;}}
========== CODICE JAVA Termina ===========
Passaggio 2) Avvia un server Restito per ascoltare e acquisire le richieste inviate all'endpoint "getevents" in localhost http: // localhost: 9092 / getevents.
========== JAVA CODE inizia ===========
pacchetto com.chamlabs.restfultesting.util;import statico 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;/ *** Questa classe di utilità contiene diversi metodi di utilità come:* restartRestitoServerForGETRequests (...)* restartRestitoServerForPOSTRequests (...)* waitAndGetCallList (...)** @autore cham6* @email: [email protected]* @fork: https://github.com/cham6/restfultesting.git** /public class TestUtil {/ *** Metodo di utilità per avviare il server stub restito per accettare le richieste GET* @param server* @param port* @param status* /public static void restartRestitoServerForGETRequests (server StubServer, porta int, stato HttpStatus){// Uccidi il server Restitoif (server! = null) {server.stop ();}// Inizializza e configura un'istanza più recente del server stubserver = nuovo StubServer (porta) .run ();whenHttp (server) .match (get ("/ getevents")). then (status (status));}/ *** Metodo di utilità per avviare il server stub restito per accettare le richieste POST* @param server* @param port* @param status* /public static void restartRestitoServerForPOSTRequests (StubServer server, int port, HttpStatus status){// Uccidi il server Restitoif (server! = null) {server.stop ();}// Inizializza e configura un'istanza più recente del server stubserver = nuovo StubServer (porta) .run ();whenHttp (server) .match (post ("/ postevents")). then (status (status));}/ *** Per un determinato server stub restito, eseguire il ciclo per un determinato numero di secondi e* rompere e restituire l'elenco delle chiamate dal server.** @param server* @param waitTimeInSeconds* @ritorno* @throws InterructedException* /public static ListwaitAndGetCallList (server StubServer, int waitTimeInSeconds)genera InterructedException{int timeoutCount = 0;List callList = server.getCalls ();while (callList.isEmpty ()) {Thread.sleep (1000);timeoutCount ++;if (timeoutCount> = waitTimeInSeconds) {rompere;}callList = server.getCalls ();}// Attendi 2 secondi per ottenere tutte le chiamate in callList per eliminare qualsiasi falkyness.Thread.sleep (2000);return server.getCalls ();}}
========== CODICE JAVA Termina ===========
Passaggio 3) Creare una classe di test per testare il client di cui sopra. Richiamare il metodo sendGETRequest del client HTTP per avviare una richiesta GET all'API "getevents".
========== JAVA CODE inizia ===========
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;/ *** Questa classe contiene diversi test junit per convalidare le operazioni RestClient come:* invia richiesta(… )* sendRequestWithCustomHeaders (...)* sendPOSTRequestWithJSONBody (...)** /la classe pubblica RestClientTester estende TestCase {finale statico privato Intero PORT = 9098;finale statico privato Intero PORT2 = 9099;finale statico privato Intero PORT3 = 9097;public RestClientTester () {System.out.println ("Avvio del test RestClientTester");}/ *** Junit test per convalidare la richiesta GET da RestClient* Passaggi:* 1) Creare un server stub utilizzando il framework Restito e configurarlo per l'ascolto su una determinata porta* 2) Richiamare il metodo sendGETRequest (…) di RestClient* 3) Restito acquisisce le richieste GET corrispondenti inviate, se presenti.* 4) Convalida se Restito ha catturato eventuali richieste GET su un determinato endpoint* Comportamento atteso:*> Restito avrebbe dovuto catturare la richiesta GET e avrebbe dovuto catturare solo una richiesta GET.* Infine:*> Arresta il server stub iniziato a utilizzare restito.* /public void testGETRequestFromClient () {StubServer server = null;provare {// Questo avvierà il server stub su "PORT" e risponderà con HTTP 202 "ACCEPTED_202"TestUtil.restartRestitoServerForGETRequests (server, PORT, ACCEPTED_202);RestClient.sendGETRequest (PORT);ListcallList = TestUtil.waitAndGetCallList (server, 30);assertTrue ("La richiesta GET non è stata ricevuta dal RestClient. Test non riuscito.",(callList! = null) && (callList.size () == 1));}catch (eccezione e) {e.printStackTrace ();fail ("Test fallito a causa di un'eccezione: + e);}infine {if (server! = null) {server.stop ();}}}
========== CODICE JAVA Termina ===========
Passaggio 4) Come convalidare la richiesta GET con le intestazioni e la richiesta POST con il corpo utilizzando il framework Restito.
========== JAVA CODE inizia ===========
/ *** Junit test per convalidare la richiesta GET con le intestazioni da RestClient* Passaggi:* 1) Creare un server stub utilizzando il framework Restito e configurarlo per l'ascolto su una determinata porta* 2) Richiama il metodo sendGETRequestWithCustomHeaders (…) di RestClient* 3) Restito acquisisce le richieste GET corrispondenti inviate, se presenti.* 4) Convalida se Restito ha catturato eventuali richieste GET su un dato endpoint* Comportamento atteso:*> Restito avrebbe dovuto catturare la richiesta GET e avrebbe dovuto catturare solo una richiesta GET.*> Ottieni le intestazioni della richiesta GET acquisita* e assicurati che le intestazioni corrispondano a quelle configurate.* Infine:*> Arresta il server stub iniziato a utilizzare restito.* /public void testGETRequestWithHeadersFromClient () {StubServer server = null;provare {// Questo avvierà il server stub su "PORT" e risponderà con HTTP 202 "ACCEPTED_202"TestUtil.restartRestitoServerForGETRequests (server, PORT2, ACCEPTED_202);RestClient.sendGETRequestWithCustomHeaders (PORT2);ListcallList = TestUtil.waitAndGetCallList (server, 30);assertTrue ("La richiesta GET non è stata ricevuta dal RestClient. Test non riuscito.",(callList! = null) && (callList.size () == 1));// Convalida le intestazioni della richiesta GET dal client RESTMap > headersFromRequest = callList.get (0) .getHeaders ();assertTrue ("La richiesta GET contiene l'intestazione Accept e il suo valore",headersFromRequest.get ("Accept"). contains ("text / html"));assertTrue ("La richiesta GET contiene l'autorizzazione dell'intestazione e il suo valore",headersFromRequest.get ("Authorization"). contains ("Bearer 1234567890qwertyuiop"));assertTrue ("La richiesta GET contiene l'intestazione Cache-Control e il suo valore",headersFromRequest.get ("Cache-Control"). contains ("no-cache"));assertTrue ("La richiesta GET contiene la connessione dell'intestazione e il suo valore",headersFromRequest.get ("Connection"). contains ("keep-alive"));assertTrue ("La richiesta GET contiene l'intestazione Content-Type e il suo valore",headersFromRequest.get ("Content-Type"). contains ("application / json"));}catch (eccezione e) {e.printStackTrace ();fail ("Test fallito a causa di un'eccezione: + e);}infine {if (server! = null) {server.stop ();}}}
/ *** Junit test per convalidare la richiesta POST con corpo e intestazioni da RestClient* Passaggi:* 1) Creare un server stub utilizzando il framework Restito e configurarlo per l'ascolto su una determinata porta* 2) Richiamare il metodo sendPOSTRequestWithJSONBody (…) di RestClient* 3) Restito acquisisce le richieste POST corrispondenti inviate, se presenti.* 4) Convalida se Restito ha catturato eventuali richieste POST su un determinato endpoint* Comportamento atteso:*> Restito avrebbe dovuto catturare la richiesta POST e avrebbe dovuto catturare solo una richiesta POST.*> Ottieni il corpo della richiesta POST acquisita e convalida i valori JSON* Infine:*> Arresta il server stub iniziato a utilizzare restito.* /public void testPOSTRequestWithJSONBody () {StubServer server = null;provare {// Questo avvierà il server stub su "PORT" e risponderà con HTTP 202 "ACCEPTED_202"TestUtil.restartRestitoServerForPOSTRequests (server, PORT3, ACCEPTED_202);RestClient.sendPOSTRequestWithJSONBody (PORT3);ListcallList = TestUtil.waitAndGetCallList (server, 30);assertTrue ("La richiesta POST non è stata ricevuta dal RestClient. Test non riuscito.",(callList! = null) && (callList.size () == 1));// Convalida le intestazioni della richiesta GET dal client RESTString requestBody = callList.get (0) .getPostBody ();JSONObject postRequestJSON = nuovo JSONObject (requestBody);assertTrue ("Il timeUpdated in json non è corretto",postRequestJSON.get ("timeUpdated"). toString (). equalsIgnoreCase ("1535703838478"));assertTrue ("Il token di accesso in json non è corretto",postRequestJSON.get ("access_token"). toString ().equalsIgnoreCase ("abf8714d-73a3-42ab-9df8-d13fcb92a1d8"));assertTrue ("Il refresh_token in json non è corretto",postRequestJSON.get ("refresh_token"). toString ().equalsIgnoreCase ("d5a5ab08-c200-421d-ad46-2e89c2f566f5"));assertTrue ("Il token_type in json non è corretto",postRequestJSON.get ("token_type"). toString (). equalsIgnoreCase ("bearer"));assertTrue ("Il expires_in in json non è corretto",postRequestJSON.get ("expires_in"). toString (). equalsIgnoreCase ("1024"));assertTrue ("L'ambito in json non è corretto",postRequestJSON.get ("scope"). toString (). equalsIgnoreCase (""));}catch (eccezione e) {e.printStackTrace ();fail ("Test fallito a causa di un'eccezione: + e);}infine {if (server! = null) {server.stop ();}}}}
========== CODICE JAVA Termina ===========
Vantaggi dell'utilizzo di Restito Framework per i test dei client REST
Di seguito sono riportati i vantaggi / vantaggi di Restito Framework per i test dei client ReST
- Non è necessario che il server REST effettivo sia sviluppato per testare il client REST.
- Restito fornisce utilità e metodi potenti e vari per deridere il diverso comportamento di un server. Ad esempio: per verificare come si comporta il client REST quando il server risponde con un errore HTTP 404 o HTTP 503.
- I server Restito possono essere configurati in pochi millisecondi e possono essere terminati al termine dei test.
- Restito supporta tutti i tipi di contenuti del metodo HTTP come compresso, non compresso, unificato, applicazione / testo, applicazione / JSON, ecc.
Svantaggi dell'utilizzo di Restito Framework per i test dei client REST
Qui, ci sono i contro / svantaggi di Restito Framework per il test del client ReST
- L'origine del client REST dovrebbe essere ottimizzata per considerare "localhost" come una macchina server.
- L'apertura del server in qualsiasi porta potrebbe creare conflitti se utilizziamo una porta di uso comune come "8080" o "9443" ecc.
- Si consiglia di utilizzare porte come 9092 o 9099, che non sono comunemente utilizzate da altri strumenti.
Sommario:
- REST sta per "REpresentational State Transfer" che è un nuovo modo standard di comunicazione tra due sistemi qualsiasi in un dato momento.
- Il client REST è un metodo o uno strumento per richiamare un'API del servizio REST esposta alla comunicazione da qualsiasi sistema o provider di servizi.
- Nel metodo RestServer o in un'API esposta per la comunicazione da qualsiasi sistema o provider di servizi.
- Restito è un'app leggera per aiutarti a eseguire qualsiasi tipo di richiesta HTTP
- Creare un client HTTP e un metodo per inviare una richiesta HTTP GET a qualsiasi endpoint del server
- Avvia un server Restito per ascoltare e acquisire le richieste inviate all'endpoint "getevents".
- Avvia un server Restito per ascoltare e acquisire le richieste inviate all'endpoint "getevents" in localhost
- Qui, abbiamo implementato esempi per il test di automazione del solo client REST.
- Non è necessario che il server REST effettivo sia sviluppato per testare il client REST.
- L'origine del client REST dovrebbe essere ottimizzata per considerare "localhost" come una macchina server.
Questo articolo è fornito da Chandrasekhar Muttineni