1
A UNIVERSAL AUTOMATION
FRAMEWORK BASED ON BDD
CUCUMBER AND RUBY ON RAILS
SPEAKER: Anh Pham
INFOdation Viet Nam
AGENDA
2
Behavior-Driven Development
Automation Testing with Cucumber
BDD/Cucumber – Pros & Cons
Our Solutions: A Universal Test Automation
Framework
Demos
Future work
Q & A
3
Behavior Driven Development
Behavior Driven Development
4
Given When Then
to set up the
context where
the scenario
happens
to interact with
the system
somehow
to check that
the outcome of
that interaction
was what we
expected
An Example
Given I am on Amazon site
When I search for an Ipad
Then I should receive a list of Ipads
with various prices
5
Automation Testing With BDD Cucumber
Given(/^I am on the "([^"]*)" page$/) do |page|
visit(page)
end
And /^I set text on "(.*?)" with "(.*?)"$/ do |object,
text|
fill_in object, :with => text
end
Automation Testing With BDD
Cucumber
6
Feature: Login to the system
As a User role
I want to login into system with provided
username and password
Scenario: Verify that user can login system
Given I am on “localhost” page
When I set text on “UserName” with “usertest”
And I set text on “Password” with “Passwordtest”
And I click on “login” button
Then I verify that I am on “Dashboard” page
7
BDD/CUCUMBER – PROS & CONS
BDD/CUCUMBER - PROS
8
 BDD is FRIENDLY and UNDERSTANDABLE by non-
technical User.
 It is OPEN-SOURCE and large community supported.
 Multiple programing languages supported: Java,Ruby
Groovy, etc.
 Support on MULTIPLE PLATFORM, OS and different
browsers.
BDD/CUCUMBER - CONS
9
 Lacking of tool for managing Features, Scenario,
Report effectively.
 Need to set-up Ruby environment on each User’s PC.
 IN- COMPATIBILITY among Gem versions.
10
OUR SOLUTIONS – A Universal
Automation Framework Based BDD
Cucumber – Ruby on Rails - Appium
…Web and Web Services Testing
11
Feature: Login to the system
As a user, I want to login the system when I provide username and password.
Scenario: Verify user can login to the system successfully with valid account
Given I am on Login Page
When I login into system with username "testMYM2@gmail.com" and password "123456"
Then I am on Dashboard page
When /^I login into system with username "(.*)" and password "(.*)"$/ do |username, password|
step %{I set text on "textbox_username" with "#{username}"}
step %{I set text on "textbox_password" with "#{password}"}
step %{I click on "button_login"}
end
default_browser: chrome
wait_time: 30
test_page_address: http://mymethods.dev-infodation.com/
textbox_username: {xpath_selector: '//*[@id="login_user"]'}
textbox_password: {xpath_selector: '//*[@id="login_pass"]'}
And /^I click on "([^"]*)"$/ do |object|
execute_click(object)
end
When /^I send a POST XML request to "(.*?)" with the following file "(.*?)"$/ do |type, file|
file = Util.bind_with_dyn_vars(file)
url = Util.bind_with_dyn_vars($WS_URL)
# url=$WS_URL
data = File.read($test_data_dir + file)
$result=IFD_WS.send_XML_post_webservice(url,type,data)
end
def self.get_mysql_db_connection(schema)
begin
puts ("Connecting to database...");
data_source_schema = schema.downcase
return Mysql2::Client.new(host: $data_source_url, username: $data_source_username, password:
$data_source_password,database:data_source_schema);
rescue Exception => e
raise "Cannot connect to database [username: %s; password: %s, dbUrl: %s, dbName: %s] with error %s"
%
[$data_source_username, $data_source_password, $data_source_url,data_source_schema,
e.message]
end
end
Demo - Scenario Example
in BDD Format
12
Feature: Create a new user
In order to create new user account
As a User role
I want to create new user account
So that new user can be created successfully
Background: Clean up data before creating new user
Given I delete user email stc@demo.com if it is already existed on
database portal
Scenario: Create a new user
Given I am on Sign-up page
When I register new user name Anh Pham with email stc@demo.com
password 123456, password confirmation 123456
Then I verify user email stc@demo.com exists on database portal
…Web and Web Services Testing
13
Feature: Login to Bedder App
As a User role
I want to login into system with provided username and password
Scenario: Verify that user can login to Bedder mobile application
Given I have App running with appium
When I login to Bedder app with username "Test1c@infodation.vn" and password "111111"
Then I am on Dashboard Page
…Mobile Testing
14
JSON WIRE OVER HTTP
When /^I login to Bedder app with username "(.*)" and password "(.*)"$/ do |username, password|
step %{I input text "#{username}" on "bedder_signin_username"}
step %{I wait for 1 seconds}
step %{I input text "#{password}" on "bedder_signin_password"}
step %{I wait for 1 seconds}
step %{I click on "bedder_signin_login_button"}
end
And /^I input text "(.*)" on "(.*)"$/ do |text,object|
execute_settext(object,text)
end
And /^I click on "(.*)"$/ do |object|
execute_click object
end
def execute_click element
found_element = find_object element
if found_element != nil
startTime = Time.new.to_i
begin
sleep(1)
currentTime= Time.new.to_i
end while (currentTime - startTime) < $_CONFIG['Wait Time']
# selenium.execute_script('mobile: scroll', found_element)
found_element.click
else
put_log "nERROR: *** not found object: #{element}"
end
end
Demo - Scenario Example
in BDD Format
15
Feature: Login to Bedder App
As a User role
I want to login into system with provided username and password
Scenario: Verify that user can login to Bedder mobile
application
Given I have App running with appium
When I login to Bedder app with username
"Test1c@infodation.vn" and password "111111"
Then I am on Dashboard Page
…Mobile Testing
16
17
So, What Does This Universal Automation
Framework Resolve?
Universal Automation Framework
18
Universal Automation Framework
19
 Simplify the installation process and automation scripting.
 Quick adaptability when GUI elements changed.
 Ability to version Features, Scenarios and Reports.
 System deployment and Test management system
