Software testing is an investigation conducted to provide stakeholders with information about the quality of the product or service under test. Software testing can also provide an objective, independent view of the software to allow the business to appreciate and understand the risks of software implementation. Test techniques include, but are not limited to, the process of executing a program or application with the intent of finding software bugs (errors or other defects) – Wikipedia
The main intend of this post is, introduce you to UI tests over some ruby toys. In fact you could create an entire project (new) in ruby just to test your legacy web project. It’s cool, you can learn new language and work for the improvement of your legacy product. If you are totally new for ruby maybe a ruby overview can help you. (or might confuse you more)
Installing ruby, watir and rspec
Instead of installing the ruby directly, we are going to install the RVM (Ruby Version Manager) to then install any ruby we need. The steps described here were made on Ubuntu 11.04. On your terminal do the magic to install RVM.
bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)
echo ‘[[ -s “$HOME/.rvm/scripts/rvm” ]] && . “$HOME/.rvm/scripts/rvm” # Load RVM function’ >> ~/.bash_profile
And from now on, your life will be better on ruby interpreters versions. Let’s install the ruby 1.9.2. (terminal again)
rvm install 1.9.2
And if we want to see the rubies installed on our machine?
And now, how can we chose one ruby to work on the terminal session?
rvm use 1.9.2
gem install watir-webdriver gem install rspec
Since we have all things installed, we can move for the example. The feature I want to test is the search system of Amazon. Being more precise, I want to search for ‘Brazil’ and see if the ‘Brazil on the Rise’ is within the results as I want to be sure when I search for ‘semnocao‘ the Amazon doesn’t provide any result. Now, we can write the spec.
require 'amazon_page' describe AmazonPage do before(:each) do @page = AmazonPage.new end after(:each) do @page.close end it "should show 'Brazil on the Rise' when I query for [Brazil]" do @page.query 'Brazil' @page.has_text('Brazil on the Rise').should == true end it "should bring no result when I search for [semnocao]" do @page.query 'semnocao' @page.results_count.should == 0 end end
The specification is very simple, it will create a page before each test calling and close the page after each test calling. There is only two tests: test when you search for Brazil and when you search for semnocao. We will design the tests using page object pattern. The class bellow is the page which represents the Amazon page and all testable behaviors should be inside of it.
require 'watir-webdriver' class AmazonPage def initialize @page = Watir::Browser::new :firefox @page.goto 'http://www.amazon.com' end def close @page.quit end def query(parameter) @page.text_field(:id=>'twotabsearchtextbox').set parameter @page.send_keys :enter end def has_text(text) @page.text.include? text end def results_count if @page.text.include? 'did not match' 0 else @page.div(:id=>'resultCount').text.split(' ').gsub(',','').to_i end end end
To run this you just need to type on your terminal.
The final code can be downloaded or viewed at github.
- We could improve our story readibility with Cucumber.
- We could send the browser execution to an Xvfb server. (A.K.A. running headless) The browser pops up really bothers me.
- We could integrate it with our CI.
- We could design a base Page class for provide common operations as mixin or something