REST Assured-tutorial voor het testen van API-automatisering (voorbeeld)

Wat is gerust?

Wees gerust stelt u in staat REST API's te testen met behulp van Java-bibliotheken en is goed te integreren met Maven. Het beschikt over zeer efficiënte matchingtechnieken, dus het beweren van uw verwachte resultaten is ook vrij eenvoudig. Rest Assured heeft methoden om gegevens op te halen uit bijna elk deel van het verzoek en antwoord, ongeacht de complex de JSON-structuren zijn.

Voor de testgemeenschap is API Automation Testing nog steeds nieuw en een niche. De JSON-complexDoor deze problemen blijven API-testen onontgonnen. Maar dat maakt het niet minder belangrijk in het testproces. Het Rest Assured.io-framework heeft het heel eenvoudig gemaakt met behulp van de basisbeginselen van Java, waardoor het zeer wenselijk is om te leren.

Waarom gerust zijn?

Stel je voor dat je je Google Maps-weergave opent en zoekt naar een plaats waar je heen wilt, je ziet meteen restaurants in de buurt, je ziet opties voor het woon-werkverkeer; van een aantal toonaangevende reisaanbieders, en zie zoveel opties binnen handbereik. We weten allemaal dat het geen Google-producten zijn, maar hoe slaagt Google er dan in om dit te laten zien. Ze gebruiken de blootgestelde API's van deze providers. Als u nu wordt gevraagd dit soort instellingen te testen, zelfs voordat de gebruikersinterface is gebouwd of in ontwikkeling is, wordt het testen van API's uiterst belangrijk en het herhaaldelijk testen ervan, met verschillende datacombinaties, maakt het een zeer geschikt geval voor automatisering.


Eerder gebruikten we dynamische talen zoals groovy en ruby ​​om dit te bereiken, en dat was een uitdaging. Daarom werd API-testen niet onderzocht door functioneel testen.

Maar met behulp van Rest Assured is het automatiseren van het testen van API's en het verzenden van eenvoudige https-verzoeken met gebruiksvriendelijke aanpassingen eenvoudig als men een basisachtergrond van Java heeft. Het is nodig om API-tests en integratietests te begrijpen, maar post die automatisering Rest Assured geeft zeer goed vertrouwen op de backend, terwijl front-end-testen zich alleen kunnen concentreren op de gebruikersinterface en de bewerkingen aan de clientzijde. Rest Assured is een open source waaraan veel extra methoden en bibliotheken zijn toegevoegd, waardoor het een uitstekende keuze is geworden voor API-automatisering.

Hoe u Rest Assured.io kunt instellen met Eclipse

Stap 1) Installeer Java. Raadpleeg dit gids

Stap 2) Download een IDE om te beginnen: eclipse

Stap 3) Installeer Maven en stel uw eclipse. Verwijzen hier.

Installatie Wees gerust

  1. Maak een Maven-project in uw IDE. We gebruiken Intellij, maar u krijgt een vergelijkbare structuur op elke IDE die u gebruikt.
  2. Open uw POM.xml

Project structuur

Voor Rest Assured.io: Voor Java-versie < 9 gebruikers:

Voeg de onderstaande afhankelijkheid toe aan uw POM.xml:

<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>json-path</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>


<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>xml-path</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>


<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>json-schema-validator</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>

Voor Rest Assured.io: voor gebruikers van Java versie 9+:

<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured-all</artifactId>
<version>4.2.0</version>
<scope>test</scope>
</dependency>

Probleemoplossen:

Als u fouten ziet en niet zeker weet of de afhankelijkheden goed zijn gedownload,

  1. Voer een maven-build uit om alle afhankelijkheden te importeren, opnieuw zul je hulp vinden bij het instellen van Maven op guru99.
  2. Toch zie je fouten, voer dan een maven clean uit, gevolgd door een maven-installatie, en het zou zonder fouten moeten worden gebouwd.
  3. U kunt de onderstaande regels toevoegen aan uw Java-klasse en zien dat er geen compileerfouten zijn.
