Improve Writing your Cukes

November 1, 2012 Leave a comment

Based from the simple_search.feature that we have in Automated Testing with Cucumber + Capybara, we don’t want to limit users by writing element locators like id, css or xpaths, hardcoding search strings and validations in our Cucumber scenarios:

Simple search scenario


Scenario: A simple google search scenario
Given I am on the main google search
When I fill in "q" with "Cucumber test"
And I click "gbqfb" button
And I click on the first result
Then I should see "Cucumber lets software development teams describe how software should behave in plain text."

We can improve this 5-liner scenario by creating new step definition that accepts variable and reusing the previous step definitions in the new step.

Better search scenario


Scenario: The better way to do google search
Given I am on the main google search
When I search for "Cucumber test"
Then I verify first search result have "Cucumber lets software development teams describe how software should behave in plain text."

In order to make this new scenario running, we need to define the new step definitions:


Given /^I search for "([^\"]*)"$/ do |query|
 step %{I fill in "q" with "#{query}"}
 step %{I click "gbqfb" button}
end

Then /^I verify first search result have "([^\"]*)"$/ do |text|
 step %{I click on the first result}
 step %{I should see "#{text}"}
end

But wait, there’s even a better approach to present this scenario where we will use one of the Gherkin keyword “Scenario Outline.” Outline allows us to parameterized our test data by passing it to Examples.

Best search scenario

Scenario Outline: The best way to do google search
 Given I am on the main google search
 When I search for "<String>"
 Then I verify first search result have "<Search criteria>"

Examples:
 | String         | Search criteria   |
 | Cucumber tests | Cucumber          |
 | Selenium       | What is Selenium? |

Hope you had a great time, just like me. Happy Cuking!

Categories: cucumber, selenium Tags: , ,

Automated Testing with Cucumber + Capybara

October 29, 2012 10 comments

In this post we will introduce another gem called Capybara.

Capybara is an acceptance testing framework with a higher level API and support for multiple backends, supports Selenium and runs in different browsers.

Others may ask, “Why would I use capybara if selenium could also drive the browser the way I want it?”  Well, one advantage I appreciate is Capybara’s higher-level API compared to selenium.

Let’s take for example a simple scenario of typing strings to an input textbox:

Selenium-webdriver snippet


require 'selenium-webdriver'

element = driver.find_element :name => "q"
element.send_keys "Cucumber tests"

Capybara snippet

require 'capybara'

fill_in "q", "Cucumber tests"

You can obviously see from this example that Capybara enforces easier writing scripts ability. For a complete documentation on Capybara you can check this link from Github which I found very helpful.

After installation setup discussed in my previous post Introduction to Cucumber, you need to have the following folder structure and files:

I. Base Folder

Base Folder Structure

where:

features – folder to host all your feature files

step_definitions – folder to host all your step definition Ruby files

support – folder to host your configuration files (env.rb)

Gemfile – defines the top-level gems to be used in your project

II. Features

– describes the features that a user will be able to use in the program

Sample: simple_search.feature


Feature: As a user I should be able to perform simple google search

Scenario: A simple google search scenario
 Given I am on the main google search
 When I fill in "q" with "Cucumber test"
 And I click "gbqfb" button
 And I click on the first result
 Then I should see "Cucumber lets software development teams describe how software should behave in plain text."

III. Step Definition

– describes the actions that user will do for each step.

Sample: search_step.rb

Given /^I am on the main google search$/ do
 visit ('/')
end

When /^(?:|I )fill in "([^"]*)" with "([^"]*)"$/ do |field, value|
 fill_in(field, :with => value)
end

Then /^I click "([^"]*)" button$/ do |button|
 click_button(button)
end

Then /^I click on the first result$/ do
 find(:xpath, "//html/body/div[3]/div[2]/div/div[5]/div[2]/div[2]/div/div[2]/div/ol/li/div/h3/a").click
end

Then /^I should see "([^"]*)"$/ do |text|
 page.should have_content(text)
end

IV. Support

– hosts all configuration files

Sample: env.rb

require 'capybara'
require 'capybara/cucumber'

Capybara.default_driver = :selenium
Capybara.app_host = "http://www.google.com"
Capybara.default_wait_time = 20

World(Capybara)

V. Gemfile

– a format for describing gem dependencies required to execute Ruby codes

Sample: Gemfile


source "http://rubygems.org"

group(:test) do
 gem 'cucumber'
 gem 'capybara'
 gem 'rspec'
end

VI. Run

Using terminal go to your root project folder and type: cucumber or bundle exec cucumber

After the run, you should be able to see the results like this:

1 scenario (1 passed)
5 steps (5 passed)
0m9.461s

This example runs smoothly in Windows 7. Let me know if it works for you as well.

Introduction to Cucumber

October 29, 2012 1 comment

More than a testing tool, Cucumber is a collaboration tool.

It is designed to accommodate both the technical(developers, automation testers) and non-technical(stakeholders, product owners) members of the software development team.

Cucumber supports behavior-driven development(BDD). In BDD, users(business analysts, product owners) first write scenarios or acceptance tests that describes the behavior of the system from the customer’s perspective, for review and sign-off by the product owners before developers write their codes.

When you run your test, Cucumber reads through user-readable files called features, parse it to scenarios which contains set of steps that are then matched to a step definitions of Ruby code using a regular expression.

Feature files could be deceiving. It may look simple and plain in the outside. But complex in the inside, within step definition or the ruby files which controls the flow of actions and where all the magic happens.