integrated.
20
Now, Let’s See The Architecture
Packaging Automation to RUBYGEM
Universal Automation Framework
21
22
Finally, It’s Universal...
Universal Automation Framework
23
Login to System
Define Features, Scenarios
Pull Code
Commit & Push code
Universal Automation Framework
24
Universal Automation Framework
25
Universal Automation Framework
26
27
Summary
Summary
Automation Framework (Core)
Portal System
Jan - 2016 Apr - 2016 Jun - 2016
Resource Allocation Man - days
Dev 1 70
Automation Tester 1 90
Total 2 160
28
29
Future Work
Future Work
Jira Integration
Confluence Integration
 Requirement Management
30
Q & A
31
© 2014 HCMC Software Testing Club
THANK YOU

A Universal Automation Framework based on BDD Cucumber and Ruby on Rails - Pham Quoc Anh

  • 1.
    1 A UNIVERSAL AUTOMATION FRAMEWORKBASED ON BDD CUCUMBER AND RUBY ON RAILS SPEAKER: Anh Pham INFOdation Viet Nam
  • 2.
    AGENDA 2 Behavior-Driven Development Automation Testingwith Cucumber BDD/Cucumber – Pros & Cons Our Solutions: A Universal Test Automation Framework Demos Future work Q & A
  • 3.
  • 4.
    Behavior Driven Development 4 GivenWhen Then to set up the context where the scenario happens to interact with the system somehow to check that the outcome of that interaction was what we expected An Example Given I am on Amazon site When I search for an Ipad Then I should receive a list of Ipads with various prices
  • 5.
  • 6.
    Given(/^I am onthe "([^"]*)" page$/) do |page| visit(page) end And /^I set text on "(.*?)" with "(.*?)"$/ do |object, text| fill_in object, :with => text end Automation Testing With BDD Cucumber 6 Feature: Login to the system As a User role I want to login into system with provided username and password Scenario: Verify that user can login system Given I am on “localhost” page When I set text on “UserName” with “usertest” And I set text on “Password” with “Passwordtest” And I click on “login” button Then I verify that I am on “Dashboard” page
  • 7.
  • 8.
    BDD/CUCUMBER - PROS 8 BDD is FRIENDLY and UNDERSTANDABLE by non- technical User.  It is OPEN-SOURCE and large community supported.  Multiple programing languages supported: Java,Ruby Groovy, etc.  Support on MULTIPLE PLATFORM, OS and different browsers.
  • 9.
    BDD/CUCUMBER - CONS 9 Lacking of tool for managing Features, Scenario, Report effectively.  Need to set-up Ruby environment on each User’s PC.  IN- COMPATIBILITY among Gem versions.
  • 10.
    10 OUR SOLUTIONS –A Universal Automation Framework Based BDD Cucumber – Ruby on Rails - Appium
  • 11.
    …Web and WebServices Testing 11 Feature: Login to the system As a user, I want to login the system when I provide username and password. Scenario: Verify user can login to the system successfully with valid account Given I am on Login Page When I login into system with username "testMYM2@gmail.com" and password "123456" Then I am on Dashboard page When /^I login into system with username "(.*)" and password "(.*)"$/ do |username, password| step %{I set text on "textbox_username" with "#{username}"} step %{I set text on "textbox_password" with "#{password}"} step %{I click on "button_login"} end default_browser: chrome wait_time: 30 test_page_address: http://mymethods.dev-infodation.com/ textbox_username: {xpath_selector: '//*[@id="login_user"]'} textbox_password: {xpath_selector: '//*[@id="login_pass"]'} And /^I click on "([^"]*)"$/ do |object| execute_click(object) end When /^I send a POST XML request to "(.*?)" with the following file "(.*?)"$/ do |type, file| file = Util.bind_with_dyn_vars(file) url = Util.bind_with_dyn_vars($WS_URL) # url=$WS_URL data = File.read($test_data_dir + file) $result=IFD_WS.send_XML_post_webservice(url,type,data) end def self.get_mysql_db_connection(schema) begin puts ("Connecting to database..."); data_source_schema = schema.downcase return Mysql2::Client.new(host: $data_source_url, username: $data_source_username, password: $data_source_password,database:data_source_schema); rescue Exception => e raise "Cannot connect to database [username: %s; password: %s, dbUrl: %s, dbName: %s] with error %s" % [$data_source_username, $data_source_password, $data_source_url,data_source_schema, e.message] end end
  • 12.
    Demo - ScenarioExample in BDD Format 12 Feature: Create a new user In order to create new user account As a User role I want to create new user account So that new user can be created successfully Background: Clean up data before creating new user Given I delete user email stc@demo.com if it is already existed on database portal Scenario: Create a new user Given I am on Sign-up page When I register new user name Anh Pham with email stc@demo.com password 123456, password confirmation 123456 Then I verify user email stc@demo.com exists on database portal
  • 13.
    …Web and WebServices Testing 13
  • 14.
    Feature: Login toBedder App As a User role I want to login into system with provided username and password Scenario: Verify that user can login to Bedder mobile application Given I have App running with appium When I login to Bedder app with username "Test1c@infodation.vn" and password "111111" Then I am on Dashboard Page …Mobile Testing 14 JSON WIRE OVER HTTP When /^I login to Bedder app with username "(.*)" and password "(.*)"$/ do |username, password| step %{I input text "#{username}" on "bedder_signin_username"} step %{I wait for 1 seconds} step %{I input text "#{password}" on "bedder_signin_password"} step %{I wait for 1 seconds} step %{I click on "bedder_signin_login_button"} end And /^I input text "(.*)" on "(.*)"$/ do |text,object| execute_settext(object,text) end And /^I click on "(.*)"$/ do |object| execute_click object end def execute_click element found_element = find_object element if found_element != nil startTime = Time.new.to_i begin sleep(1) currentTime= Time.new.to_i end while (currentTime - startTime) < $_CONFIG['Wait Time'] # selenium.execute_script('mobile: scroll', found_element) found_element.click else put_log "nERROR: *** not found object: #{element}" end end
  • 15.
    Demo - ScenarioExample in BDD Format 15 Feature: Login to Bedder App As a User role I want to login into system with provided username and password Scenario: Verify that user can login to Bedder mobile application Given I have App running with appium When I login to Bedder app with username "Test1c@infodation.vn" and password "111111" Then I am on Dashboard Page
  • 16.
  • 17.
    17 So, What DoesThis Universal Automation Framework Resolve?
  • 18.
  • 19.
    Universal Automation Framework 19 Simplify the installation process and automation scripting.  Quick adaptability when GUI elements changed.  Ability to version Features, Scenarios and Reports.  System deployment and Test management system integrated.
  • 20.
    20 Now, Let’s SeeThe Architecture
  • 21.
    Packaging Automation toRUBYGEM Universal Automation Framework 21
  • 22.
  • 23.
    Universal Automation Framework 23 Loginto System Define Features, Scenarios Pull Code Commit & Push code
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
    Summary Automation Framework (Core) PortalSystem Jan - 2016 Apr - 2016 Jun - 2016 Resource Allocation Man - days Dev 1 70 Automation Tester 1 90 Total 2 160 28
  • 29.
  • 30.
    Future Work Jira Integration ConfluenceIntegration  Requirement Management 30
  • 31.
  • 32.
    © 2014 HCMCSoftware Testing Club THANK YOU