Wat is REST?
REST staat voor "REpresentational State Transfer", een nieuwe manier van communicatie tussen twee systemen op een bepaald moment. Een van de systemen heet 'REST Client' en de andere heet 'REST Server'.
In deze REST-tutorial leer je:
- Wat is REST?
- Wat is REST Client?
- Wat is REST-server?
- Wat is Restito?
- Hoe de REST-client testen met Restito?
- Voordelen van het gebruik van Restito Framework voor het testen van REST-clients
- Nadelen van het gebruik van Restito Framework voor het testen van REST-clients
Voordat we leren over Restito Framework for REST client testing, laten we eerst een paar basisprincipes leren.
Wat is REST Client?
REST Client is een methode of een tool om een REST-service-API aan te roepen die beschikbaar is voor communicatie door een systeem of serviceprovider. Bijvoorbeeld: als een API wordt blootgesteld om realtime verkeersinformatie over een route van Google te krijgen, wordt de software / tool die de Google Traffic API aanroept de REST-client genoemd.
Wat is REST-server?
Het is een methode of een API die wordt blootgesteld aan communicatie door elk systeem of serviceprovider. Google stelt bijvoorbeeld een API ter beschikking om realtime verkeersinformatie op een bepaalde route te krijgen.
Hier moet de Google-server actief zijn om te luisteren naar verzoeken aan de blootgestelde API van verschillende clients.
Voorbeeld:
Het is tijd om een compleet end-to-end-scenario op te stellen op basis van de bovenstaande definities.
Laten we eens kijken naar een taxi-boekingsapplicatie zoals Uber, aangezien een bedrijf realtime informatie nodig heeft over de verkeerssituatie rond de routes waarop een bepaald voertuig zich bevindt.
Rest klant:
Hier is de client een mobiele Uber-applicatie waarop de bestuurder zich heeft aangemeld. Deze app stuurt een verzoek naar de REST API die wordt weergegeven door Google maps om de realtime gegevens te krijgen. Bijvoorbeeld een HTTP GET-verzoek.
Rust server:
In dit voorbeeld is Google de serviceprovider en reageert de API van Google maps met de vereiste details op het verzoek van de Uber-app.
Zowel de client als de server zijn even belangrijk bij REST-communicatie.
Hier hebben we voorbeelden geïmplementeerd voor automatiseringstests van alleen de REST-client. Raadpleeg https://www.guru99.com/top-6-api-testing-tool.html voor het testen van de REST-server.
Wat is Restito?
Restito is een framework ontwikkeld door Mkotsur. Het is een lichtgewicht app om u te helpen bij het uitvoeren van elk soort HTTP-verzoek. U kunt Restito gebruiken om uw REST API's te testen en om problemen in uw applicatie of uw netwerk te zoeken.
Hoe de REST-client testen met Restito?
Laten we de oefening opdelen in de volgende 4 stappen:
- Maak een HTTP-client en -methode om een HTTP GET-verzoek naar een servereindpunt te verzenden. Beschouw voorlopig het eindpunt als http: // localhost: 9092 / getevents.
- Start een Restito-server om te luisteren en de verzoeken vast te leggen die naar het eindpunt 'getevents' worden gestuurd in localhost http: // localhost: 9092 / getevents.
- Maak een testklasse om de bovenstaande client te testen. Roep de HTTP-client 'sendGETRequest'-methode aan om een GET-verzoek naar de API' getevents 'te initiëren.
- Valideer de HTTP GET-aanroep met het Restito-framework.
Laten we dieper ingaan op elk van de bovenstaande stappen.
Stap 1) Maak een HTTP-client en -methode om een HTTP GET-verzoek naar elk servereindpunt te verzenden.
========== JAVA CODE Start ===========
pakket com.chamlabs.restfulservices.client;importeer java.util.HashMap;importeer java.util.Map;importeer org.apache.http.client.HttpClient;importeer org.apache.http.client.methods.HttpGet;importeer org.apache.http.client.methods.HttpPost;importeer org.apache.http.entity.StringEntity;importeer org.apache.http.impl.client.HttpClientBuilder;importeer org.json.JSONObject;* Deze klasse maakt een HTTP-client en heeft een methode om een HTTP GET-verzoek te verzenden:* sendGETRequest (…)openbare klasse RestClient {* Constructor voor de klasse RestClientopenbare RestClient () {System.out.println ("RestClient-constructor maken");* Methode om GET-verzoek te verzenden naar http: // localhost: <> / getevents* @param-poort* @return waar als het GET-verzoek met succes is verzonden. Anders fout.openbare statische booleaanse sendGETRequest (int poort) {proberen {HttpClient-client = HttpClientBuilder.create (). Build ();HttpGet getRequest = nieuwe HttpGet ("http: // localhost: + poort + "/ getevents");// HttpResponse response = client.execute (verzoek);client.execute (getRequest);System.out.println ("HTTP-verzoek is succesvol verzonden."+ "Returning True");terugkeer waar;catch (uitzondering e) {e.printStackTrace ();System.out.println ("Er is een uitzondering opgetreden tijdens het maken van de HTTP-client."+ "Teruggeven van false");teruggeven false;
========== JAVA CODE Eindigt ===========
Stap 2) Start een Restito-server om te luisteren en de verzoeken vast te leggen die naar het eindpunt 'getevents' zijn verzonden in localhost http: // localhost: 9092 / getevents.
========== JAVA CODE Start ===========
pakket com.chamlabs.restfultesting.util;importeer statische com.xebialabs.restito.builder.stub.StubHttp.whenHttp;importeer statische com.xebialabs.restito.semantics.Action.status;importeer statische com.xebialabs.restito.semantics.Condition.get;importeer statische com.xebialabs.restito.semantics.Condition.post;importeer java.util.List;importeer org.glassfish.grizzly.http.util.HttpStatus;importeer com.xebialabs.restito.semantics.Call;importeer com.xebialabs.restito.server.StubServer;* Deze utility-klasse bevat verschillende utility-methoden, zoals:* herstartRestitoServerForGETRequests (...)* herstartRestitoServerForPOSTRequests (…)* waitAndGetCallList (…)* @ auteur cham6* @email: [email protected]* @fork: https://github.com/cham6/restfultesting.gitopenbare klasse TestUtil {* Hulpprogramma om de restito stub-server te starten om GET-verzoeken te accepteren* @param server* @param-poort* @param statusopenbare statische ongeldige herstartRestitoServerForGETRequests (StubServer-server, int poort, HttpStatus-status)// Dood de restito-serverif (server! = null) {server.stop ();// Initialiseer en configureer een nieuwere instantie van de stub-serverserver = nieuwe StubServer (poort) .run ();whenHttp (server) .match (get ("/ getevents")). then (status (status));* Hulpprogramma om de restito stub-server te starten om POST-verzoeken te accepteren* @param server* @param-poort* @param statusopenbare statische ongeldige herstartRestitoServerForPOSTRequests (StubServer-server, int poort, HttpStatus-status)// Dood de restito-serverif (server! = null) {server.stop ();// Initialiseer en configureer een nieuwere instantie van de stub-serverserver = nieuwe StubServer (poort) .run ();whenHttp (server) .match (post ("/ postevents")). then (status (status));* Voor een bepaalde restito-stub-server, loop het opgegeven aantal seconden door en* onderbreek en retourneer de oproeplijst van de server.* @param server* @param waitTimeInSeconds* @return* @throws InterruptedExceptionopenbare statische lijstwaitAndGetCallList (StubServer-server, int waitTimeInSeconds)gooit InterruptedExceptionint timeoutCount = 0;Lijst callList = server.getCalls ();while (callList.isEmpty ()) {Thread.sleep (1000);timeoutCount ++;if (timeoutCount> = waitTimeInSeconds) {breken;callList = server.getCalls ();// Wacht 2 seconden om alle oproepen in callList te krijgen om elke falkyness te elimineren.Thread.sleep (2000);retourneer server.getCalls ();
========== JAVA CODE Eindigt ===========
Stap 3) Maak een testklasse om de bovenstaande client te testen. Roep de HTTP-client sendGETRequest-methode aan om een GET-verzoek naar de API 'getevents' te initiëren.
========== JAVA CODE Start ===========
importeer junit.framework.TestCase;importeer com.chamlabs.restfulservices.client.RestClient;importeer com.chamlabs.restfultesting.util.TestUtil;importeer com.xebialabs.restito.semantics.Call;importeer com.xebialabs.restito.server.StubServer;importeer statische org.glassfish.grizzly.http.util.HttpStatus.ACCEPTED_202;importeer org.json.JSONObject;importeer java.util.List;importeer java.util.Map;* Deze klasse bevat verschillende junit-tests om de RestClient-bewerkingen te valideren, zoals:* Verzend verzoek(… )* sendRequestWithCustomHeaders (…)* sendPOSTRequestWithJSONBody (…)openbare klasse RestClientTester breidt TestCase {uitprivé statisch definitief geheel getal PORT = 9098;privé statisch definitief geheel getal PORT2 = 9099;privé statisch definitief geheel getal PORT3 = 9097;openbare RestClientTester () {System.out.println ("Starten van de test RestClientTester");* Junit-test om het GET-verzoek van RestClient te valideren* Stappen:* 1) Maak een stub-server met behulp van het Restito-framework en configureer deze om op een bepaalde poort te luisteren* 2) Roep de methode sendGETRequest (…) van RestClient aan* 3) Restito registreert de overeenkomende GET-verzoeken die zijn verzonden, indien van toepassing.* 4) Valideer of Restito GET-verzoeken op een bepaald eindpunt heeft vastgelegd* Verwacht gedrag:*> Restito zou het GET-verzoek moeten hebben vastgelegd en het zou slechts één GET-verzoek moeten hebben vastgelegd.* Tenslotte:*> Stop de stub-server die restito is gestart.openbare ongeldige testGETRequestFromClient () {StubServer-server = null;proberen {// Dit start de stub-server op 'PORT' en reageert met HTTP 202 'ACCEPTED_202'TestUtil.restartRestitoServerForGETRequests (server, POORT, ACCEPTED_202);RestClient.sendGETRequest (PORT);LijstcallList = TestUtil.waitAndGetCallList (server, 30);assertTrue ("GET-verzoek is niet ontvangen van de RestClient. Test mislukt.",(callList! = null) && (callList.size () == 1));catch (uitzondering e) {e.printStackTrace ();fail ("Test mislukt vanwege uitzondering: + e);Tenslotte {if (server! = null) {server.stop ();
========== JAVA CODE Eindigt ===========
Stap 4) Hoe het GET-verzoek met Headers en POST-verzoek met de body te valideren met behulp van Restito-framework.
========== JAVA CODE Start ===========
* Junit-test om het GET-verzoek te valideren met headers van RestClient* Stappen:* 1) Maak een stub-server met behulp van het Restito-framework en configureer deze om op een bepaalde poort te luisteren* 2) Roep de methode sendGETRequestWithCustomHeaders (…) van RestClient aan* 3) Restito registreert de overeenkomende GET-verzoeken die zijn verzonden, indien van toepassing.* 4) Valideer of Restito GET-verzoeken op een bepaald eindpunt heeft vastgelegd* Verwacht gedrag:*> Restito zou het GET-verzoek moeten hebben vastgelegd, en het zou slechts één GET-verzoek moeten hebben vastgelegd.*> Haal de headers van het vastgelegde GET-verzoek op* en zorg ervoor dat de kopteksten overeenkomen met de geconfigureerde kopteksten.* Tenslotte:*> Stop de stub-server die restito is gestart.openbare ongeldige testGETRequestWithHeadersFromClient () {StubServer-server = null;proberen {// Dit start de stub-server op 'PORT' en reageert met HTTP 202 'ACCEPTED_202'TestUtil.restartRestitoServerForGETRequests (server, PORT2, ACCEPTED_202);RestClient.sendGETRequestWithCustomHeaders (PORT2);LijstcallList = TestUtil.waitAndGetCallList (server, 30);assertTrue ("GET-verzoek is niet ontvangen van de RestClient. Test mislukt.",(callList! = null) && (callList.size () == 1));// Valideer de headers van het GET-verzoek van REST ClientMap > headersFromRequest = callList.get (0) .getHeaders ();assertTrue ("GET-verzoek bevat header Accept en zijn waarde",headersFromRequest.get ("Accepteren"). bevat ("text / html"));assertTrue ("GET-verzoek bevat header-autorisatie en zijn waarde",headersFromRequest.get ("Autorisatie"). bevat ("Bearer 1234567890qwertyuiop"));assertTrue ("GET-verzoek bevat header Cache-Control en zijn waarde",headersFromRequest.get ("Cache-Control"). bevat ("no-cache"));assertTrue ("GET-verzoek bevat header Connection en zijn waarde",headersFromRequest.get ("Verbinding"). bevat ("keep-alive"));assertTrue ("GET-verzoek bevat header Content-Type en zijn waarde",headersFromRequest.get ("Content-Type"). contains ("application / json"));catch (uitzondering e) {e.printStackTrace ();fail ("Test mislukt vanwege uitzondering: + e);Tenslotte {if (server! = null) {server.stop ();
* Junit-test om het POST-verzoek te valideren met body en headers van RestClient* Stappen:* 1) Maak een stub-server met behulp van het Restito-framework en configureer deze om op een bepaalde poort te luisteren* 2) Roep de methode sendPOSTRequestWithJSONBody (…) van RestClient aan* 3) Restito legt de overeenkomende POST-verzoeken vast, indien van toepassing.* 4) Valideer of Restito POST-verzoeken op een bepaald eindpunt heeft vastgelegd* Verwacht gedrag:*> Restito zou het POST-verzoek moeten hebben vastgelegd en het zou slechts één POST-verzoek moeten hebben vastgelegd.*> Haal de body van het vastgelegde POST-verzoek op en valideer de JSON-waarden* Tenslotte:*> Stop de stub-server die restito is gestart.openbare ongeldige testPOSTRequestWithJSONBody () {StubServer-server = null;proberen {// Dit start de stub-server op 'PORT' en reageert met HTTP 202 'ACCEPTED_202'TestUtil.restartRestitoServerForPOSTRequests (server, PORT3, ACCEPTED_202);RestClient.sendPOSTRequestWithJSONBody (PORT3);LijstcallList = TestUtil.waitAndGetCallList (server, 30);assertTrue ("POST-verzoek is niet ontvangen van de RestClient. Test mislukt.",(callList! = null) && (callList.size () == 1));// Valideer de headers van het GET-verzoek van REST ClientString requestBody = callList.get (0) .getPostBody ();JSONObject postRequestJSON = nieuw JSONObject (requestBody);assertTrue ("De timeUpdated in json is incorrect",postRequestJSON.get ("timeUpdated"). toString (). equalsIgnoreCase ("1535703838478"));assertTrue ("Het access_token in json is onjuist",postRequestJSON.get ("access_token"). toString ().equalsIgnoreCase ("abf8714d-73a3-42ab-9df8-d13fcb92a1d8"));assertTrue ("De refresh_token in json is incorrect",postRequestJSON.get ("refresh_token"). toString ().equalsIgnoreCase ("d5a5ab08-c200-421d-ad46-2e89c2f566f5"));assertTrue ("Het token_type in json is incorrect",postRequestJSON.get ("token_type"). toString (). equalsIgnoreCase ("bearer"));assertTrue ("De expires_in in json is onjuist",postRequestJSON.get ("expires_in"). toString (). equalsIgnoreCase ("1024"));assertTrue ("De scope in json is incorrect",postRequestJSON.get ("scope"). toString (). equalsIgnoreCase (""));catch (uitzondering e) {e.printStackTrace ();fail ("Test mislukt vanwege uitzondering: + e);Tenslotte {if (server! = null) {server.stop ();
========== JAVA CODE Eindigt ===========
Voordelen van het gebruik van Restito Framework voor het testen van REST-clients
Hier zijn de voor- / voordelen van Restito Framework voor het testen van ReST-clients
- We hebben de daadwerkelijke REST-server niet nodig om te worden ontwikkeld om de REST-client te testen.
- Restito biedt sterke en gevarieerde hulpprogramma's en methoden om het verschillende gedrag van een server te bespotten. Bijvoorbeeld: om te testen hoe de REST-client zich gedraagt wanneer de server reageert met een HTTP 404-fout of HTTP 503-fout.
- Restito-servers kunnen in enkele milliseconden worden opgezet en kunnen worden beëindigd nadat de tests zijn voltooid.
- Restito ondersteunt alle soorten inhoud van de HTTP-methode, zoals gecomprimeerd, niet-gecomprimeerd, verenigd, applicatie / tekst, applicatie / JSON, etc.
Nadelen van het gebruik van Restito Framework voor het testen van REST-clients
Hier zijn de nadelen / nadeel van Restito Framework voor ReST-clienttests
- De REST-clientbron moet worden aangepast om 'localhost' als een servermachine te beschouwen.
- Het openen van de server in een willekeurige poort kan conflicteren als we een veelgebruikte poort gebruiken zoals '8080' of '9443' enz.
- Het wordt aanbevolen om poorten zoals 9092 of 9099 te gebruiken, die niet vaak worden gebruikt door andere tools.
Overzicht:
- REST staat voor "REpresentational State Transfer", een nieuwe standaard manier van communicatie tussen twee systemen op een bepaald moment.
- REST Client is een methode of een tool om een REST-service-API aan te roepen die wordt blootgesteld aan communicatie door een systeem of serviceprovider.
- In de RestServer-methode of een API die beschikbaar is voor communicatie door een systeem of serviceprovider.
- Restito is een lichtgewicht app om u te helpen bij het uitvoeren van elk soort HTTP-verzoek
- Maak een HTTP-client en -methode om een HTTP GET-verzoek naar een servereindpunt te verzenden
- Start een Restito-server om te luisteren en de verzoeken vast te leggen die naar het eindpunt 'getevents' worden gestuurd.
- Start een Restito-server om te luisteren en de verzoeken vast te leggen die naar het eindpunt 'getevents' in localhost worden gestuurd
- Hier hebben we voorbeelden geïmplementeerd voor automatiseringstests van alleen de REST-client.
- We hebben de daadwerkelijke REST-server niet nodig om te worden ontwikkeld om de REST-client te testen.
- De REST-clientbron moet worden aangepast om 'localhost' als een servermachine te beschouwen.
Dit artikel is bijgedragen door Chandrasekhar Muttineni