Een gids voor REST-verzekerd

Jackson 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. Inleiding

REST-assured is ontworpen om het testen en valideren van REST API's te vereenvoudigen en wordt sterk beïnvloed door testtechnieken die worden gebruikt in dynamische talen zoals Ruby en Groovy.

De bibliotheek heeft solide ondersteuning voor HTTP, natuurlijk beginnend met de werkwoorden en standaard HTTP-bewerkingen, maar gaat ook veel verder dan deze basisprincipes.

In deze gids gaan we dat doen verken REST-verzekerd en we gaan Hamcrest gebruiken om beweringen te doen. Als je nog niet bekend bent met Hamcrest, moet je eerst de tutorial opfrissen: Testen met Hamcrest.

Bekijk ook onze andere artikelen voor meer informatie over meer geavanceerde gebruiksscenario's van REST-assured:

  • REST-verzekerd met Groovy
  • JSON-schema-validatie met REST-verzekerd
  • Parameters, kopteksten en cookies met REST-verzekerd

Laten we nu eens kijken naar een eenvoudig voorbeeld.

2. Eenvoudige voorbeeldtest

Voordat we beginnen, moeten we ervoor zorgen dat onze tests de volgende statische import hebben:

io.restassured.RestAssured. * io.restassured.matcher.RestAssuredMatchers. * org.hamcrest.Matchers. *

Dat hebben we nodig om tests eenvoudig te houden en gemakkelijk toegang te hebben tot de belangrijkste API's.

Laten we nu beginnen met het eenvoudige voorbeeld - een eenvoudig goksysteem dat enkele gegevens voor games blootlegt:

{"id": "390", "data": {"leagueId": 35, "homeTeam": "Norway", "visitingTeam": "England",}, "odds": [{"price": "1.30 "," name ":" 1 "}, {" price ":" 5.25 "," name ":" X "}]}

Laten we zeggen dat dit het JSON-antwoord is van het raken van de lokaal geïmplementeerde API - // localhost: 8080 / events? id = 390. :

Laten we nu REST-assured gebruiken om enkele interessante kenmerken van de antwoord-JSON te verifiëren:

@Test openbare leegte gegevenUrl_whenSuccessOnGetsResponseAndJsonHasRequiredKV_thenCorrect () {get ("/ events? Id = 390"). Then (). StatusCode (200) .assertThat () .body ("data.leagueId", equalTo (35)); }

Dus wat we hier deden, is - we hebben geverifieerd dat een aanroep naar het eindpunt / evenementen? id = 390 reageert met een lichaam met een JSON-tekenreeks van wie leagueId van de gegevens object is 35.

Laten we een interessanter voorbeeld bekijken. Stel dat u wilt verifiëren dat het kansen array heeft records met prijzen 1.30 en 5.25:

@Test openbare leegte gegevenUrl_whenJsonResponseHasArrayWithGivenValuesUnderKey_thenCorrect () {get ("/ events? Id = 390"). Then (). AssertThat () .body ("odds.price", hasItems ("1.30", "5.25")); }

3. REST-verzekerde installatie

Als uw favoriete afhankelijkheidstool Maven is, voegen we de volgende afhankelijkheid toe in het pom.xml het dossier:

 io. rust-verzekerd, gerustgesteld 3.3.0-test 

Volg deze link om de laatste versie te downloaden.

REST-assured maakt gebruik van de kracht van Hamcrest-matchers om zijn beweringen uit te voeren, dus we moeten die afhankelijkheid ook opnemen:

 org. hamcrest hamcrest-all 2.1 

De nieuwste versie is altijd beschikbaar via deze link.

4. Anonieme JSON-rootvalidatie

Beschouw een array die uit primitieven bestaat in plaats van objecten:

[1, 2, 3]

Dit wordt een anonieme JSON-root genoemd, wat betekent dat het geen sleutel / waarde-paar heeft, maar dat het nog steeds geldige JSON-gegevens zijn.

We kunnen validatie uitvoeren in een dergelijk scenario door de $ symbool of een lege String ("") als pad. Stel dat we de bovenstaande service via // localhost: 8080 / json dan kunnen we het als volgt valideren met REST-assured:

when (). get ("/ json"). then (). body ("$", hasItems (1, 2, 3));

of zo:

when (). get ("/ json"). then (). body ("", hasItems (1, 2, 3));

5. Vlotters en dubbels

Wanneer we REST-assured gaan gebruiken om onze REST-services te testen, moeten we begrijpen dat drijvende-kommagetallen in JSON-reacties worden toegewezen aan primitief type vlotter.

Het gebruik van vlotter type is niet uitwisselbaar met dubbele zoals het geval is voor veel scenario's in java.

Voorbeeld hiervan is dit antwoord:

