Steak acceptance testing +

Por Boris Barroso

Hasta hace algún tiempo he utilizado cucumber como mi herramienta principal de testeo para pruebas de aceptación, pero la verdad suele ser muy vervoso y los clientes no escribiran sus historias.

Steak

Steak es una herramienta minimalista basada en Rspec para realizar pruebas de aceptación, aún no posee algunas de las caracteristicas que extraño de cucumber como las tablas, pero me siento mas confortable con esta herramienta.

Comencemos

El demo que dare sera para rails 3 y mostrare como se puede realizar tests junto a devise, lo primero que hay que hacer es modificar el archivo Gemfile y añadan lo siguiente

gem 'devise'
# Es necesario añadir este grupo para que funcionen los generators
group :development do
  gem 'rspec-rails'
  gem 'steak', '>= 1.0.0.rc.1'
end
group :test do
  gem 'rspec'
  gem 'steak', '>= 1.0.0.rc.1'
  gem 'capybara'
  gem 'factory_girl_rails'
end

Una ves que tengan esto en su archivo Gemfile ejecuten en la consola

bundle install

y despues que instale las gemas ejecuten

rails generate devise:install
rails generate rspec:install
rails generate steak:install

Ya tenemos la instalación lista ahora comencemos a realizar tests, como sabran devise es un motor (engine) que nos proporciona autenticación, registro y recuperación de contraseñas, es muy completo pero es necesario añadir el siguiente archivo en spec/acceptance/support/warden.rb para que puedan funcionar los tests

RSpec.configure do |config|
  config.include Warden::Test::Helpers
  config.after { Warden.test_reset! }
end

Ahora ya podremos testear con devise, si desean saber mas de como funciona devise visiten en este blog (como usar devise con rails 3) donde támbien en los comentarios hay vínculos relacionados con mas detalles sobre devise. Comencemos con algo sencillo, creamos un usuario para poder acceder a una página restringida, tratare de ser lo mas breve asi que usare User en ves de Usuario.

rails generate devise User

Esto genera la migración archivos para testear el modelo, corremos la migración

rake db:migrate

Ahora tenemos que crear la base de datos para hacer tests

 rake db:test:clone

Lo que vamos a realizar es permitir solo a los usuarios autenticados ingresar al controlador users
entonces creamos un controlardor para el modelo User

rails generate controller users index show new create destroy update

Ahora tendriamos que editar el archivo config/routes.rb para que nuestro root (raíz) sea el controlador users, entonces aumentamos al archivo dentro de las rutas

root :to => 'users#index'

Entonce ahora si podemos realizar las pruebas y comenzar a testear nuestro sistema. Ahora generemos el test de aceptacion para steak

rails generate steak:spec login_user

Bueno ya tenemos el controlador, el modelo y el test de aceptación pero lo que queremos es que solo  usuario User que este logueado pueda tener acceso al  controlador users entonces editamos el archivo spec/acceptance/login_user_spec.rb

require File.dirname(__FILE__) + '/acceptance_helper'

feature "Login" do
  # Creamos un usuario
  background do
    User.create(:email => 'user@mail.com', :password => 'demo123', :password_confirmation => 'demo123')
  end
  # Este es el escenario que correra
  scenario "el usuario no debe acceder al controlador users" do
    # Primero nos aseguramos de que no haya sesiones de usuarios
    visit "/users/sign_out"
    visit "/users"
    # page es una variable tipo Capybara::Session
    page.current_path.should == "/users/sign_in"
  end
end

Corramos el test con el comando

rspec spec/acceptance/login_user_spec.rb

Nos retorna un error, hagamos que pase el test, editemos nuestro controlador

class UsersController < ApplicationController
  # método de devise que permite verificar si un usuario esta logueado
  # caso contrario este redirecciona a '/users/sing_in'
  before_filter :authenticate_user!
  def index
    render :text => 'Prueba'
  end
end

Corremos de nuevo nuestro test y vemos que esta ves pasa, ahora veamos como tenemos que hacer el test para que podamos loguearnos y despues visitar users

require File.dirname(__FILE__) + '/acceptance_helper'

feature "Login" do

  background do
    User.create(:email => 'user@mail.com', :password => 'demo123', :password_confirmation => 'demo123')
  end

  # El anterior escenario ...

  scenario "el usuario debe poder ingresar y loguearse" do
    # Primero nos aseguramos de que no haya sesiones de usuarios
    visit "/users/sign_out"
    visit "/users"
    fill_in "user[login]“, :with => ‘user@mail.com’
    fill_in “user[password]“, :with => ‘demo123′
    click_button “Sign in”
    page.current_path.should == “/users”
  end
end

Entonces ahora si debe pasar el test :), pero algo que es importante y que nos ayudara a escribir mucho menos código la siguiente ves es poder crear helpers, hagamos que la creación de un usuario y el logueado sea un helper de tal forma que podamos llamar a un método create_and_login_user para crear un usuario y loguearnos, entonces creamos el archivo spec/acceptance/support/helpers.rb

module HelperMethods
  def create_and_login_user
    Create.user!(:email => 'user@mail.com', :password => 'demo123', :password_confirmation => 'demo123')
    visit '/users/sign_out'
    visit '/users/sign_in'
    fill_in "user[login]“, :with => ‘user@mail.com’
    fill_in “user[password]“, :with => ‘demo123′
    click_button “Sign in”
  end
end

Y ahora solo llamamos al método create_and_login_user dentro de nuestro escenario

3 comentarios en “Steak acceptance testing”

  1. hola..ante todo queria felicitarte por ste blog, lo sigo ya desde algun tiempo y siempre saco buena informacion y buenos tutoriales…voy a probar este “bistek” a ver como me va, ya muchas personas me lo han recomendado y por alguna extraña razon tengo problemas con cucumber en rails 3 (algo con los generadores que a fin de cuenta tampoco he tenido tiempo de buscar soluciones)…gracias y espero que sigas posteando mas articulos e info..

  2. Muy útil. Felicitaciones por la nota.

  3. Excelente entrada. (sólo la falta de ortografía: vez ves) :)
    Pero me has salvado la mañana…

Su comentario