Istirohat bilan ta'minlangan API sinovlari ustiga bodring qatlamini qanday qo'shish kerak

Ushbu xabarda REST-garov bilan yozilgan api testlari ustiga bodring qatlamini qo'shish bo'yicha bosqichma-bosqich ko'rsatma berilgan.

REST-assured's DSL allaqachon berilgan-qachon-keyin formatida testlarni BDD uslubida yozishni ta'minlaydi, ammo u hali ham kodga ko'milgan. Boshqacha qilib aytadigan bo'lsak, qanday stsenariylarni ko'rib chiqishni istasangiz, siz hali ham api testlarini o'rganishingiz va kodni o'qishingiz kerak. Hech qanday xususiyatli fayllar mavjud emas.

Ushbu xabarning maqsadi, mavjud bo'lgan REST-kafolatlangan api testlarini bodring va xususiyatli fayllarni qo'shish orqali qayta ishlashdir, shuning uchun stsenariylarni asosiy kodga qaramasdan aniqroq o'qish mumkin.




REST-kafolatlangan API sinovlari

Ushbu misolda biz foydalanuvchi yaratilishini sinab ko'rish uchun kod yozamiz api.

Birinchidan, bizda mustaqil REST kafolatlangan va JUnit testi mavjud bo'lib, u quyidagilarda joylashgan:


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

Yuqoridagi testni to'g'ridan-to'g'ri sinfdan ishlatish mumkin, chunki uni JUnit chaqirishi mumkin.

setConfig() usul oldindan talabni belgilaydi. Sinov usuli amallarni bajaradi (so'rov yuboradi), so'ngra javob kodi va javob yukini tasdiqlaydi.

Keyinchalik, bodring qatlamini yuqoridagi REST-kafolatlangan api testining ustiga qanday qo'yish kerakligini ko'rib chiqamiz.




Bodring va dam olish uchun kafolatlangan API sinovlari

Bizga kerak bo'lgan birinchi narsa - bu bizning loyihamizga bodringga bog'liqlikni qo'shishdir.

Gradle-dan foydalanib, bizning build.gradle fayl, biz ularni dependencies ostiga qo'yamiz:

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

Va bular configuration ostida ichida build.gradle fayl:

configurations {
cucumberRuntime {
extendsFrom testImplementation
} }

Shuningdek, biz build.gradle da vazifa yaratishimiz kerak stsenariylarni o'z ichiga olgan bodring xususiyatli fayllarni ishga tushirish uchun fayl:


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

Bodring uchun loyiha tarkibi

Shuningdek, bodring uchun o'zgarishlarni hisobga olgan holda loyihamiz tuzilishini o'zgartirishimiz kerak.

Funksiya fayllari quyidagilarda saqlanadi:

src/test/resources/scenarios

Qadam ta'riflari saqlanib qoladi


src/test/java/scenarios

Keyin, biz UserScenarios.feature nomli funktsiya faylini yaratamiz va src/test/resources/scenarios ostiga qo'ying papka.

Xususiyat fayli quyidagicha bo'ladi:

@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

Endi bizning xususiyatlar faylimizdagi bayonotlarga yopishtirilishi mumkin bo'lgan qadam ta'riflarini yozish uchun REST-JUnit testini bekor qilishimiz kerak.


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

Yuqoridagi qadam ta'riflaridan ko'rinib turibdiki, xususiyatlar faylidagi stsenariyning har bir satri uchun biz mos keladigan qadam ta'rifiga egamiz.

Given Bilan usul annotatsiya oldindan rekvizitlarni o'rnatadi. When Bilan usul annotatsiya so'rovni yuborish va nihoyat usulni Then bilan bajaradi annotatsiya javob bo'yicha tasdiqlarni amalga oshiradi.

Yuqoridagilarni bajarish uchun bizga faqat ./gradle cucumber buyrug'ini bajarish kerak loyiha ildizidan terminalda.

Sinovlar bajarilgandan so'ng, natijalar build/test-results/functional.html da saqlanadi.



Xulosa

Ushbu lavozimda biz REST-kafolatlangan API sinovlari ustiga bodring qatlamini qo'shish bo'yicha bosqichma-bosqich qo'llanmani ko'rib chiqdik. Shunday qilib, biz o'z stsenariylarimizni texnik bo'lmagan odamlar tomonidan o'qilishi mumkin bo'lgan xususiyatli fayllarga yozishimiz mumkin.