Expositor: Walter Lijo
Resumen: Con el gran crecimiento de APIs en la industria de software nos vemos obligados a realizar cada vez una mayor cantidad de tests en menos tiempo, y que los mismos sean simples de mantener. Ante esta premisa encontré Chakram que facilita el trabajo que necesitamos realizar.
Chakram nos da la posibilidad de testear de una manera simple y rápida APIs Rest. Este framework nos da como ventaja:
- Realizar HTTP Assertions basadas en Chai.js
- Aprovechar al máximo las promises de javascript
- Usar BDD + Hooks
- Extensible, permitiendo crear nuevas validaciones al framework
El workshop está enfocado a conocer el framework, dar las pautas principales de cómo funciona y crear test de forma simple.
2. What we are going to use ...
o Chakram
o http://dareid.github.io/chakram/
o Mocha
o https://mochajs.org/
o Chai
o http://chaijs.com/
o Mochawesome
o https://github.com/adamgruber/mochawesome
3. What is Chakram?
o Chakram is a REST API testing framework offering a BDD testing style and fully
exploiting promises
o This framework allows us to:
o Make HTTP Assertions
o Exploit Promises
o Use BDD + Hooks
o Extensibility
o Community support
4. What do we need?
o Project for MeetUp
o https://github.com/woolter/RestAPITesting
o ~/Documents $ git clone https://github.com/woolter/RestAPITesting.git
o ~/Documents $ cd RestAPITesting
o ~/Documents/RestAPITesting $ git checkout exercise
o Spring boot rest api example
o http://websystique.com/spring-boot/spring-boot-rest-api-example/
5. Step 1 - Getting Started
With the next few commands we can set up or project from scratch.
~/projectFolder $ npm install -g mocha
~/projectFolder $ npm init
~/projectFolder $ npm install --save-dev chakram
~/projectFolder $ npm install --save-dev mochawesome
~/projectFolder $ mkdir data
~/projectFolder $ mkdir test
To start our Spring boot rest api example
~/RestAPITesting/SpringBootRestApiExample $ mvn spring-boot:run
6. Step 2 - Get
o Create endpoint.json on data folder
o Create ddt.json on data folder
o Create 1_Get.js on test folder with this:
o Create variables for validation
https://jsonschema.net/#/editor
o Create function for all users and user by id
{
"user":"SpringBootRestApi/api/user/",
"userById":"SpringBootRestApi/api/user/{id}"
}
{
"environment":
{
"protocol":"http://",
"hostname":"localhost",
"port":":8080/"
}
}
let chakram = require('chakram');
let expect = chakram.expect;
endPoint = require('../data/endPoint.json');
ddt = require('../data/ddt.json');
"http://user:password@site
-----------------------------------------------------------
"login":"/j_spring_security_check?j_usernam
e={userName}&j_password={password}",
return chakram.get(request, {jar: cookie})
7. Step 2 - Get (continue)
o Basic test: get all users
o New test: get user by id
o Execute test
~/projectFolder/test $ mocha 1_Get.js
describe("Get", function () {
it("All User", function () {
return chakram.get(allUser())
.then(function (response) {
expect(response).to.have.schema(schemaGetAll);
expect(response.response.statusCode).to.equal(200);
})
});
});
it("User by ID", function () {
let userID = userById(1);
return chakram.get(userID)
.then(function (response) {
expect(response).to.have.schema(schemaGetById);
})
});
8. Step 3 - Post
o Create 2_Post.js on test folder with this:
o Add schema to create user
o Add variable for validation
o Add function for
o Create user
o Get user by Id
o Create test case to create user with existing user name
let chakram = require('chakram');
let expect = chakram.expect;
endPoint = require('../data/endPoint.json');
ddt = require('../data/ddt.json');
let bodyCreateUser = {
name: "",
age: "",
salary: ""
};
o Add data to ddt.json
"userData":{
"name":"yourName",
"age":35,
"salary":123456
}
it("Create a User with an existing name", function () {
bodyCreateUser.name = ddt.userData.name;
bodyCreateUser.age = ddt.userData.age;
bodyCreateUser.salary = ddt.userData.salary;
return chakram.post(createUser(), bodyCreateUser)
.then(function (response) {
expect(response.response.statusCode).to.equal(409);
expect(response.response.body.errorMessage).to.equal("Unable to
create. A User with name "+ddt.userData.name+" already" +
" exist.");
})
});
o Execute test
~/projectFolder/test $ mocha 2_Post.js
9. Step 4 - Put
o Create 3_Put.js on test folder with this:
o Add schema for update user
o Add function for
o Get user by Id
o Create test case to update age
let chakram = require('chakram');
let expect = chakram.expect;
endPoint = require('../data/endPoint.json');
ddt = require('../data/ddt.json');
let bodyCreteUser = {
name: "",
age: "",
salary: ""
};
it("Update Age", function () {
bodyCreateUser.name = userIdInformation.name;
bodyCreateUser.age = ddt.userData.ageUpdate;
bodyCreateUser.salary = userIdInformation.salary;
return chakram.put(userById(userIdToSearch),bodyCreateUser)
.then(function (response) {
expect(response.body.id).to.equal(userIdToSearch);
expect(response.body.name).to.equal(userIdInformation.name);
expect(response.body.age).to.equal(ddt.userData.ageUpdate);
expect(response.body.salary).to.equal(userIdInformation.salary);
})
});
o Execute test
~/projectFolder/test $ mocha 3_Put.js
10. Step 5 - Delete
o Create 4_Delete.js on test folder with:
o Required deferences
o Function to:
o Delete all user
o Delete user by Id
o Test case:
o Delete by Id
o Delete all
let chakram = require('chakram');
let expect = chakram.expect;
endPoint = require('../data/endPoint.json');
ddt = require('../data/ddt.json');ringBootRestApi/api/user/{id}"
function deleteAllUser() {
let users = ddt.environment.protocol + ddt.environment.hostname +
ddt.environment.port + endPoint.user;
return users;
}
function deleteUserById(id) {
let usersID = ddt.environment.protocol + ddt.environment.hostname +
ddt.environment.port + endPoint.userById;
usersID = usersID.replace("{id}", id);
return usersID;
}
describe("Delete", function () {
it("Delete by Id", function () {
let userID = deleteUserById(ddt.userData.deleteId);
return chakram.delete(userID)
.then(function (response) {
expect(response.response.statusCode).to.equal(204);
return chakram.get(userID)
.then(function (response) {
expect(response.response.body.errorMessage).to.equal("User
with id " + ddt.userData.deleteId + " not found");
})
})
});
});
it("All User", function () {
return chakram.delete(deleteAllUser())
.then(function (response) {
expect(response.response.statusCode).to.equal(204);
return chakram.get(deleteAllUser())
.then(function (response) {
expect(response.response.statusCode).to.equal(204);
console.log(response);
})
})
});
o Execute test
~/projectFolder/test $ mocha 4_Delete.js
11. Step 6 - Execute all test case
o Execute test
~/projectFolder $ mocha --recursive testCaseFolder/ --reporter mochawesome