import io.restassured.RestAssured.*;
import io.restassured.matcher.RestAssuredMatchers.*;
import org.hamcrest.Matchers.*;

Eerste eenvoudige Rest Assured-script

Syntax:

De syntaxis van Rest Assured.io is het mooiste deel, omdat het erg BDD-achtig en begrijpelijk is.

Given(). 
        param("x", "y"). 
        header("z", "w").
when().
Method().
Then(). 
        statusCode(XXX).
        body("x, ”y", equalTo("z"));

Uitleg:

Code Uitleg
Gegeven() Met het trefwoord 'Gegeven' kunt u een achtergrond instellen. Hier geeft u de verzoekheaders, query- en padparam, body en cookies door. Dit is optioneel als deze items niet nodig zijn in de aanvraag
Wanneer() Het trefwoord 'wanneer' markeert het uitgangspunt van uw scenario. Bijvoorbeeld: 'wanneer' je iets krijgt/postt/plaatst, doe dan iets anders.
Methode() Vervang dit door een van de CRUD-bewerkingen (get/post/put/delete)
Dan() Hier vindt u uw assert- en matcher-voorwaarden

Nu je de instellingen en wat achtergrondinformatie over de syntaxis hebt, gaan we onze eerste eenvoudige test maken. Het is prima als de structuur tot nu toe nieuw voor je lijkt, terwijl je codeert en elke regel verder interpreteert, zul je het onder de knie krijgen.

Wat ga je halen?

Open uw browser en klik op – http://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1. Zorg ervoor dat u iets ziet zoals hieronder.

Als u een foutmelding krijgt in de browser wanneer u een antwoord op het verzoek probeert te krijgen,

  1. Kijk of je HTTPS of Http hebt gebruikt. Uw browser heeft mogelijk instellingen om onveilige websites niet te openen.
  2. Kijk of er een proxy of firewall is die ervoor zorgt dat uw browser geen websites kan openen.

*Note – je hebt hier geen headers, geen body en geen cookie gebruikt. Het was een URL en je krijgt ook inhoud van de API en plaatst of updatet geen bestaande inhoud, dus dat maakt het een GET-aanroep. Onthoud dit om onze eerste test beter te begrijpen.

Het doel van uw test:

Het doel van het script is om dezelfde uitvoer op uw IDE-console af te drukken als wat u via Rest Assured in de browser hebt ontvangen.

Laten we dit coderen met de onderstaande stappen:

Het antwoord krijgen Lichaam

Stap 1) Maak een klasse met de naam "myFirstRestAssuredClass"

Stap 2) Maak een methode genaamd “getResponseBody”

Stap 3) Vergelijkbaar met de eerder geleerde structuur van gegeven, typt u de onderstaande code wanneer en dan

gegeven(). -> Geen headers vereist, geen query- of padparameter.

wanneer(). -> Geen specifieke conditie-instellingen

krijgen('http://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1'). ->alleen de url hoeft opgegeven te worden

Dan(). -> Geen specifieke beweringen vereist

logboek(). all() -> Zodra al het antwoord is opgehaald, logt u het antwoord, de headers, in wezen alles wat het verzoek naar u terugstuurt.

public static void getResponseBody(){
   given().when().get("http://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1").then().log()
  .all();
 
}

Merk nu op dat de gebruikte URL lang en minder leesbaar is. Als je goed kijkt, zul je merken dat er 3 queryparameters worden gebruikt die

  1. Klanten ID
  2. Wachtwoord
  3. Account nummer

Wees gerust: het helpt ons elk onderdeel (query, pad, headerparam) afzonderlijk door te geven, waardoor de code beter leesbaar en gemakkelijker te onderhouden is. Ook kunnen we de gegevens uit een extern bestand naar wens parametriseren.

Voor het gebruik van queryparameters gaan we terug naar onze definitie van de syntaxis en zien dat ze allemaal worden doorgegeven als onderdeel van gegeven.

public static void getResponseBody(){
 
   given().queryParam("CUSTOMER_ID","68195")
           .queryParam("PASSWORD","1234!")
           .queryParam("Account_No","1")
           .when().get("http://demo.guru99.com/V4/sinkministatement.php").then().log()
           .body();
}

