This gem is currently under development. We're targeting most popular use cases - Rails & Rack applications (ex. Sinatra). However the philosophy behind it is not limited to Rails nor web applications in general. There is even example usage with EventMachine. Feel free to modify it for your own needs.
Object oriented acceptance testing using personas.
- Ruby
- OOP
- DCI (Data Context Interaction) - for roles/personas
- Test framework independent, based on Capybara
- Opinionated
- No Gherkin
- Objects and methods instead of steps
- Easier code reuse
- No factories/fixtures
First, add BBQ to your apps Gemfile:
# Gemfile
gem "bbq", "~> 0.0.2"
Run install generator:
rails generate bbq:install
Require BBQ in test/test_helper.rb (in case of Test::Unit):
require "bbq/test"
Require BBQ in spec/spec_helper.rb (in case of RSpec):
require "bbq/rspec"
rails g bbq:test MyFeatureName
For Test::Unit flavour:
rake test:acceptance
For RSpec flavour:
spec:acceptance
module Roundtrip
class TestUser < Bbq::TestUser
include Bbq::Devise
def update_ticket(summary, comment)
show_ticket(summary)
fill_in "Comment", :with => comment
click_on "Add update"
end
module TicketReporter
def open_tickets_listing
visit tickets_path
end
def open_ticket(summary, description)
open_tickets_listing
click_on "Open a new ticket"
fill_in "Summary", :with => summary
fill_in "Description", :with => description
click_on "Open ticket"
end
def show_ticket(summary)
open_tickets_listing
click_on summary
end
end
module TicketManager
def open_tickets_listing
visit admin_tickets_path
end
def close_ticket(summary, comment = nil)
open_tickets_listing
click_on summary
fill_in "Comment", :with => comment if comment
click_on "Close ticket"
end
def show_ticket(summary)
open_tickets_listing
click_on summary
end
end
end
end
class AdminTicketsTest < Bbq::TestCase
background do
admin = Factory(:admin)
@email, @password = admin.email, admin.password
end
scenario "admin can browse all user tickets" do
summaries = ["Forgot my password", "Page is not displayed correctly"]
descriptions = ["I lost my yellow note with password under the table!",
"My IE renders crap instead of crispy fonts!"]
alice = Roundtrip::TestUser.new
alice.roles(:ticket_reporter)
alice.register_and_login
alice.open_ticket(summaries.first, descriptions.first)
bob = Roundtrip::TestUser.new
bob.roles(:ticket_reporter)
bob.register_and_login
bob.open_ticket(summaries.second, descriptions.second)
charlie = Roundtrip::TestUser.new(:email => @email, :password => @password)
charlie.login # charlie was already "registered" in factory as admin
charlie.roles(:ticket_manager)
charlie.open_tickets_listing
charlie.see!(*summaries)
charlie.click_on(summaries.second)
charlie.see!(summaries.second, descriptions.second)
charlie.not_see!(summaries.first, descriptions.first)
end
end
require "bbq/test_user"
require "bbq/devise"
class TestUser < Bbq::TestUser
include Bbq::Devise
end
After that TestUser have login, logout, register, register_and_login methods.
test "user register with devise" do
user = TestUser.new # or TestUser.new(:email => "email@example.com", :password => "secret")
user.register_and_login
user.see!("Stuff after auth")
end
If you simulate multiple users in your tests and spawn multiple browsers with selenium it might
be a good idea to use Mongrel
instead of Webrick
to create application server.
We have experienced some problems with Webrick
that lead to Timeout::Error
exception
when user/browser that was inactive for some time (due to other users/browsers
activities) was requested to execute an action.
Put this code into a file loaded before running any acceptance scenario like:
test/test_helper.rb
or spec/spec_helper.rb
:
Capybara.server do |app, port|
require 'rack/handler/mongrel'
Rack::Handler::Mongrel.run(app, :Port => port)
end
Add mongrel
to your Gemfile
:
# In test group if you want it to
# be used only in tests and not in your development mode
# ex. when running 'rails s'
gem 'mongrel', "1.2.0.pre2", :require => false
bundle install
bundle exec rake test
- 2 problems with Cucumber http://andrzejonsoftware.blogspot.com/2011/03/2-problems-with-cucumber.html
- Object oriented acceptance testing http://andrzejonsoftware.blogspot.com/2011/04/object-oriented-acceptance-testing.html
- Events in acceptance tests http://andrzejonsoftware.blogspot.com/2011/04/events-in-acceptance-tests.html
- Paweł Pacana (http://github.com/pawelpacana)
- Andrzej Krzywda (http://andrzejkrzywda.com)
- Michał Łomnicki (http://mlomnicki.com)
- Robert Pankowecki (http://robert.pankowecki.pl)
- Piotr Niełacny (http://ruby-blog.pl)
- Peter Suschlik (http://peter.suschlik.de)
- Jan Dudek (http://jandudek.com)
MIT License