Kaip pridėti agurkų sluoksnį ant REST užtikrintų API testų

Šiame įraše pateikiamas nuoseklus vadovas, kaip pridėti agurkų sluoksnį ant API testų, parašytų „REST-assured“.

„REST-Assured“ DSL jau pateikia BDD stiliaus testus rašant „Given-When-Then“ formatu, tačiau jis vis dar palaidotas kode. Kitaip tariant, jei norite pamatyti, kokie scenarijai yra apimti, vis tiek turite įsigilinti į api testus ir perskaityti kodą. Nėra funkcinių failų.

Šio įrašo tikslas yra pertvarkyti esamus „REST“ užtikrintus api testus, pridedant agurkų ir funkcijų failus, kad scenarijus būtų galima aiškiau perskaityti, nereikia žiūrėti į pagrindinį kodą.




REST užtikrinami API testai

Šiame pavyzdyje parašysime kodą, kad išbandytume vartotojo kūrimo api.

Pirma, mes turime atskirą „REST“ užtikrintą ir „JUnit“ testą, kuris yra:


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);
} }

Pirmiau pateiktą testą galima vykdyti tiesiogiai iš klasės, nes jį gali naudoti JUnit.

setConfig() metodas nustato išankstinę sąlygą. Bandymo metodas atlieka veiksmus (siunčia užklausą), tada tvirtina atsakymo kodą ir atsako naudingąją apkrovą.

Toliau mes pažvelgsime, kaip įdėti agurkų sluoksnį ant aukščiau minėto REST užtikrinto api testo.




Agurkų ir REST patikimi API testai

Pirmas dalykas, kurį turime padaryti, yra įtraukti į savo projektą priklausomybę nuo agurkų.

Naudodami „Gradle“, mūsų build.gradle failą, juos įdedame į 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' }

Ir tai pagal configuration build.gradle failas:

configurations {
cucumberRuntime {
extendsFrom testImplementation
} }

Mes taip pat turime sukurti užduotį build.gradle failą, kad paleistumėte agurkų funkcijų failus, kuriuose yra scenarijų:


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

Agurkų projekto struktūra

Mes taip pat turime pakeisti savo projekto struktūrą, kad pritaikytume agurkų pokyčius.

Funkcijų failai bus išsaugoti:

src/test/resources/scenarios

Žingsnių apibrėžimai bus išsaugoti


src/test/java/scenarios

Tada sukursime funkcinį failą pavadinimu UserScenarios.feature ir padėkite jį po src/test/resources/scenarios aplanką.

Funkcijos failas atrodys taip:

@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

Dabar turime išardyti „REST“ užtikrintą „JUnit“ testą, kad parašytume žingsnių apibrėžimus, kuriuos galima priklijuoti prie teiginių mūsų funkcijų faile.


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);
} }

Kaip matyti iš pirmiau pateiktų žingsnių apibrėžimų, kiekvienai funkcijų failo scenarijaus eilutei turime atitinkamą žingsnio apibrėžimą.

Metodas su Given anotacija nustato išankstinius reikalavimus. Metodas su When anotacija atlieka užklausos siuntimo veiksmą ir galiausiai metodą su Then anotacija atlieka atsakymo teiginius.

Norėdami įvykdyti aukščiau nurodytus dalykus, mums tereikia įvykdyti komandą ./gradle cucumber terminale iš projekto šaknies.

Atlikus bandymus, rezultatai išsaugomi build/test-results/functional.html.



Išvada

Šiame įraše mes apžvelgėme žingsnis po žingsnio vadovą, kaip pridėti agurkų sluoksnį ant REST užtikrintų API testų. Tai darydami, mes galime įrašyti savo scenarijus į funkcinius failus, kuriuos netechniniai žmonės gali lengviau perskaityti.