/bbq

Object oriented acceptance testing using personas.

Primary LanguageRubyMIT LicenseMIT

Warning & disclaimer

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.

Build Status

BBQ

Object oriented acceptance testing using personas.

  • Ruby
  • OOP
  • DCI (Data Context Interaction) - for roles/personas
  • Test framework independent, based on Capybara
  • Opinionated

Difference from Cucumber

  • No Gherkin
  • Objects and methods instead of steps
  • Easier code reuse
  • No factories/fixtures

Example applications

Related examples

Installation

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"

Feature generator

rails g bbq:test MyFeatureName

Running features

For Test::Unit flavour:

rake test:acceptance

For RSpec flavour:

spec:acceptance

Examples

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

Deal with Devise

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

Caveats

Timeout::Error

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

Development environment

bundle install
bundle exec rake test

Additional information

Maintainers

Contributors

Future plans

License

MIT License