**Merk op dat we “body” hebben gebruikt in plaats van “all”; dit helpt ons om alleen de hoofdtekst van het antwoord te extraheren.

Output:

Uitvoer voor getResponseBody

De antwoordstatuscode ophalen

De volgende methode die we scripten, is om de statuscode op te halen en ook een bewering te plaatsen om deze te valideren.

Stap 1) Maak een methode met de naam getResponseStatus()

Stap 2) Gebruik dezelfde verzoekstructuur als hierboven. Kopieer en plak het.

Stap 3) In plaats van het te loggen, gebruiken we de 'getStatusCode' ingebouwde methode van Rest Assured om de statuscodewaarde op te halen

Stap 4) Om te bevestigen dat uw statuscode 200 is, gebruiken we de trefwoorden – assertThat().statusCode(expectedCode)

**Opmerking – URL is een variabele die wordt gebruikt voor de eenvoud. URL bevat de volledige URL van het API-verzoek

public static void getResponseStatus(){
   int statusCode= given().queryParam("CUSTOMER_ID","68195")
           .queryParam("PASSWORD","1234!")
           .queryParam("Account_No","1") .when().get("http://demo.guru99.com/V4/sinkministatement.php").getStatusCode();
   System.out.println("The response status is "+statusCode);

   given().when().get(url).then().assertThat().statusCode(200);
}

Output:

Uitvoer voor getResponseStatus

Zakkelijke behoefte

Een van de basisregels van automatisering is dat we controlepunten moeten plaatsen zodat de test alleen doorgaat als aan alle vereiste voorwaarden is voldaan. Bij API-testen is de meest elementaire validatie het controleren of de statuscode van het verzoek het 2XX-formaat heeft.

De volledige code tot nu toe:

import java.util.ArrayList;
import static io.restassured.RestAssured.*;
import static java.util.concurrent.TimeUnit.MILLISECONDS;

public class myFirstRestAssuredClass {

   final static String url="http://demo.guru99.com/V4/sinkministatement.php?CUSTOMER_ID=68195&PASSWORD=1234!&Account_No=1";

   public static void main(String args[]) {

     getResponseBody();
     getResponseStatus();

; }

   //This will fetch the response body as is and log it. given and when are optional here
   public static void getResponseBody(){
       given().when().get(url).then().log()
      .all();

  given().queryParam("CUSTOMER_ID","68195")
               .queryParam("PASSWORD","1234!")
               .queryParam("Account_No","1") .when().get("http://demo.guru99.com/V4/sinkministatement.php").then().log().body();
   }

public static void getResponseStatus(){
   int statusCode= given().queryParam("CUSTOMER_ID","68195")
           .queryParam("PASSWORD","1234!")
           .queryParam("Account_No","1")
           .when().get("http://demo.guru99.com/V4/sinkministatement.php").getStatusCode();
   System.out.println("The response status is "+statusCode);

   given().when().get(url).then().assertThat().statusCode(200);
}

}

* Opmerking:

  1. 200 is een succesvol antwoord op dit scenario. Soms moet het verzoek ook mislukken, en dan kun je 4XX of 5XX gebruiken. Probeer de statuscode te wijzigen door ongeldige parameters op te geven en controleer.
  2. Wanneer we een voorwaarde stellen, wordt er niet afgedrukt op de console, tenzij er een fout optreedt.

Script om verschillende delen van een antwoord op te halen

Het ophalen van de antwoordtekst en de antwoordstatuscode wordt al behandeld in het bovenstaande segment. Het is vermeldenswaard dat om verschillende delen van het antwoord op te halen, het trefwoord 'extract' erg belangrijk is.

Voorvoegsel

Rest Assured is een zeer eenvoudige taal en het ophalen van headers is net zo eenvoudig. De naam van de methode is headers(). Net als voorheen zullen we een zelfstandige methode creëren om hetzelfde te doen.

public static void getResponseHeaders(){
   System.out.println("The headers in the response "+
                   get(url).then().extract()
           .headers());
}

