Mar a chuireas tu sreath cucumber air mullach deuchainnean API le cinnt REST

Tha an dreuchd seo a ’toirt seachad stiùireadh ceum air cheum air mar a chuireas tu còmhdach ciùcran air mullach deuchainnean api sgrìobhte ann an REST-sure.

Tha REST-sure’s DSL mu thràth a ’toirt seachad sgrìobhadh ann an stoidhle BDD de dheuchainnean ann an cruth Given-When-Then, ach tha e fhathast air a thiodhlacadh anns a’ chòd. Ann am faclan eile, ma tha thu airson faicinn dè na suidheachaidhean a tha air an còmhdach, feumaidh tu fhathast cladhach a-steach do na deuchainnean api agus an còd a leughadh. Chan eil faidhlichean feart ann.

Is e amas na dreuchd seo ath-ghnìomhachadh a dhèanamh air deuchainnean api le cinnt REST le bhith a ’cur faidhlichean ciùcran agus feart ann, gus an urrainnear suidheachaidhean a leughadh nas soilleire gun a bhith a’ toirt sùil air a ’chòd bunaiteach.




Deuchainnean API le cinnt REST

San eisimpleir seo, sgrìobhaidh sinn còd gus deuchainn a dhèanamh air api cruthachadh luchd-cleachdaidh.

An toiseach, tha Deuchainn neo-sheasmhach REST-dearbhaidh agus JUnit againn, a tha a ’fuireach ann:


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

Faodar an deuchainn gu h-àrd a ruith gu dìreach bhon chlas oir faodaidh JUnit a bhith air a ghairm.

Tha an setConfig() modh a ’suidheachadh an ro-riatanach. Bidh an dòigh deuchainn a ’dèanamh na gnìomhan (a’ cur an iarrtas) agus an uairsin a ’dearbhadh air a’ chòd freagairt agus uallach pàighidh freagairt.

An ath rud, seallaidh sinn ri mar a chuireas tu an còmhdach ciùcran air mullach an deuchainn api le cinnt REST.




Deuchainnean API Cucumber agus REST-chinnteach

Is e a ’chiad rud a dh’ fheumas sinn a dhèanamh gus eisimeileachd cucumber a chuir ris a ’phròiseact againn.

A ’cleachdadh Gradle, anns an build.gradle againn faidhle, chuir sinn iad sin fon 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' }

Agus iad sin fo configuration ann an build.gradle faidhle:

configurations {
cucumberRuntime {
extendsFrom testImplementation
} }

Feumaidh sinn cuideachd gnìomh a chruthachadh anns an build.gradle faidhle gus na faidhlichean feart cucumber a ruith anns a bheil na suidheachaidhean:


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

Structar Pròiseact airson Cucumber

Feumaidh sinn cuideachd structar a ’phròiseict againn atharrachadh gus gabhail ris na h-atharrachaidhean airson cucumber.

Thèid na faidhlichean feart a shàbhaladh ann an:

src/test/resources/scenarios

Thèid na mìneachaidhean ceum a shàbhaladh a-steach


src/test/java/scenarios

An ath rud, cruthaichidh sinn faidhle feart ris an canar UserScenarios.feature agus cuir e fo src/test/resources/scenarios pasgan.

Bidh am faidhle feart coltach:

@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

A-nis feumaidh sinn ar deuchainn JUnit le cinnt REST a thoirt às a chèile gus mìneachaidhean ceum a sgrìobhadh a ghabhas a ghèilleadh ris na h-aithrisean anns an fhaidhle feart againn.


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

Mar a chithear anns na mìneachaidhean ceum gu h-àrd, airson a h-uile loidhne san t-suidheachadh san fhaidhle feart, tha mìneachadh ceum co-fhreagarrach againn.

An dòigh leis an Given tha mothachadh a ’suidheachadh na ro-riatanasan. An dòigh leis an When bidh mothachadh a ’dèanamh gnìomh airson an t-iarrtas a chuir a-steach agus mu dheireadh an dòigh leis an Then bidh mothachadh a ’coileanadh na beachdan air an fhreagairt.

Gus na tha gu h-àrd a chuir an gnìomh, chan eil againn ach a bhith a ’cur an gnìomh an àithne ./gradle cucumber ann an ceann-uidhe bho fhreumh a ’phròiseict.

Aon uair ‘s gu bheil na deuchainnean air ruith, thèid na toraidhean a shàbhaladh ann an build/test-results/functional.html.



Co-dhùnadh

Anns an dreuchd seo, chòmhdaich sinn stiùireadh ceum air cheum air mar a chuireas tu còmhdach ciùcran air mullach nan deuchainnean API le cinnt REST. Le bhith a ’dèanamh seo, is urrainn dhuinn ar suidheachaidhean a sgrìobhadh ann am faidhlichean feart a bhios nas so-leughaidh le daoine neo-theicnigeach.