2010-09-01 19 views
6

Estoy usando pepino con webrat/mechanize para probar un sitio PHP y estoy tratando de mejorar la velocidad de las pruebas al evitar ejecutar pasos innecesarios.Ejecutando un paso de inicio de sesión antes del esquema del escenario en pepino

Quiero usar un esquema escenario para comprobar un montón de páginas son accesibles/protegido según el usuario que está conectado:

Scenario Outline: Check page access is secure 
    Given I am logged in as "<user>" 
    And I am on <page> 
    Then I should see "<message>" 
Examples: 
    |user |page  |message    | 
    |admin |home page |Welcome to my site  | 
    |admin |admin page|Site administration | 
    |editor|home page |Welcome to my site  | 
    |editor|admin page|Access denied   | 
    |guest |home page |Please login   | 
    |guest |admin page|Access denied   | 
    ... 

Esto funciona, pero teniendo en cuenta que tengo 10 funciones y cientos de páginas para verificar, hay una gran cantidad de sobrecarga al ejecutar el paso de inicio de sesión cada vez que se ejecuta el esquema.

Me pregunto si hay una forma de ejecutar el paso de inicio de sesión una vez para cada función, luego visite cada página sin necesidad de iniciar sesión cada vez. es decir, ejecute "inicio de sesión, visite 1, visite 2, visite 3" en lugar de "inicio de sesión, visite 1, inicie sesión, visite 2, inicie sesión, visite 3".

He intentado utilizar ganchos y fondo, pero parece que no puedo encontrar un enfoque que funcione. es posible?

+0

Es posible que desee echa un vistazo a [Accesorios] (http://github.com/aslakhellesoy/cucumber/wiki/Fixtures) también. – rampion

Respuesta

0

Usted podría implementar el paso Given sólo para iniciar sesión una vez para cada rol:

# lazily log in each role as needed, and keep the login in a hash table 
$logins = Hash.new do |_logins, role| 
    _logins[role] = do_expensive_login(role) 
end 
Given /^I am logged in as "([^"]+)"$/ |role| 
    @login = $logins[role] 
end 

Por supuesto, si los futuros pasos pueden cambiar el estado de la conexión, o cambiar el mundo de tal manera que la entrada es ya no es válido, esto podría manguerarte por la línea, así que pisa con cuidado.

+0

Parece un buen enfoque si el sitio que estaba probando está escrito en Ruby, pero estoy probando un sitio PHP y no estoy seguro de cómo guardar el estado de inicio de sesión. – simoncoggins

0

En lugar de poner toda la información sobre lo que es accesible/protegido en la característica, considere ponerlos en los pasos definidos (aún mejor sería usar las definiciones en su aplicación, pero eso no es fácil si su aplicación es no en proceso)

Si se puede vivir con una característica que es tan abstracto como

Given I am an admin 
Then I should be able to access admin pages 

a continuación, puede hacer todo el trabajo mucho más eficiente en defs paso

siguiente es sólo un esbozo de código para dar una idea de wh por lo que puede hacer ...

# step def 
module AccessHelper 
    AdminPages = { 
    {page: ..., msg: ... 
    ... 
    } 
    def login_as ... ; end 
    def correct_message? msg ...; end 
    def check_admin_access_for user 
    @errors = [] 
    login_as @I 
    AdminPages.each do |page| 
     visit page[:path] 
     errors << page unless correct_message? 
    end 
    end 
end 
World(AccessHelper) 

Then "I should be able to access admin pages" do 
    check_admin_access_for @I 
    @errors.should be_empty 
end 

Por supuesto, puede ampliar esta usando todo el poder de rubí para satisfacer alguna exigencia en particular. La idea fundamental es que siempre puedes tomar varias acciones de pepino y resumirlas en una acción de pepino. eso es

Hope útiles

+0

Lo negativo de tal enfoque es que las partes interesadas que no pueden escribir código no pueden ver qué páginas y mensajes se deben verificar –

Cuestiones relacionadas