2010-09-01 11 views
6

Używam ogórka z webrat/zmechanizować do testowania strony PHP i próbuję poprawić szybkość testów, unikając wykonywania niepotrzebnych kroków.Uruchomienie kroku logowania przed scenariuszem konspektu w ogórku

chcę użyć zarys scenariusza, by sprawdzić całe mnóstwo stron są dostępne/protected w zależności od użytkownika, który jest zalogowany:

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   | 
    ... 

To działa, ale biorąc pod uwagę mam 10 ról i setki strony do sprawdzenia, za każdym razem, gdy kontur jest uruchamiany, jest dużo narzutów podczas uruchamiania kroku logowania.

Zastanawiam się, czy istnieje sposób, aby raz uruchomić krok logowania dla każdej roli, a następnie odwiedzić każdą stronę po kolei bez konieczności logowania za każdym razem. tj. uruchom "Zaloguj się, odwiedź 1, odwiedź 2, odwiedź 3" zamiast "Zaloguj się, odwiedź 1, Zaloguj się, odwiedź 2, Zaloguj się, odwiedź 3".

Próbowałem używać haków i tła, ale nie można znaleźć podejścia, które działa. czy to możliwe?

+0

Możesz chcieć sprawdzić [Lampy] (http://github.com/aslakhellesoy/cucumber/wiki/Fixtures), jak również. – rampion

Odpowiedz

0

Można realizować krok Given tylko zalogować się raz do każdej roli:

# 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 

oczywiście, jeśli przyszłe kroki mogą zmienić stan zalogowania lub zmienić świat tak, że logowanie jest już nieważne, to może doprowadzić cię do końca, więc stąpaj ostrożnie.

+0

To wydaje się dobrym podejściem, jeśli strona, którą testowałem, została napisana w języku Ruby, ale testuję witrynę PHP i nie jestem pewien, jak zapisać stan logowania. – simoncoggins

0

Zamiast umieszczać wszystkie informacje o tym, co jest dostępne/chronione w funkcji, należy rozważyć umieszczenie ich w krokach (lepiej byłoby użyć definicji w aplikacji, ale to nie jest łatwe, jeśli aplikacja jest nie w procesie)

Jeśli można żyć z funkcji, która jest tak abstrakcyjny jak

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

Następnie można bardziej efektywnie wykonywać wszystkie prace w DEFS kroku

Poniżej znajduje tylko szkic kod dać wyobrażenie o wh możesz zrobić ...

# 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 

Możesz oczywiście rozbudować to przy użyciu pełnej mocy ruby, aby spełnić Twoje szczególne potrzeby. Podstawową ideą jest to, że zawsze możesz wykonać kilka czynności związanych z ogórkiem i zjednoczyć je w jedno działanie ogórka. ów

Nadzieja użyteczne

+0

Minusem takiego podejścia jest to, że interesariusze, którzy nie mogą pisać kodu, nie widzą, które strony i wiadomości mają być sprawdzane –

Powiązane problemy