{"odd": {"price": "1.30", "ck": 12.2, "name": "1"}}

neem aan dat we de volgende test uitvoeren op de waarde van ck:

get ("/ odd"). then (). assertThat (). body ("odd.ck", equalTo (12.2));

Deze test zal mislukken, zelfs als de waarde die we testen gelijk is aan de waarde in het antwoord. Dit komt omdat we vergelijken met een dubbele in plaats van naar een vlotter.

Om het te laten werken, moeten we de operand expliciet specificeren in de gelijk aan matcher-methode als een vlotter, zoals zo:

get ("/ odd"). then (). assertThat (). body ("odd.ck", equalTo (12.2f));

6. Specificeren van de aanvraagmethode

Meestal voeren we een verzoek uit door een methode aan te roepen zoals krijgen(), overeenkomend met de verzoekmethode die we willen gebruiken.

Daarnaast, we kunnen ook het HTTP-werkwoord specificeren met de verzoek() methode:

@Test public void whenRequestGet_thenOK () {when (). Request ("GET", "/users/eugenp").then().statusCode(200); }

Het bovenstaande voorbeeld is gelijk aan het gebruik van krijgen() direct.

Evenzo kunnen we verzenden HOOFD, AANSLUITEN en OPTIES verzoeken:

@Test public void whenRequestHead_thenOK () {when (). Request ("HEAD", "/users/eugenp").then().statusCode(200); }

POST request volgt ook een vergelijkbare syntaxis en we kunnen specificeren het lichaam door de met() en lichaam() methoden.

Daarom om een ​​nieuw Vreemd door een POST verzoek:

@Test public void whenRequestedPost_thenCreated () {with (). Body (new Odd (5.25f, 1, 13.1f, "X")) .when () .request ("POST", "/ odds / new"). Dan () .statusCode (201); }

De Vreemd object verzonden als lichaam wordt automatisch geconverteerd naar JSON. We kunnen ook elke Draad die we willen verzenden als onze POSTlichaam.

7. Configuratie van standaardwaarden

We kunnen veel standaardwaarden configureren voor de tests:

@Before public void setup () {RestAssured.baseURI = "//api.github.com"; RestAssured.port = 443; }

Hier stellen we een basis-URI en poort in voor onze verzoeken. Naast deze kunnen we ook het basispad, root pat en authenticatie configureren.

Opmerking: we kunnen ook resetten naar de standaard REST-verzekerde standaardinstellingen door gebruik te maken van:

RestAssured.reset ();

8. Meet de reactietijd

Laten we eens kijken hoe we dat kunnen doen meet de responstijd met behulp van de tijd() en tijd in() methoden van de Reactie voorwerp:

@Test public void whenMeasureResponseTime_thenOK () {Response response = RestAssured.get ("/ users / eugenp"); lange timeInMS = response.time (); lange timeInS = response.timeIn (TimeUnit.SECONDS); assertEquals (timeInS, timeInMS / 1000); }

Let daar op:

  • tijd() wordt gebruikt om de responstijd in milliseconden te krijgen
  • tijd in() wordt gebruikt om de responstijd in de opgegeven tijdseenheid op te halen

8.1. Valideer de reactietijd

We kunnen ook de reactietijd - in milliseconden - valideren met behulp van simple langMatcher:

@Test openbare ongeldig whenValidateResponseTime_thenSuccess () {when (). Get ("/ users / eugenp"). Then (). Time (lessThan (5000L)); }

Als we de responstijd in een andere tijdseenheid willen valideren, gebruiken we de tijd() matcher met een seconde TimeUnit parameter:

@Test openbaar ongeldig whenValidateResponseTimeInSeconds_thenSuccess () {when (). Get ("/ users / eugenp"). Then (). Time (lessThan (5L), TimeUnit.SECONDS); }

9. XML-antwoordverificatie

Het kan niet alleen een JSON-antwoord valideren, het kan ook XML valideren.

Laten we aannemen dat we een verzoek indienen bij // localhost: 8080 / werknemers en we krijgen het volgende antwoord:

  Jane Daisy f 

We kunnen verifiëren dat het Voornaam is Jane zo:

@Test openbare ongeldig gegevenUrl_whenXmlResponseValueTestsEqual_thenCorrect () {post ("/ workers"). Then (). AssertThat () .body ("workers.employee.first-name", equalTo ("Jane")); }

We kunnen ook verifiëren dat alle waarden overeenkomen met onze verwachte waarden door body-matchers als volgt aan elkaar te koppelen:

@Test openbare leegte gegevenUrl_whenMultipleXmlValuesTestEqual_thenCorrect () {post ("/ workers"). Then (). AssertThat () .body ("workers.employee.first-name", equalTo ("Jane")) .body ("workers.employee .last-name ", equalTo (" Daisy ")) .body (" workers.employee.sex ", equalTo (" f ")); }

