Hoe komkommerlaag by te voeg bo-op REST-verseker API-toetse

Hierdie pos bied 'n stapsgewyse gids oor hoe om 'n komkommerlaag by te voeg bo-op api-toetse wat in REST-versekerd geskryf is.

REST-versekerde se DSL bied reeds 'n BDD-styl skryf van toetse in die Gegewe-Wanneer-dan-formaat, maar dit is steeds in die kode begrawe. Met ander woorde, as u wil sien watter scenario's gedek word, moet u steeds in die api-toetse delf en die kode lees. Daar is geen funksielêers nie.

Die doel van hierdie boodskap is om bestaande REST-versekerde api-toetse te refaktoreer deur komkommer- en funksielêers by te voeg, sodat scenario's duideliker gelees kan word sonder om na die onderliggende kode te hoef te kyk.




RUS-verseker API-toetse

In hierdie voorbeeld sal ons kode skryf om die API van gebruikers te skep.

Eerstens het ons 'n selfstandige REST-verseker en JUnit-toets, wat geleë is in:


src/test/java/io.devqa/scenarios

import io.restassured.RestAssured; import io.restassured.http.ContentType; import io.restassured.response.Response; import org.junit.jupiter.api.*; import static io.restassured.RestAssured.given; public class UserTests {
private static String path;
private static String validRequest = '{ ' +

' 'username': 'test-api-user', ' +

' 'email': 'test-api-user@email.com', ' +

' 'password': 'Passw0rd123!', ' +

' 'name': 'Test Api-User' }';
@BeforeAll
public static void setConfig() {
RestAssured.baseURI = 'https://localhost:8080';
path = '/users';
}
@Test
public void shouldBeAbleToCreateNewUser() {
Response createUser = given()


.auth()


.preemptive()


.basic('MY_USERNAME', 'MY_PASSWORD')


.header('Accept', ContentType.JSON.getAcceptHeader())


.contentType(ContentType.JSON)


.body(validRequest)


.post(path)


.then().extract().response();
Assertions.assertEquals(201, createUser.getStatusCode());

String username = createUser.jsonPath().get('username');
String email = createUser.jsonPath().get('email');
String name = createUser.jsonPath().get('name');
String id = createUser.jsonPath().get('id');

Assertions.assertEquals('test-api-user', username);
Assertions.assertEquals('test-api-user@email.com', email);
Assertions.assertEquals('Test Api-User', name);
Assertions.assertNotNull(id);
} }

Bogenoemde toets kan direk vanaf die klas afgelê word, aangesien dit deur JUnit aangevoer kan word.

Die setConfig() metode stel die voorvereiste. Die toetsmetode voer die aksies uit (stuur die versoek) en bevestig dan die antwoordkode en antwoordlading.

Vervolgens gaan ons kyk hoe om die komkommerlaag bo-op die bostaande REST-versekerde api-toets te plaas.




Komkommer- en RUS-verseker API-toetse

Die eerste ding wat ons moet doen, is om die komkommerafhanklikheid by ons projek te voeg.

Met behulp van Gradle, in ons build.gradle lêer, ons plaas dit onder die dependencies:

dependencies {
testCompile 'io.cucumber:cucumber-java:6.2.2'
testCompile 'io.cucumber:cucumber-junit:6.2.2'
testCompile 'io.rest-assured:rest-assured:3.3.0'
testCompile 'com.jayway.jsonpath:json-path:2.4.0' }

En dit onder configuration in build.gradle lêer:

configurations {
cucumberRuntime {
extendsFrom testImplementation
} }

Ons moet ook 'n taak in die build.gradle skep lêer om die komkommer-funksielêers wat die scenario's bevat, uit te voer:


task cucumber() {
dependsOn assemble, compileTestJava
doLast {
mkdir 'build/test-results/'
javaexec {

main = 'io.cucumber.core.cli.Main'

classpath = configurations.cucumberRuntime + sourceSets.main.output + sourceSets.test.output

args = ['--plugin', 'pretty', '--plugin', 'html:build/test-results/functional.html', '--plugin', 'junit:build/test-results/functional.xml','--tags', '@functional', '--glue', 'scenarios', 'src/test/resources']
}
} }

Projekstruktuur vir komkommer

Ons moet ook ons ​​projekstruktuur verander om aan te pas by die veranderinge vir komkommer.

Die funksielêers sal gestoor word in:

src/test/resources/scenarios

Die stapdefinisies word gestoor in


src/test/java/scenarios

Vervolgens sal ons 'n funksielêer met die naam UserScenarios.feature skep en sit dit onder src/test/resources/scenarios vouer.

Die funksielêer sal lyk soos volg:

@functional Feature: User Scenarios Scenario: I should be able to create a new user
Given the users endpoint exists
When I send a valid create user payload
Then response status code should be 201
And create user response should be valid

Nou moet ons ons RUS-versekerde JUnit-toets afbreek om stapdefinisies te skryf wat aan die stellings in ons funksielêer geplak kan word.


import io.cucumber.java.en.And; import io.cucumber.java.en.Given; import io.cucumber.java.en.Then; import io.cucumber.java.en.When; import io.restassured.RestAssured; import io.restassured.http.ContentType; import io.restassured.response.Response; import org.junit.jupiter.api.Assertions; import static io.restassured.RestAssured.given; public class UserScenarios {
private String path;
private Response response;
private String validRequest = '{ ' +

' 'username': 'test-api-user', ' +

' 'email': 'test-api-user@email.com', ' +

' 'password': 'Passw0rd123!', ' +

' 'name': 'Test Api-User' }';
@Given('the users endpoint exists')
public void preReq() {
RestAssured.baseURI = 'https://localhost:8080';
path = '/users';
}
@When('I send a valid create user payload')
public void createUser() {
response = given()


.auth()


.preemptive()


.basic('MY_USERNAME', 'MY_PASSWORD')


.header('Accept', ContentType.JSON.getAcceptHeader())


.contentType(ContentType.JSON)


.body(validRequest)


.post(path)


.then().extract().response();
}
@Then('response status code should be {int}')
public void checkResponseStatusCode(int code) {
Assertions.assertEquals(code, response.getStatusCode());
}
@And('create user response should be valid')
public void verifyResponse() {
String username = response.jsonPath().get('username');
String email = response.jsonPath().get('email');
String name = response.jsonPath().get('name');
String id = response.jsonPath().get('id');

Assertions.assertEquals('test-api-user', username);
Assertions.assertEquals('test-api-user@email.com', email);
Assertions.assertEquals('Test Api-User', name);
Assertions.assertNotNull(id);
} }

Soos gesien kan word in bostaande definisies, het ons 'n ooreenstemmende stapdefinisie vir elke reël in die scenario in die funksielêer.

Die metode met die Given aantekeninge stel die voorvereistes. Die metode met die When aantekening doen die handeling om die versoek te stuur en uiteindelik die metode met die Then aantekeninge voer die bewerings oor die antwoord uit.

Om bogenoemde uit te voer, is alles wat ons hoef te doen om die opdrag ./gradle cucumber uit te voer in 'n terminale vanaf die projekwortel.

Sodra die toetse uitgevoer is, word die resultate gestoor in build/test-results/functional.html



Afsluiting

In hierdie berig het ons 'n stapsgewyse gids bespreek oor hoe om 'n komkommerlaag bo-op die REST-versekerde API-toetse by te voeg. Deur dit te doen, kan ons ons scenario's in funksielêers skryf wat leesbaarder word vir nie-tegniese mense.