Reactiegegevens ophalen en verifiëren met REST-assured

REST Top

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS

1. Overzicht

In deze zelfstudie bespreken we hoe u REST-services kunt testen met behulp van REST-assured, met de nadruk op het vastleggen en valideren van de responsgegevens van onze REST API's.

2. Opstelling voor de testklas

In eerdere tutorials hebben we REST-assured in het algemeen verkend, en we hebben laten zien hoe aanvraagheaders, cookies en parameters kunnen worden gemanipuleerd.

Voortbouwend op deze bestaande opstelling hebben we een eenvoudige REST-controller toegevoegd, AppController, die intern een dienst oproept, AppService. We zullen deze klassen gebruiken in onze testvoorbeelden.

Om onze testklasse te maken, moeten we wat meer instellingen doen. Sinds we hebben spring-boot-starter-test in ons klassenpad kunnen we gemakkelijk gebruikmaken van Spring-testhulpprogramma's.

Laten we eerst het skelet van ons maken AppControllerIntegrationTest klasse:

@RunWith (SpringRunner.class) @SpringBootTest (webEnvironment = WebEnvironment.RANDOM_PORT) openbare klasse AppControllerIntegrationTest {@LocalServerPort privé int-poort; particuliere String uri; @PostConstruct public void init () {uri = "// localhost:" + poort; } @MockBean AppService appService; // testgevallen}

In deze JUnit-test hebben we onze klas geannoteerd met een aantal Spring-specifieke annotaties die de applicatie lokaal in een willekeurig beschikbare poort laten draaien. In @PostConstruct, hebben we de volledige URI vastgelegd waarop we REST-aanroepen zullen doen.

We gebruikten ook @RTLnieuws Aan AppService, omdat we deze klasse moeten bespotten.

3. Validatie van de JSON-reactie

JSON is het meest gebruikte formaat in REST API's om gegevens uit te wisselen. Reacties kunnen bestaan ​​uit een enkel JSON-object of een reeks JSON-objecten. We zullen beide in deze sectie bekijken.

3.1. Eén JSON-object

Laten we zeggen dat we het / film / {id} eindpunt, dat een Film JSON-object als het ID kaart is gevonden.

We zullen bespotten AppService oproepen om enkele nepgegevens te retourneren met behulp van het Mockito-framework:

@Test openbare leegte gegevenMovieId_whenMakingGetRequestToMovieEndpoint_thenReturnMovie () {Film testMovie = nieuwe film (1, "movie1", "summary1"); wanneer (appService.findMovie (1)). thenReturn (testMovie); get (uri + "/ movie /" + testMovie.getId ()). then () .assertThat () .statusCode (HttpStatus.OK.value ()) .body ("id", equalTo (testMovie.getId ()) ) .body ("naam", equalTo (testMovie.getName ())) .body ("synopsis", notNullValue ()); }

Hierboven bespotten we eerst de appService.findMovie (1) oproep om een ​​object terug te sturen. Vervolgens hebben we onze REST-URL geconstrueerd in het krijgen() methode geleverd door REST-assured voor het doen van GET-verzoeken. Ten slotte hebben we vier beweringen gedaan.

Eerste, we hebben de antwoordstatuscode gecontroleerd en vervolgens de lichaam elementen. We gebruiken Hamcrest om de verwachte waarde te bevestigen.

Merk ook op dat als het antwoord JSON genest is, we een geneste sleutel kunnen testen met behulp van de punt operator zoals "Key1.key2.key3".

3.2. Het JSON-antwoord extraheren na validatie

In sommige gevallen moeten we het antwoord na validatie extraheren om er aanvullende bewerkingen op uit te voeren.

We kunnen het JSON-antwoord naar een klasse extraheren met behulp van de extract() methode:

Filmresultaat = get (uri + "/ movie /" + testMovie.getId ()). Dan () .assertThat () .statusCode (HttpStatus.OK.value ()) .extract () .as (Movie.class); assertThat (resultaat) .isEqualTo (testMovie);

In dit voorbeeld hebben we REST-assured gevraagd om het JSON-antwoord te extraheren naar een Film object en vervolgens bevestigd op het geëxtraheerde object.

We kunnen ook het hele antwoord extraheren op een Draad, de ... gebruiken extract (). asString () API:

String responseString = get (uri + "/ movie /" + testMovie.getId ()). Then () .assertThat () .statusCode (HttpStatus.OK.value ()) .extract () .asString (); assertThat (responseString) .isNotEmpty ();

Tenslotte, we kunnen ook een bepaald veld uit de antwoord-JSON halen.

Laten we eens kijken naar een test voor een POST API die een Film JSON body en zal hetzelfde retourneren als het met succes is ingevoegd:

@Test openbare leegte gegevenMovie_whenMakingPostRequestToMovieEndpoint_thenCorrect () {Kaartverzoek = nieuwe HashMap (); request.put ("id", "11"); request.put ("naam", "film1"); request.put ("synopsis", "summary1"); int movieId = given (). contentType ("application / json") .body (request) .when () .post (uri + "/ movie") .then () .assertThat () .statusCode (HttpStatus.CREATED.value ()) .extract () .path ("id"); assertThat (movieId) .isEqualTo (11); }

Hierboven hebben we eerst het verzoekobject gemaakt dat we moeten POSTEN. Vervolgens hebben we het ID kaart veld uit het geretourneerde JSON-antwoord met behulp van de pad() methode.

3.3. JSON-matrix

We kunnen het antwoord ook verifiëren als het een JSON-array is:

@Test openbare leegte whenCallingMoviesEndpoint_thenReturnAllMovies () {Set movieSet = nieuwe HashSet (); movieSet.add (nieuwe film (1, "movie1", "summary1")); movieSet.add (nieuwe film (2, "movie2", "summary2")); wanneer (appService.getAll ()). thenReturn (movieSet); get (uri + "/ movies"). then () .statusCode (HttpStatus.OK.value ()) .assertThat () .body ("size ()", is (2)); }

We hebben opnieuw eerst de spot gedreven met de appService.getAll () met wat gegevens en een verzoek gedaan aan ons eindpunt. We beweerden toen het status code en grootte van onze antwoordreeks.

Dit kan weer worden gedaan via extractie:

Movie [] movies = get (uri + "/ movies"). Dan () .statusCode (200) .extract () .as (Movie []. Class); assertThat (movies.length) .isEqualTo (2);

4. Kopteksten en cookies valideren

We kunnen een header of cookie van het antwoord verifiëren met behulp van methoden met dezelfde naam:

@Test openbare void whenCallingWelcomeEndpoint_thenCorrect () {get (uri + "/ welcome"). Then () .assertThat () .header ("sessionId", notNullValue ()) .cookie ("token", notNullValue ()); }

We kunnen de headers en cookies ook afzonderlijk extraheren:

Antwoordantwoord = get (uri + "/ welkom"); String headerName = response.getHeader ("sessionId"); String cookieValue = response.getCookie ("token"); assertThat (headerName) .isNotBlank (); assertThat (cookieValue) .isNotBlank ();

5. Valideren van bestanden

Als onze REST API een bestand retourneert, kunnen we de asByteArray () methode om het antwoord te extraheren:

Bestandsbestand = nieuwe ClassPathResource ("test.txt"). GetFile (); long fileSize = file.length (); when (appService.getFile (1)). thenReturn (bestand); byte [] resultaat = get (uri + "/ download / 1"). asByteArray (); assertThat (resultaat.lengte) .isEqualTo (bestandsgrootte);

Hier hebben we eerst de spot gedreven appService.getFile (1) om een ​​tekstbestand te retourneren dat aanwezig is in ons src / test / resources pad. We hebben vervolgens een oproep gedaan naar ons eindpunt en het antwoord geëxtraheerd in een byte[], die we vervolgens beweerden de verwachte waarde te hebben.

6. Conclusie

In deze zelfstudie hebben we verschillende manieren onderzocht om reacties van onze REST API's vast te leggen en te valideren met behulp van REST-assured.

Zoals gewoonlijk is de code in dit artikel beschikbaar op Github.

REST onder

Ik heb zojuist het nieuwe aangekondigd Leer de lente natuurlijk, gericht op de basisprincipes van Spring 5 en Spring Boot 2:

>> BEKIJK DE CURSUS

$config[zx-auto] not found$config[zx-overlay] not found