Of gebruik de verkorte versie met variabele argumenten:

@Test openbare leegte gegevenUrl_whenMultipleXmlValuesTestEqualInShortHand_thenCorrect () {post ("/ workers") .then (). AssertThat (). Body ("workers.employee.first-name", equalTo ("Jane"), "workers.employee.last- naam ", equalTo (" Daisy ")," workers.employee.sex ", equalTo (" f ")); }

10. XPath voor XML

We kunnen onze antwoorden ook verifiëren met XPath. Beschouw het onderstaande voorbeeld dat een matcher uitvoert op de Voornaam:

@Test openbare ongeldig gegevenUrl_whenValidatesXmlUsingXpath_thenCorrect () {post ("/ werknemers"). Dan (). AssertThat (). body (hasXPath ("/ werknemers / werknemer / voornaam", bevatString ("Ja"))); }

XPath accepteert ook een alternatieve manier om het gelijk aan matcher:

@Test openbare ongeldig gegevenUrl_whenValidatesXmlUsingXpath2_thenCorrect () {post ("/ werknemers"). Dan (). AssertThat () .body (hasXPath ("/ werknemers / werknemer / voornaam [text () = 'Jane']")); }

11. Logboekregistratie van testdetails

11.1. Details logboekverzoek

Laten we eerst eens kijken hoe log volledige aanvraagdetails met log (). all ():

@Test openbare leegte whenLogRequest_thenOK () {gegeven (). Log (). All () .when (). Get ("/ gebruikers / eugenp") .then (). StatusCode (200); }

Dit zal zoiets als dit loggen:

Verzoekmethode: GET Verzoek-URI: //api.github.com:443/users/eugenp Proxy: Verzoekparams: Queryparams: Formulierparameters: Padparameters: Multiparts: Headers: Accept = * / * Cookies: Body: 

Om alleen specifieke delen van het verzoek te loggen, hebben we de logboek () methode in combinatie met params (), body (), headers (), cookies (), method (), path () bijv log. (). params ().

Merk op dat andere bibliotheken of filters die worden gebruikt, kunnen veranderen wat er daadwerkelijk naar de server wordt verzonden, dus dit mag alleen worden gebruikt om de initiële aanvraagspecificatie te loggen.

11.2. Log reactiedetails

Evenzo kunnen we de antwoorddetails loggen.

In het volgende voorbeeld registreren we alleen de antwoordtekst:

@Test openbare leegte whenLogResponse_thenOK () {when (). Get ("/ repos / eugenp / tutorials") .then (). Log (). Body (). StatusCode (200); }

Voorbeelduitvoer:

{"id": 9754983, "name": "tutorials", "full_name": "eugenp / tutorials", "private": false, "html_url": "//github.com/eugenp/tutorials", "description" : "The \" REST With Spring \ "Course:", "fork": false, "size": 72371, "license": {"key": "mit", "name": "MIT License", "spdx_id ":" MIT "," url ":" //api.github.com/licenses/mit "}, ...}

11.3. Registreer reactie als zich een situatie voordoet

We hebben ook de mogelijkheid om het antwoord alleen te loggen als er een fout is opgetreden of als de statuscode overeenkomt met een bepaalde waarde:

@Test openbare leegte whenLogResponseIfErrorOccurred_thenSuccess () {when (). Get ("/ gebruikers / eugenp") .then (). Log (). IfError (); when (). get ("/ gebruikers / eugenp") .then (). log (). ifStatusCodeIsEqualTo (500); when (). get ("/ gebruikers / eugenp") .then (). log (). ifStatusCodeMatches (groterThan (200)); }

11.4. Log in als validatie is mislukt

We kunnen zowel het verzoek als het antwoord alleen registreren als onze validatie is mislukt:

@Test openbare leegte whenLogOnlyIfValidationFailed_thenSuccess () {when (). Get ("/ gebruikers / eugenp") .then (). Log (). IfValidationFails (). StatusCode (200); gegeven (). log (). ifValidationFails () .when (). get ("/ gebruikers / eugenp") .then (). statusCode (200); }

In dit voorbeeld willen we valideren dat de statuscode 200 is. Alleen als dit niet lukt, worden de aanvraag en reactie gelogd.

12. Conclusie

In deze tutorial hebben we verkende het REST-verzekerde raamwerk en hebben gekeken naar de belangrijkste functies die we kunnen gebruiken om onze RESTful-services te testen en hun antwoorden te valideren.

De volledige implementatie van al deze voorbeelden en codefragmenten is te vinden in het REST-verzekerde GitHub-project.

Jackson onderkant

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

>> BEKIJK DE CURSUS