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.
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.
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']
}
} }
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
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.