REST Client Testing με χρήση του Restito Tool: Τι είναι το Rest Client;
Τι είναι το REST;
ΠΕΡΙΦΕΡΕΙΑ σημαίνει "Representational State Transfer", που είναι ένας νέος τρόπος επικοινωνίας μεταξύ οποιωνδήποτε δύο συστημάτων σε μια δεδομένη χρονική στιγμή. Το ένα από τα συστήματα ονομάζεται «REST Client» και το άλλο ονομάζεται «REST Server».
Πριν μάθουμε για τη δοκιμή πελατών Restito Framework για REST, ας μάθουμε πρώτα μερικά βασικά.
Τι είναι το REST Client;
Το REST Client είναι μια μέθοδος ή ένα εργαλείο για την κλήση ενός API υπηρεσίας REST που εκτίθεται για επικοινωνία από οποιοδήποτε σύστημα ή πάροχο υπηρεσιών. Για παράδειγμα: εάν ένα API εκτεθεί για λήψη πληροφοριών κυκλοφορίας σε πραγματικό χρόνο σχετικά με μια διαδρομή από την Google, το λογισμικό/εργαλείο που καλεί το API κυκλοφορίας Google ονομάζεται πελάτης REST.
Τι είναι ο διακομιστής REST;
Είναι μια μέθοδος ή ένα API που εκτίθεται στην επικοινωνία από οποιοδήποτε σύστημα ή πάροχο υπηρεσιών. Για παράδειγμα, η Google εκθέτει ένα API για να λαμβάνει πληροφορίες κυκλοφορίας σε πραγματικό χρόνο σε μια δεδομένη διαδρομή.
Εδώ, ο διακομιστής Google πρέπει να είναι έτοιμος και να λειτουργεί για να ακούει τυχόν αιτήματα για το εκτεθειμένο API από διαφορετικούς πελάτες.
Παράδειγμα:
Είναι καιρός να δημιουργηθεί ένα πλήρες σενάριο End-to-End από τους παραπάνω ορισμούς.
Ας εξετάσουμε τις εφαρμογές κράτησης ταξί όπως η Uber, καθώς μια εταιρεία χρειάζεται πληροφορίες σε πραγματικό χρόνο για την κατάσταση της κυκλοφορίας γύρω από τις διαδρομές στις οποίες βρίσκεται ένα συγκεκριμένο όχημα.
Υπόλοιπος πελάτης:
Εδώ ο πελάτης είναι μια εφαρμογή Uber για κινητά στην οποία έχει συνδεθεί ο οδηγός. Αυτή η εφαρμογή στέλνει ένα αίτημα στο REST API που εκτίθεται από τους χάρτες Google για να λάβει τα δεδομένα σε πραγματικό χρόνο. Για παράδειγμα, ένα αίτημα HTTP GET.
Υπόλοιπος διακομιστής:
Σε αυτό το παράδειγμα, η Google είναι ο πάροχος υπηρεσιών και το API των χαρτών Google απαντά με τις απαιτούμενες λεπτομέρειες στο αίτημα της εφαρμογής Uber.
Τόσο ο πελάτης όσο και ο διακομιστής είναι εξίσου σημαντικοί στην επικοινωνία REST.
Εδώ, έχουμε εφαρμόσει παραδείγματα για δοκιμές αυτοματισμού μόνο του REST Client. Για τη δοκιμή του διακομιστή REST, ανατρέξτε στο https://www.guru99.com/top-6-api-testing-tool.html.
Τι είναι το Restito;
Το Restito είναι ένα πλαίσιο που αναπτύχθηκε από την Mkotsur. Είναι μια ελαφριά εφαρμογή που σας βοηθά να εκτελέσετε οποιοδήποτε είδος αιτήματος HTTP. Μπορείτε να χρησιμοποιήσετε το Restito για να δοκιμάσετε τα REST API και να αναζητήσετε προβλήματα στην εφαρμογή σας ή στο δίκτυό σας.
Πώς να δοκιμάσετε τον πελάτη REST χρησιμοποιώντας το Restito;
Ας χωρίσουμε την άσκηση στα ακόλουθα 4 βήματα:
- Δημιουργήστε έναν πελάτη HTTP και μια μέθοδο για να στείλετε ένα αίτημα HTTP GET σε οποιοδήποτε τελικό σημείο διακομιστή. Προς το παρόν, θεωρήστε ότι το τελικό σημείο είναι
http://localhost:9092/getevents
.
- Ξεκινήστε έναν διακομιστή Restito για να ακούσετε και να καταγράψετε τα αιτήματα που αποστέλλονται στο τελικό σημείο 'getevents' στο localhost
http://localhost:9092/getevents
.
- Δημιουργήστε μια κλάση δοκιμής για να δοκιμάσετε τον παραπάνω πελάτη. Επικαλέστε τη μέθοδο «sendGETRequest» του πελάτη HTTP για να εκκινήσετε ένα αίτημα GET στο «getevents» του API.
- Επικυρώστε την κλήση HTTP GET χρησιμοποιώντας το πλαίσιο Restito.
Ας εμβαθύνουμε σε καθένα από τα παραπάνω βήματα.
Βήμα 1) Δημιουργήστε έναν πελάτη HTTP και μια μέθοδο για να στείλετε αίτημα HTTP GET σε οποιοδήποτε τελικό σημείο διακομιστή.
========== JAVA CODE Ξεκινά ============
package 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; /** * This class creates a HTTP Client and has a method to send HTTP GET request: * sendGETRequest(..) */ public class RestClient { /** * Constructor for the class RestClient */ public RestClient() { System.out.println("Creating RestClient constructor"); } /** * Method to Send GET request to http://localhost:<<port>>/getevents * @param port * @return true if GET request is successfully sent. False, otherwise. */ public static boolean sendGETRequest(int port) { try { HttpClient client = HttpClientBuilder.create().build(); HttpGet getRequest = new HttpGet("http://localhost:" + port + "/getevents"); //HttpResponse response = client.execute(request); client.execute(getRequest); System.out.println("HTTP request is sent successfully." + "Returning True"); return true; } catch (Exception e) { e.printStackTrace(); } System.out.println("Some exception has occurred during the HTTP Client creation." + "Returning false"); return false; } }
========== JAVA CODE Τέλος ============
Βήμα 2) Ξεκινήστε έναν διακομιστή Restito για να ακούσετε και να καταγράψετε τα αιτήματα που αποστέλλονται στο τελικό σημείο 'getevents' στο localhost http://localhost:9092/getevents
.
========== JAVA CODE Ξεκινά ============
package 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; /** * This utility class contains several utility methods like : * restartRestitoServerForGETRequests(..) * restartRestitoServerForPOSTRequests(..) * waitAndGetCallList(..) * * @author cham6 * @email: paperplanes.chandra@gmail.com * @fork: https://github.com/cham6/restfultesting.git * */ public class TestUtil { /** * Utility method to start restito stub server to accept GET requests * @param server * @param port * @param status */ public static void restartRestitoServerForGETRequests (StubServer server, int port, HttpStatus status) { // Kill the restito server if (server != null) { server.stop(); } // Initialize and configure a newer instance of the stub server server = new StubServer(port).run(); whenHttp(server).match(get("/getevents")).then(status(status)); } /** * Utility method to start restito stub server to accept POST requests * @param server * @param port * @param status */ public static void restartRestitoServerForPOSTRequests (StubServer server, int port, HttpStatus status) { // Kill the restito server if (server != null) { server.stop(); } // Initialize and configure a newer instance of the stub server server = new StubServer(port).run(); whenHttp(server).match(post("/postevents")).then(status(status)); } /** * For a given restito stub server, loop for the given amount of seconds and * break and return the call list from server. * * @param server * @param waitTimeInSeconds * @return * @throws InterruptedException */ public static List<Call> waitAndGetCallList (StubServer server, int waitTimeInSeconds) throws InterruptedException { int timeoutCount = 0; List<Call> callList = server.getCalls(); while (callList.isEmpty()) { Thread.sleep(1000); timeoutCount++; if (timeoutCount >= waitTimeInSeconds) { break; } callList = server.getCalls(); } // Wait for 2 seconds to get all the calls into callList to Eliminate any falkyness. Thread.sleep(2000); return server.getCalls(); } }
========== JAVA CODE Τέλος ============
Βήμα 3) Δημιουργήστε μια κλάση δοκιμής για να δοκιμάσετε τον παραπάνω πελάτη. Επικαλέστε τη μέθοδο SendGETRequest-πελάτη HTTP για να εκκινήσετε ένα αίτημα GET στο «getevents» του API.
========== JAVA CODE Ξεκινά ============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; /** * This class contains several junit tests to validate the RestClient operations like: * sendRequest(..) * sendRequestWithCustomHeaders(..) * sendPOSTRequestWithJSONBody(..) * */ public class RestClientTester extends TestCase { private static final Integer PORT = 9098; private static final Integer PORT2 = 9099; private static final Integer PORT3 = 9097; public RestClientTester() { System.out.println("Starting the test RestClientTester"); } /** * Junit test to validate the GET request from RestClient * Steps: * 1) Create a stub server using Restito framework and configure it to listen on given port * 2) Invoke the sendGETRequest(..) method of RestClient * 3) Restito captures the matching GET requests sent, if any. * 4) Validate if Restito has captured any GET requests on given endpoint * Expected Behavior: * > Restito should have captured GET request and it should have captured only one GET request. * Finally: * > Stop the stub server started using restito. */ public void testGETRequestFromClient() { StubServer server = null; try { //This will start the stub server on 'PORT' and responds with HTTP 202 'ACCEPTED_202' TestUtil.restartRestitoServerForGETRequests(server, PORT, ACCEPTED_202); RestClient.sendGETRequest(PORT); List<Call> callList = TestUtil.waitAndGetCallList(server, 30); assertTrue("GET request is not received from the RestClient. Test failed.", (callList != null) && (callList.size() == 1)); } catch(Exception e) { e.printStackTrace(); fail("Test Failed due to exception : " + e); } finally { if(server != null) { server.stop(); } } }
========== JAVA CODE Τέλος ============
Βήμα 4) Πώς να επικυρώσετε το αίτημα GET με τις κεφαλίδες και το αίτημα POST με το σώμα χρησιμοποιώντας το πλαίσιο Restito.
========== JAVA CODE Ξεκινά ============
/** * Junit test to validate the GET request with headers from RestClient * Steps: * 1) Create a stub server using Restito framework and configure it to listen on given port * 2) Invoke the sendGETRequestWithCustomHeaders(..) method of RestClient * 3) Restito captures the matching GET requests sent, if any. * 4) Validate if Restito has captured any GET requests on a given endpoint * Expected Behavior: * > Restito should have captured GET request, and it should have captured only one GET request. * > Get the headers of the captured GET request * and make sure the headers match to the ones configured. * Finally: * > Stop the stub server started using restito. */ public void testGETRequestWithHeadersFromClient() { StubServer server = null; try { //This will start the stub server on 'PORT' and responds with HTTP 202 'ACCEPTED_202' TestUtil.restartRestitoServerForGETRequests(server, PORT2, ACCEPTED_202); RestClient.sendGETRequestWithCustomHeaders(PORT2); List<Call> callList = TestUtil.waitAndGetCallList(server, 30); assertTrue("GET request is not received from the RestClient. Test failed.", (callList != null) && (callList.size() == 1)); //Validate the headers of the GET request from REST Client Map<String, List<String>> headersFromRequest = callList.get(0).getHeaders(); assertTrue("GET request contains header Accept and its value ", headersFromRequest.get("Accept").contains("text/html")); assertTrue("GET request contains header Authorization and its value ", headersFromRequest.get("Authorization").contains("Bearer 1234567890qwertyuiop")); assertTrue("GET request contains header Cache-Control and its value ", headersFromRequest.get("Cache-Control").contains("no-cache")); assertTrue("GET request contains header Connection and its value ", headersFromRequest.get("Connection").contains("keep-alive")); assertTrue("GET request contains header Content-Type and its value ", headersFromRequest.get("Content-Type").contains("application/json")); } catch(Exception e) { e.printStackTrace(); fail("Test Failed due to exception : " + e); } finally { if(server != null) { server.stop(); } } }
/** * Junit test to validate the POST request with body and headers from RestClient * Steps: * 1) Create a stub server using Restito framework and configure it to listen on given port * 2) Invoke the sendPOSTRequestWithJSONBody(..) method of RestClient * 3) Restito captures the matching POST requests sent, if any. * 4) Validate if Restito has captured any POST requests on given endpoint * Expected Behavior: * > Restito should have captured POST request and it should have captured only one POST request. * > Get the body of the captured POST request and validate the JSON values * Finally: * > Stop the stub server started using restito. */ public void testPOSTRequestWithJSONBody() { StubServer server = null; try { //This will start the stub server on 'PORT' and responds with HTTP 202 'ACCEPTED_202' TestUtil.restartRestitoServerForPOSTRequests(server, PORT3, ACCEPTED_202); RestClient.sendPOSTRequestWithJSONBody(PORT3); List<Call> callList = TestUtil.waitAndGetCallList(server, 30); assertTrue("POST request is not received from the RestClient. Test failed.", (callList != null) && (callList.size() == 1)); //Validate the headers of the GET request from REST Client String requestBody = callList.get(0).getPostBody(); JSONObject postRequestJSON = new JSONObject(requestBody); assertTrue("The timeUpdated in json is incorrect", postRequestJSON.get("timeUpdated").toString().equalsIgnoreCase("1535703838478")); assertTrue("The access_token in json is incorrect", postRequestJSON.get("access_token").toString(). equalsIgnoreCase("abf8714d-73a3-42ab-9df8-d13fcb92a1d8")); assertTrue("The refresh_token in json is incorrect", postRequestJSON.get("refresh_token").toString(). equalsIgnoreCase("d5a5ab08-c200-421d-ad46-2e89c2f566f5")); assertTrue("The token_type in json is incorrect", postRequestJSON.get("token_type").toString().equalsIgnoreCase("bearer")); assertTrue("The expires_in in json is incorrect", postRequestJSON.get("expires_in").toString().equalsIgnoreCase("1024")); assertTrue("The scope in json is incorrect", postRequestJSON.get("scope").toString().equalsIgnoreCase("")); } catch(Exception e) { e.printStackTrace(); fail("Test Failed due to exception : " + e); } finally { if(server != null) { server.stop(); } } } }
========== JAVA CODE Τέλος ============
Πλεονεκτήματα της χρήσης του Restito Framework για δοκιμές πελάτη REST
Ακολουθούν τα πλεονεκτήματα/πλεονεκτήματα του Restito Framework για τη δοκιμή πελατών ReST
- Δεν χρειάζεται να αναπτυχθεί ο πραγματικός διακομιστής REST για τη δοκιμή του προγράμματος-πελάτη REST.
- Το Restito παρέχει ισχυρά και ποικίλα βοηθητικά προγράμματα και μεθόδους για την κοροϊδία της διαφορετικής συμπεριφοράς ενός διακομιστή. Για παράδειγμα: Για να ελέγξετε πώς συμπεριφέρεται ο πελάτης REST όταν ο διακομιστής αποκρίνεται με σφάλμα HTTP 404 ή σφάλμα HTTP 503.
- Οι διακομιστές Restito μπορούν να ρυθμιστούν σε λίγα χιλιοστά του δευτερολέπτου και μπορούν να τερματιστούν μετά την ολοκλήρωση των δοκιμών.
- Το Restito υποστηρίζει όλους τους τύπους περιεχομένων της μεθόδου HTTP, όπως συμπιεσμένο, μη συμπιεσμένο, ενοποιημένο, εφαρμογή/κείμενο, εφαρμογή/JSON κ.λπ.
Μειονεκτήματα της χρήσης του Restito Framework για δοκιμές πελάτη REST
Ακολουθούν τα μειονεκτήματα/μειονεκτήματα του Restito Framework για τη δοκιμή πελάτη ReST
- Η πηγή προγράμματος-πελάτη REST θα πρέπει να τροποποιηθεί ώστε να θεωρείται το "localhost" ως μηχάνημα διακομιστή.
- Το άνοιγμα του διακομιστή σε οποιαδήποτε θύρα ενδέχεται να έρχεται σε διένεξη εάν χρησιμοποιήσουμε κάποια θύρα που χρησιμοποιείται συνήθως, όπως "8080" ή "9443" κ.λπ.
- Συνιστάται να χρησιμοποιείτε θύρες όπως 9092 ή 9099, οι οποίες δεν χρησιμοποιούνται συνήθως από άλλα εργαλεία.
Σύνοψη
- Το REST σημαίνει «Αντιπροσωπευτική Μεταφορά Πολιτείας» που είναι ένας νέος τυπικός τρόπος επικοινωνίας μεταξύ οποιωνδήποτε δύο συστημάτων σε μια δεδομένη χρονική στιγμή.
- Το REST Client είναι μια μέθοδος ή ένα εργαλείο για την κλήση ενός API υπηρεσίας REST που εκτίθεται σε επικοινωνία από οποιοδήποτε σύστημα ή πάροχο υπηρεσιών.
- Στη μέθοδο RestServer ή σε ένα API που εκτίθεται για επικοινωνία από οποιοδήποτε σύστημα ή πάροχο υπηρεσιών.
- Το Restito είναι μια ελαφριά εφαρμογή που σας βοηθά να εκτελέσετε οποιοδήποτε είδος αιτήματος HTTP
- Δημιουργήστε έναν πελάτη HTTP και μια μέθοδο για να στείλετε ένα αίτημα HTTP GET σε οποιοδήποτε τελικό σημείο διακομιστή
- Ξεκινήστε έναν διακομιστή Restito για να ακούσετε και να καταγράψετε τα αιτήματα που αποστέλλονται στο τελικό σημείο «getevents».
- Ξεκινήστε έναν διακομιστή Restito για να ακούσετε και να καταγράψετε τα αιτήματα που αποστέλλονται στο τελικό σημείο 'getevents' στο localhost
- Εδώ, έχουμε εφαρμόσει παραδείγματα για δοκιμές αυτοματισμού μόνο του REST Client.
- Δεν χρειάζεται να αναπτυχθεί ο πραγματικός διακομιστής REST για τη δοκιμή του προγράμματος-πελάτη REST.
- Η πηγή προγράμματος-πελάτη REST θα πρέπει να τροποποιηθεί ώστε να θεωρείται το "localhost" ως μηχάνημα διακομιστή.