Slide 1

Slide 1 text

Deep

Slide 2

Slide 2 text

RESTful Architecture • Stateless • Uses HTTP protocol • Client agnostic (Mobile or Web)

Slide 3

Slide 3 text

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?

Slide 8

Slide 8 text

Architecture Overview From

Slide 9

Slide 9 text

Architecture Overview Cucumber DSL Internal Utilities (File, JSON, XML APIs, Templating engine, Context) REST Testing Engine Interface REST-assured implementation ? ? Plugin Interface ..

Slide 10

Slide 10 text

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

Slide 30

Slide 30 text

How

Slide 31

Slide 31 text


 
 
 UTF-8
 UTF-8
 --plugin pretty --glue lv.ctco.cukesrest.api src/test/resources
 10
 
 
 
 
 lv.ctco.cukesrest
 cukes-rest
 X.X.X
 test
 
 
 
 
 
 
 
 maven-surefire-plugin
 2.18.1
 
 ${surefire.fork.count}
 false
 
 ${cucumber.options}
 
 
 **/*CukesTest.java
 
 
 
 
 


Slide 32

Slide 32 text

cukes.properties #default - http://localhost:80
 cukes.base_uri=http://localhost:8080
 
 #default - src/test/resources/
 cukes.resources_root=src/test/resources/features
 
 #cukes.proxy
 
 #default - false
 #cukes.url_encoding_enabled
 #cukes.relaxed_https
 
 #cukes.auth_type
 #cukes.username
 #cukes.password

Slide 33

Slide 33 text

JUnit test @RunWith(Cucumber.class)
 public class RunCukesTest {
 }

Slide 34

Slide 34 text

Parallel tests @RunWith(Cucumber.class)
 @CucumberOptions (tags = {"@misc"})
 public class MiscCukesTest {
 } @RunWith(Cucumber.class)
 @CucumberOptions (tags = {"@customers"})
 public class CustomersCukesTest {
 }
 @customers
 Feature: Server provides Customer resource
 ... @misc
 Feature: Simple Resource Working
 ...

Slide 35

Slide 35 text

Q&A