You will need to have Ruby installed. Then Bundler for downloading dependencies.
- Download and install Ruby from http://rubyinstaller.org/downloads/ Ruby 2.5+ with DevKit. Make sure for full installation along with devkit
- Add Ruby bin path to Path variable
- Gem Installation – gem install bundler in command prompt
- Automation repository: git clone
- Change directory to root of api_automation_rest_soap project (api_automation_rest_soap)
- Run
bundle install
to download dependencies.
Using Rake you can run specific tests suites. Type 'rake -T' in terminal to see all Rake tasks to run. This is the command structure to run tests: rake rake
will run all tests with default configuration.
Available environment variables app_env [local, dev, qa] specifies on which environment to run tests (dev - default).
Examples: rake wip
will run all wip tests on default dev server. app_env=qa rake wip
will run all wip tests on localhost.(update config file for localhost endpoint)
gem 'rake' gem 'rspec' gem 'rspec-core' gem 'rspec_junit_formatter' gem 'rspec-retry' gem 'allure-rspec' gem 'jsonpath' gem 'rest-client' gem 'savon', '~> 2.12.0'
Rake is a Make-like program implemented in Ruby. Tasks and dependencies are specified in standard Ruby syntax.
RSpec is a computer domain-specific language (DSL) (particular application domain) testing tool written in the programming language Ruby to test Ruby code. It is a behavior-driven development (BDD) framework which is extensively used in production applications. https://rspec.info
Allure Framework is a flexible lightweight multi-language test report tool
JSONPath is used for selecting and extracting a JSON document's property values.
rest-client A simple HTTP and REST client for Ruby, inspired by the Sinatra's microframework style of specifying actions: get, put, post, delete. https://github.com/rest-client/rest-client
savon Heavy metal SOAP client https://github.com/savonrb/savon
config => hosts.json - list down host for Dev/QA
{ "dev": { "reqres": "reqres.in" }, "qa": { "reqres": "reqres.in" } }
config => users.json - list of test users used acrossed in automation
config => headers-cookies.json - common headers other than Authentication token
libs => helpers => setup.rb - Read host config and build base url, add save them in global variable
hosts = convert_to_json(read_file('./config/hosts.json')) app_env = ENV['app_env'] environment = app_env ? app_env : 'dev' if environment env_hosts = hosts[environment] $log.info "environment is #{environment}!" end $reqres_host = 'https://' + env_hosts['reqres'] + '/'
libs => helpers => login.rb - make changes in login_user to retrive authentication token and cookies, save them in global variable
def login_user begin url_for_send_token = $reqres + 'api/login' response = RestClient.post(url_for_send_token, { "email": "#{$user[:username]}", "password": "#{$user[:password]}" }, content_type: :json, accept: :json) rescue RestClient::Exception => e raise e end $auth_token = response["token"] $cookies = response.cookies end
libs => helpers => requests.rb - make changes in headers_cookies_manager for authentication token and cookies
def headers_cookies_manager headers_cookies = convert_to_json(read_file('./config/headers-cookies.json')) headers_to_send = headers_cookies['headers'] cookies_to_send = headers_cookies['cookies'] #set Authorization/authToken in headers/cookies headers_to_send = headers_to_send.merge({"token" => $token}) if $token cookies_to_send = cookies_to_send.merge($cookies) if $cookies return headers_to_send, cookies_to_send end
libs => helpers => requests.rb - list of available http methods
def send_file(api_url, file_path, method='post') def send_multipart_data(api_url, json, method = "post") def send_get_request(api_url, headers=nil) def send_post_request(api_url, json=nil, headers=nil) def send_delete_request(api_url) def send_archive_request(api_url, json) def send_patch_request(api_url, json, patch_header={}) def send_put_request(api_url, json) def get_file(api_url)
libs => assertions.rb - list of available assertions methods
def verify_response(response, expected_response, expected_response_code) def verify_response_code(response, expected_response_code) def verify_response_is_successful(response) def verify_response_is_successful_create_entity(response) def verify_response_message_equals(response, message) # response - Hash, message - string def verify_response_message_includes(response, message) # validate response with their values or "only_digits", "only_chars", "skip", "should_not_be_null" def verify_response_template(response, expected_response, expected_response_code)
Create lib dir and file for endpoint to test (ex libs => util-reqres and users.rb) Define all the CRUD operation for endpoint Expose request response json payload
#exposed for json to use in test attr_reader :user_post_payload_request, :user_post_response, :user_get_response def initialize init_variables end def users_url $reqres_host + '/api/users' end def post_user(user) send_post_request(users_url, user) end def get_user(id) send_get_request(users_url + "/#{id}") end def put_user(id, user) send_put_request(users_url + "/#{id}", user) end def patch_user(id, user) send_patch_request(users_url + "/#{id}", user) end def delete_user(id) send_get_request(users_url + "/#{id}") end #Define request and response payload, for large payload create them as file in test data and read here def init_variables @user_post_payload_request = convert_to_json('{ "name": "", "job": "" }') @user_post_response = convert_to_json('{ "name": "", "job": "", "id": "should_not_be_null", "createdAt": "skip" }') @user_get_response = convert_to_json('{ "data": { "id": "should_not_be_null", "email": "janet.weaver@reqres.in", "first_name": "Janet", "last_name": "Weaver", "avatar": "https://reqres.in/img/faces/2-image.jpg", }, "support": { "url": "https://reqres.in/#support-heading", "text": "To keep ReqRes free, contributions towards server costs are appreciated!", } }') end
Create file for endpoint to test (ex spec => reqres => users_spec.rb)
RSpec.describe "Users Reqres", :users do before(:all) { @users = Users.new } context "Users CRUD", :wip do test_data = [ { name: "morpheus", job: "leader"}, { name: "name1", job: "job1"} ] test_data.each { |test_case| it "Add #{test_case}, Update and Get" do post_user_request = @users.user_post_payload_request.merge!({"name" => test_case[:name], "job" => test_case[:job]}) response = @users.post_user(post_user_request) #verify_response_code(response, 200) #verify_response(response, @users.user_post_response) #expected_response = @users.user_post_response.merge!({ "name" => test_case[:name], "job" => test_case[:job] }) #verify_response_template(response, expected_response, 200) end } end end