In order for Cucumber to understand the feature files, it uses a basic syntax called Gherkin. Gherkin makes use of the following keywords for documentation and readability — Feature, Background, Scenario, Given, When, Then, And, But, *, Scenario Outline and Examples.

To dive more information about Cucumber, I would recommend you read The Cucumber Book  which have valuable information you would need in learning this new technology.

In preparation to  your Cucumber testing experience, will be needing to setup the following in your local machine.

1. Java installation – JRE will do, mine is Java(TM) SE Runtime Environment 1.6

2. Ruby installation – visit their Downloads page. I have Jruby 1.6.7.2 installed in my box.

Don’t forget to define Java and Ruby Path in your system’s environment variables as well.

3. RubyGems installation – use “gem install <name of gem>” command. Here are some of the basic, helpful gems:

– Cucumber

– Capybara

– Rspec

If you’re all setup, feel free to jump to the next post – Automated Testing with Cucumber + Capybara

Reference: The Cucumber Book by Matt Wynne and Aslak Hellesoy

Categories: cucumber Tags: , ,

Useful RubyMine Keyboard Shortcuts

September 14, 2012 Leave a comment

Meet my new colleague, Jetbrains RubyMine “The Most Intelligent Ruby on Rail IDE” sounds big huh! Since he will be my new companion / buddy for the next months to come, I decided to know him better and build a good rapport. 🙂

Here are some of the keyboard shortcuts I find to be friendly and useful:

Shortcut Description
Ctrl+Alt+S Go to Settings
Ctrl+N Open a class
Ctrl+Shift+N Open a file
Ctrl+B Go to declaration
Ctrl+Space Code completion
Ctrl+E Show recent files
Ctrl+K Commit changes
Ctrl+G Go to line
Ctrl+T Update project
Alt+Left/Right Navigate through the editor tabs
Ctrl+Slash Make a block comment
Ctrl+F Find from current file
Ctrl+Shift+F Find from current folder
Categories: ruby, technology Tags: ,

Error installing Nokogiri in Ubuntu 10.10

June 26, 2012 Leave a comment

Following Nokogiri Installation for Ubuntu I run below #nokogiri requirement in my terminal:

sudo apt-get install libxslt-dev libxml2-dev
sudo gem install nokogiri

Running “sudo gem install nokogiri” displays the following error:

Building native extensions.  This could take a while...
 ERROR:  Error installing nokogiri:
 ERROR: Failed to build gem native extension.
/usr/bin/ruby1.8 extconf.rb
 extconf.rb:5:in `require': no such file to load -- mkmf (LoadError)
 from extconf.rb:5
Gem files will remain installed in /var/lib/gems/1.8/gems/nokogiri-1.4.3.1 for inspection.
 Results logged to /var/lib/gems/1.8/gems/nokogiri-1.4.3.1/ext/nokogiri/gem_make.out

Was able to resolve the issue by installing ruby1.8-dev and reinstalling the nokogiri gem:

sudo apt-get install ruby1.8-dev 
sudo gem install nokogiri 

exist@exist:~$ sudo gem install nokogiri
 Building native extensions.  This could take a while...
 Successfully installed nokogiri-1.4.4
 1 gem installed
 Installing ri documentation for nokogiri-1.4.4...
Categories: ruby, technology, ubuntu Tags: ,

Resolving “Couldn’t open app window; is the pop-up blocker enabled?” Selenium error in IE 10

June 20, 2012 Leave a comment

Need to setup my Linux machine(master) to remotely access a Windows 8 machine(slave) with Internet Exporer 10 browser that will run my Selenium scripts.

master – machine where Selenium scripts, browser configurations are saved; one that will be sending requests to run the scripts

slave – machine where Selenium scripts will be run using a different platform (OS and browser); one that will accept the request to run the scripts

To do this, I configure the browser file from the master machine:

# for Internet Explorer
our $sel = Test::WWW::Selenium->new( host => "Windows Machine IP", port => 4445, browser => "*iexplore", browser_url => "application URL" );

From the slave machine, I needed to install the following:

– Java SE Runtime  Environment 1.7

– download latest Selenium Server from SeleniumHQ

To prepare the slave machine to accept the request, launch selenium server from the terminal using the same port set in the master machine:

java -jar selenium-server-standalone-2.23.1 -port 4445

To send request from the master machine, you may use “spec”, “rake” command depending on how you organized your test files. However after executing the command to run the scripts from the master machine, an error was encountered in the slave machine – “Couldn’t open app window; is the pop-up blocker enabled?”

IE 10 – Selenium error

Solution:
From the master machine, update browser configuration from “*iexplore” to “iexploreproxy”
# for Internet Explorer
our $sel = Test::WWW::Selenium->new( host => "Windows Machine IP", port => 4445, browser => "*iexploreproxy", browser_url => "application URL" );

What are You Doing?

May 29, 2012 Leave a comment

An investor once visited an IT company and was accompanied to the Quality Assurance department. He approached the QA Analysts and tried to do some small talk.

Investor: What are you guys doing?

Employee #1: Well, I’m executing these bunch of test scenarios repeatedly.

Image taken from http://www.zazzle.com

Employee #2: Well, I’m trying to earn a living.

New Peso Bills

Employee #3: Well, I make sure users will have a valuable experience with this cool stuff we are developing.

QA guys at work (Image taken by Ram Masinas)

Although the three employees are doing the same task, only one of them sees the bigger picture of their work and truly understands the value of their job. #Perspective

How about you, what are you really doing?

Categories: quality assurance Tags: ,