Testing RESTful API
• Acceptance Tests, tests API
• End-two-end by design
• Black Box approach
• State is stored on the client
Slide 4
Slide 4 text
Solution on the market
Slide 5
Slide 5 text
Tools Prerequisites
• Low knowledge entry level
• Minimum QA dependency on developers
• Platform / IDE agnostic (Portable)
• CI integration
• CLI support
• License free
Slide 6
Slide 6 text
REST-assured
• Uses Java infrastructure
(CLI, CI, etc)
• Powerful API
• Apache License
Java library for testing of REST based services.
Supports standard HTTP requests types and can be
used to validate and verify the response of these
requests.
Pros
• Extensive Java skills
requires /Java lib only
• No guidelines for tests
• Code-as-a-test
Cons
Slide 7
Slide 7 text
• Provide portable/platform agnostic solution for REST-assured tests
• Define strict RESTful service test guidlines
• Lower entry level for new QA engineers
• Adopt spec-as-a-test approach with plain text used as definition
language
Cucumber wrapper for REST-assured library with
additional step definition and features
Why?
Architecture Goals
• Cucumber RESTful service testing DSL independent of Testing
Engine provider
• REST-assured Testing Engine by default. Possibility to switch
providers with no effect on end users
• Internal Utilities for JSON, XML processing as well as file API
and Tempting engine
• Support for custom Recipes and additional functions defined
by Testing Engine
• Plugin system adds hooks for other developers to add custom
project specific logic to the brew
Slide 11
Slide 11 text
Distribution
• Simple JAR dependency
• Available in Maven Central
lv.ctco.cukesrest
cukes-rest
X.X.X
test
Java Project Non-Java Project
• xxx-cukes submodule for
API tests inside main
project
• Separate Maven or Gradle
project
Slide 12
Slide 12 text
Required Tooling
• JDK
• Maven or Gradle
• IntelliJ, Eclipse for
autocomplete or CLI
* Not Supported yet
Slide 13
Slide 13 text
Gherkin Language
The
Slide 14
Slide 14 text
Gherkin syntax
http://docs.behat.org/en/latest/guides/1.gherkin.html
Feature: Some terse yet descriptive text of what is desired
In order to realize a named business value
As an explicit system actor
I want to gain some beneficial outcome which furthers the goal
Additional text...
Background: everything in place
Scenario: Some determinable business situation
Given some precondition
And some other precondition
When some action by the actor
And some other action
And yet another action
Then some testable outcome is achieved
And something else we can check happens too
Scenario: A different situation
...
my.feature
Slide 15
Slide 15 text
Gherkin syntax
• Feature - Describes the feature for which test
scenarios are grouped
• Background - Describes preconditions for each test
scenario
• Scenario - single test case
Slide 16
Slide 16 text
Gherkin syntax
Feature: Some terse yet descriptive text of what is desired
In order to realize a named business value
As an explicit system actor
I want to gain some beneficial outcome which furthers the goal
Additional text...
Background: everything in place
Scenario: Some determinable business situation
Given some precondition
And some other precondition
When some action by the actor
And some other action
And yet another action
Then some testable outcome is achieved
And something else we can check happens too
Scenario: A different situation
...
my.feature
Slide 17
Slide 17 text
Scenario syntax
Standard BDD style:
• Given - precondition / set-up
• When - testable action
• Then - assertion
• And, But - additional precondition / testable
action / assertion
Slide 18
Slide 18 text
Multiple Steps inside
Scenario
Scenario: Some determinable business situation
Given some precondition
When some action by the actor
Then some testable outcome is achieved
Given some other precondition
When some other action by the actor
Then something else we can check happens too
Slide 19
Slide 19 text
Arguments
Gherkin
Java Glue code
Slide 20
Slide 20 text
Arguments
Gherkin
Java Glue code
Slide 21
Slide 21 text
The
Slide 22
Slide 22 text
Comparison
Scenario: Server returns OK status code
When the client performs GET request on http://localhost:4567/hello
Then status code is 200
@Test
public void serverReturnsOkStatusCode() throws Exception {
when().get(“http://localhost:4567/hello").
then().statusCode(200);
}
REST-assured
Inspired by REST-assured naming conventions
Slide 23
Slide 23 text
Sample feature
Feature: Simple Resource working
Background:
Given baseUri is http://localhost:4567
Scenario: Server returns OK status code
When the client performs GET request on /hello
Then status code is 200
Scenario: Server greets user
When the client performs GET request on /hello
Then response equals to "Hello World"
Scenario: Server greets user by name
Given queryParam "name" is "John"
When the client performs GET request on /hello
Then response contains "John"
Slide 24
Slide 24 text
Variable support
Scenario: Server greets user by name
Given variable {(person_name)} is John
And queryParam "name" is "{(person_name)}"
When the client performs GET request on /hello
Then response contains "{(person_name)}"
Variable names - alphanumeric (\w+)
Slide 25
Slide 25 text
Capturing Variables
From Response
Scenario: 1. New Customer is retrieved by ID
Given request body from file customers/json/newCustomer.json
When the client performs POST request on /customers
Then status code is 201
And header Location end with pattern customers/(.+)
And let variable “{(location)}" equal to header Location
When the client performs GET request on {(location)}
Then status code is 200
And response contains properties from file customers/json/newCustomer.json
Slide 26
Slide 26 text
Files API
Scenario: Request Body
Given request body “[“id”:”1”]”
Given request body from file C://files/my.txt
Given request body:
"""
[
“id”: “1”
]
"""
Given resources root is C://files/
Given request body from file my.txt
Slide 27
Slide 27 text
Variable support in Files
{
"id" : "{(client_ID)}",
"name" : "Smith"
}
my.json
Scenario: Request Body
Given variable {(client_ID)} is 1
Given resources root is src/test/resources/
Given request body from file my.json
…
Slide 28
Slide 28 text
JSONPath support
Scenario: 2. The Customer is updated
...
When the client performs GET request on {(location)}
Then status code is 200
And response body contains property ”name” equal to “John”
responseBody
{
"id" : 1,
"name" : "John"
}
Slide 29
Slide 29 text
JSON contains matcher
Scenario: 2. The Customer is updated
...
When the client performs GET request on {(location)}
Then status code is 200
And response contains properties from file customers/json/updatedCustomer.json
{
"name" : "Smith"
}
updatedCustomer.json responseBody
{
"id" : 1,
"name" : "Smith"
}
Match everything by JSONPath