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