https://travis-ci.org/tomitribe/beryllium.svg?branch=master[image:https://travis-ci.org/tomitribe/beryllium.svg?branch=master[Build Status]] https://coveralls.io/github/tomitribe/beryllium?branch=master[image:https://coveralls.io/repos/tomitribe/beryllium/badge.svg?branch=master&service=github[Coverage Status]] https://www.versioneye.com/user/projects/5621a1b736d0ab0021000abf[image:https://www.versioneye.com/user/projects/5621a1b736d0ab0021000abf/badge.svg[Dependency Status]] https://maven-badges.herokuapp.com/maven-central/org.tomitribe/beryllium[image:https://maven-badges.herokuapp.com/maven-central/org.tomitribe/beryllium/badge.svg[Maven Central]]
[[beryllium]] = Beryllium
Functional testing for REST API, Database setup, external service mocks and redis setup/assertions
This is based on https://github.com/cucumber/cucumber-jvm[cucumber-jvm] project.
You need to specify your features in the gherkin language and run it with https://github.com/cucumber/cucumber-java-skeleton[cucumber-java] or https://github.com/cukespace/cukespace[cukespace] + http://arquillian.org/[arquillian]
[[dependency]] == Dependency
Add as dependency in your pom.xml:
[[database-setup]] == Database Setup
Steps for Database Setup and verification of Endpoints Results
Put your database connection properties in src/test/resources/test-db.properties
Write your feature in gherkin language in src/test/resources/features/example.feature
it should be used in Given
steps to prepare the database
Scenario: Retrieve users list Given I have only the following rows in the "models" table: | id | created | modified | email | fullname | password | | 1 | 2014-07-16 00:00:00 | 2014-07-16 00:00:00 | cchacin@superbiz.org | Carlos | passw0rd | When I make a GET call to "users" endpoint Then response status code should be "200" And response content type should be "application/json" And response should be json: """ { "model": [ { "id": 1, "created": "${json-unit.ignore}", "modified": "${json-unit.ignore}", "email": "cchacin@superbiz.org", "fullname": "Carlos", "password": "passw0rd" } ] } """
[[call-restful-apis-and-assert-responses]] == Call Restful APIs and assert Responses
Steps to verify Restful API reponses
Scenario: When I make a GET call to "https://api.github.com/zen?z=1" endpoint Then response status code should be "200" And response content type should be "text/plain;charset=utf-8"
Scenario: When I make a GET call to "successful/get" endpoint Then response status code should be "200" And response content type should be "application/json" And response header "a" should be "a"; And response should be json in file "responses/successful.json"
Scenario: When I make a GET call to "successful/get/csv" endpoint Then response status code should be "200" And response content type should be "text/csv" And response should be file "responses/sample.csv"
Scenario: When I make a GET call to "successful/get" endpoint with header "Authorization" with value "OAuth qwerqweqrqwerqwer" Then response status code should be "200" And response content type should be "application/json" And response header "a" should be "a"; And response should be json in file "responses/successful.json"
Scenario: When I make a GET call to "successful/get" endpoint with headers: | headerName | headerValue | | Authorization | OAuth qwerqweqrqwerqwer | Then response status code should be "200" And response content type should be "application/json" And response header "a" should be "a"; And response should be json in file "responses/successful.json"
Scenario: When I make a GET call to "successful/get" endpoint Then response status code should be "200" And response content type should be "application/json" And response header "a" should be "a"; And response should be json: """ { "id": "${json-unit.ignore}", "created": "${json-unit.ignore}", "modified": "${json-unit.ignore}", "password": "", "fullname": "" } """
Scenario: When I make a HEAD call to "successful/head" endpoint Then response status code should be "204" And response should be empty
Scenario: When I make a PUT call to "successful/put" endpoint with post body: """ { } """ Then response status code should be "204" And response should be empty
Scenario: PUT call with headers When I make a PUT call to "test-app/successful/headers/put" endpoint with post body in file "requests/post_request.json" and headers: | Content-Type | application/json | Then response status code should be 204 And response should be empty
Scenario: When I make a POST call to "successful/post" endpoint with post body: """ { } """ Then response status code should be "201" And response should be empty
Scenario: POST call with headers When I make a POST call to "test-app/successful/headers/post" endpoint with post body in file "/requests/post_request.json" and headers: | Content-Type | application/json | Then response status code should be 201 And response should be empty
Scenario: When I make a POST call to "successful/post" endpoint with post body in file "requests/post_request.json" Then response status code should be "201" And response should be empty
[[mock-externals-api-calls]] == Mock externals API calls
And then put the payloads (convention over configuration) in src/test/resources/restito
: i.e. get.user.71e7cb11.json
[[redis-assertions-and-setup]] == Redis assertions and setup
Scenario: Redis Steps for Key/Value Given I have the redis key "key1" with value "value1" Given I have the redis key "key2" with value in file "responses/value2.text" Given I have the redis key "key3" with value: """ value3
""" Given I have the redis key "key4" with value "value4" with ttl 5 seconds Then the redis key "key4" should be "value4" Then the redis key "key3" should exists Then the redis keys "key1,key2,key3" should exists Then the redis keys should exists: | key1 | | key2 | | key3 | Then the redis key "key4" should not exists after 6 seconds Then the redis key "key4" should not exists Then the redis keys "key100,key200,key300" should not exists Then the redis key "key1" should be "value1" Then the redis key "key2" should be: """ value2
""" Then the redis key "key3" should be file "responses/value3.text"
Scenario: Redis Steps for Lists Given I have the redis list "list1" with values "value1" Given I have the redis list "list2" with values in file "responses/list2.text" Given I have the redis list "list3" with values: | value3 | | value33 | | value333 | Given I have the redis list "list4" with values "value4" with ttl 5 seconds Given I have the redis list "list5" with values "value5,value55,value555" with ttl 5 seconds Then the redis list "list4" should be "value4" Then the redis list "list5" should be "value5,value55,value555" Given I have the redis list "list6" with values "value6,value66,value666" Then the redis list "list6" should be: | value6 | | value66 | | value666 | Then the redis list "list3" should exists Then the redis lists "list1,list2,list3" should exists Then the redis lists should exists: | list1 | | list2 | | list3 | Then the redis list "list5" should not exists after 6 seconds Then the redis list "list4" should not exists Then the redis lists "list100,list200,list300" should not exists Given I have the redis list "list7" with values "value7,value77,value777" Then the redis list "list7" should be file "responses/list7.text"
Scenario: Redis Steps for Cleaning Database Given I have the redis key "key" in the db 8 with value "value" Then I have the redis key "key" in the db 8 with value "value" Given I have cleaned redis db 8 Then the redis key "key" in the db 8 should not exists
[[database-assertions]] == Database assertions
You need to put your database connection properties in src/test/resources/test-db.properties
Write your feature in gherkin language in
src/test/resources/features/example.feature
it should be used in Then
steps to check the database
[[run-the-cucumber-tests]] == Run the cucumber tests
Write a cucumber integration-test in src/test/java
:
import org.junit.runner.RunWith;
import cucumber.api.CucumberOptions; import cucumber.api.junit.Cucumber;