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