Houd er rekening mee dat 'given().when()' hier wordt overgeslagen en dat de coderegel begint met get(). Dit komt omdat er hier geen voorwaarde of verificatie is gemaakt om op het verzoek te klikken en een antwoord te krijgen. In dergelijke gevallen is het optioneel om hetzelfde te gebruiken.

Output:

Uitvoer voor getResponseHeader

Zakkelijke behoefte:

Heel vaak moet u het autorisatietoken of een sessiecookie gebruiken voor het volgende verzoek, en meestal zijn deze details worden geretourneerd als headers van het antwoord.

Reactietijd

Om de tijd te verkrijgen die nodig is om het antwoord van de backend of andere downstream-systemen op te halen, biedt Rest Assured een methode genaamd 'timeIn' met een geschikte timeUnit om de tijd te verkrijgen die nodig is om het antwoord te retourneren.

public static void getResponseTime(){
  System.out.println("The time taken to fetch the response "+get(url)
         .timeIn(TimeUnit.MILLISECONDS) + " milliseconds");
}

Output:

Uitvoer voor getResponseTime

Zakkelijke behoefte:

Een zeer belangrijk kenmerk van het testen van API's is hun responstijd, om de prestaties van de applicatie te meten. Houd er rekening mee dat de tijd die nodig is voor uw oproep langer of korter kan duren, afhankelijk van uw internetsnelheid, de prestaties van de API op dat moment, de serverbelasting en andere factoren die van invloed zijn op de tijd.

Content-Type

U kunt het inhoudstype van het geretourneerde antwoord verkrijgen met behulp van de methode “contentType ()”.

public static void getResponseContentType(){
   System.out.println("The content type of response "+
           get(url).then().extract()
              .contentType());
}

uitgang

Uitvoer voor getContentType

Zakkelijke behoefte:

Soms is het verkrijgen van het inhoudstype essentieel om ervoor te zorgen dat er geen beveiligingslekken zijn voor eventuele cross-origin-bedreigingen of om er zeker van te zijn dat de doorgegeven inhoud voldoet aan de normen van de API.

Afzonderlijk JSON-element ophalen

Uit het gegeven antwoord wordt u gevraagd het totale bedrag te berekenen. U moet elk bedrag ophalen en optellen.

Stappen:

Stap 1) Het bedragveld bevindt zich in een array met sleutel “statements” die op zijn beurt in de lijst staat met sleutel “resultaat”

Stap 2) Wees gerust, biedt een mechanisme om de waarden in de API te bereiken met behulp van “pad”

Stap 3) Het pad om bedragen te bereiken is “result.statements.AMOUNT”. Zie het als Xpath in selenium.

Stap 4) Haal alle bedragen in een verzameling op en loop vervolgens alle waarden door om de som te berekenen

public static void getSpecificPartOfResponseBody(){

ArrayList<String> amounts = when().get(url).then().extract().path("result.statements.AMOUNT") ;
int sumOfAll=0;
for(String a:amounts){

    System.out.println("The amount value fetched is "+a);
    sumOfAll=sumOfAll+Integer.valueOf(a);
}
System.out.println("The total amount is "+sumOfAll);

}

Opmerking: aangezien de bedragwaarde een stringgegevenstype is, converteren we naar een geheel getal en gebruiken we deze voor optelling.

Output:

Uitvoer voor getSpecificPartOfResponse

Overzicht:

  • Rest Assured is een groep Java-bibliotheken waarmee we kunnen automatiseren Rest API-testen
  • Rest Assured is gebaseerd op Java en heeft kennis van de kern Java volstaat om het te leren
  • Het helpt bij het ophalen van waarden van aanvragen en antwoorden uit ingewikkelde JSON-structuren
  • Het API verzoek kan worden aangepast met een verscheidenheid aan headers, query's, padparameters en elke sessie of cookies die kunnen worden ingesteld.
  • Het helpt bij het stellen van beweringen en voorwaarden.
  • Hoewel Rest Assured erg nuttig is als het antwoord van het JSON-type is, werken de methoden mogelijk niet naadloos als het inhoudstype HTML of platte tekst is.