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

Wat is gerust?

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

Voor de testcommunity is API Automation Testing nog nieuw en niche. De complexiteit van JSON zorgt ervoor dat API-testen onontgonnen blijven. Maar dat maakt het niet minder belangrijk in het testproces. Rest Assured.io framework heeft het heel eenvoudig gemaakt met behulp van de basisbeginselen van Java, waardoor het heel wenselijk is om te leren.

Waarom heb je Rest-Assured nodig?

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 Rest Assured is automatiseringstesten van API's, het verzenden van eenvoudige https-verzoeken met gebruiksvriendelijke aanpassingen eenvoudig als je een basiskennis van Java hebt. Het is nodig om API-testen en integratietesten te begrijpen, maar na die automatisering geeft Rest Assured een zeer goed vertrouwen in de backend, terwijl front-end testen zich alleen kan richten op de UI en client-side-bewerkingen. Rest Assured is een open source met veel extra methoden en bibliotheken die zijn toegevoegd, waardoor het een geweldige keuze is voor API-automatisering.

Hoe u Rest Assured.io kunt instellen met Eclipse

Stap 1) Installeren Java. Raadpleeg dit gids

Stap 2) Download een IDE om te beginnen: eclips

Stap 3) Installeer Maven en stel uw Eclipse in. Raadpleeg 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
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 Java versie 9+ gebruikers:

<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 met 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.

Wees gerust-script

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 u goed kijkt, zult u opmerken dat er 3 queryparameters worden gebruikt, namelijk:

  1. Klanten ID
  2. Wachtwoord
  3. Account nummer

Rest Assured helpt ons om elk onderdeel (query, pad, headerparam) apart door te geven, waardoor de code leesbaarder en makkelijker te onderhouden is. Ook kunnen we de data van een extern bestand indien nodig 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
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
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
Uitvoer voor getResponseHeader

Zakkelijke behoefte:

Vaak moet u voor de volgende aanvraag het autorisatietoken of een sessiecookie gebruiken. Meestal worden deze gegevens als headers van het antwoord geretourneerd.

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
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
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
Uitvoer voor getSpecificPartOfResponse

Samenvatting

  • Rest Assured is een groep Java-bibliotheken waarmee we kunnen automatiseren Rest API-testen
  • Wees gerust Java-gebaseerd, en 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
  • De 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.