Ungalongeza njani uLuhlu lweeKhukhamba phezulu kovavanyo oluqinisekisiweyo lwe-API

Esi sithuba sibonelela ngesikhokelo senyathelo nenyathelo malunga nendlela yokongeza umaleko wekhukhamba ngaphezulu kovavanyo lwe-api olubhalwe ku-REST-guaranteed.

I-DSL eqinisekisiweyo i-DSL sele ibonelela ngesimbo sokubhala se-BDD kwifomathi yeXesha-nini-emva koko, kodwa isangcwatyiwe kwikhowudi. Ngamanye amagama, ukuba ufuna ukubona ukuba zeziphi iimeko ezigutyungelweyo, kusafuneka umbe phantsi kuvavanyo lwe-api kwaye ufunde ikhowudi. Akukho zixhobo zeefayile.

Injongo yesi sithuba kukuphinda uvavanye uvavanyo lwe-api esele luqinisekisiwe ngokongeza ikhukhamba kunye neefayile, ukuze iimeko zifundwe ngokucacileyo ngaphandle kokujonga ikhowudi engaphantsi.




Uvavanyo oluqinisekisiweyo lwe-API

Kulo mzekelo, siya kubhala ikhowudi ukuvavanya ukudala indalo yomsebenzisi.

Okokuqala, sinesiqinisekiso sokuma REST-siqinisekisiwe kunye novavanyo lwe-JUnit, oluhlala:


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

Olu vavanyo lungentla lunokuqhutywa ngokuthe ngqo ukusuka eklasini njengoko lunokucelwa yiJUnit.

I setConfig() indlela icwangcisa into efunekayo ngaphambili. Indlela yovavanyo yenza iintshukumo (ukuthumela isicelo) kunye nokuqinisekisa ikhowudi yokuphendula kunye nomrhumo wokuphendula.

Okulandelayo, siza kujonga indlela yokubeka ungqimba lwekhukhamba ngaphezulu kolu vavanyo lunga-REST luqinisekisiweyo lwe-api.




Ikhukhamba kunye novavanyo oluQinisekisiweyo lwe-API

Into yokuqala ekufuneka siyenzile kukongeza ukuxhomekeka kweekomkomere kwiprojekthi yethu.

Sebenzisa iGradle, kweyethu build.gradle ifayile, sizibeka phantsi | 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' }

Kwaye ezi ziphantsi configuration kwi build.gradle ifayile:

configurations {
cucumberRuntime {
extendsFrom testImplementation
} }

Sikwafuna ukwenza umsebenzi kwi build.gradle ifayile ukuqhuba iifayile zekhukhamba eziqulathe imeko:


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

Ulwakhiwo lweProjekthi yeCucumber

Kufuneka siguqule ubume beprojekthi ukuze sikwazi ukulungiselela utshintsho lwekhukhamba.

Iifayile zenqaku ziya kugcinwa kwi:

src/test/resources/scenarios

Iinkcazo zamanyathelo ziya kugcinwa kwi


src/test/java/scenarios

Emva koko, siza kwenza ifayile yefayile ebizwa UserScenarios.feature | kwaye uyibeke phantsi src/test/resources/scenarios ifolda.

Ifayile yefayile iya kubonakala ngathi:

@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

Ngoku kufuneka siqhaqhe uvavanyo lwethu oluqinisekisiweyo lwe-JUnit ukuze sibhale iinkcazo zenyathelo elinokuthi linamathele kwiingxelo kwifayile yethu.


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

Njengoko kunokubonwa kwinkcazo yenyathelo elingentla, kwilayini nganye kwimeko yefayile yenqaku, sinenkcazo yenyathelo elihambelanayo.

Indlela ene Given Isichazi-magama sibeka izinto ezifuneka kuqala Indlela ene When Isichaso senza isenzo sokuthumela isicelo kwaye ekugqibeleni indlela kunye Then Isichazi-magama senza ibango kwimpendulo.

Ukwenza oku kungasentla, konke ekufuneka sikwenzile kukwenza umthetho ./gradle cucumber Kwisiphelo esivela kwingcambu yeprojekthi.

Nje ukuba iimvavanyo ziqhubeke, iziphumo zigcinwa kwi build/test-results/functional.html |.



Isiphelo

Kule posi, sigubungele isikhokelo senyathelo nenyathelo malunga nendlela yokongeza ungqimba lwekhukhamba ngaphezulu kovavanyo oluqinisekisiweyo lwe-API. Ngokwenza njalo, sinokubhala iimeko zethu kwiifayile ezibonakalayo ezifundeka ngakumbi ngabantu abangafundanga.