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