2011-08-03 11 views
5

Jestem nowy w testowaniu ogórków.Funkcje ogórka i definicje kroku

Stworzyłem dwie cechy pliki:

events.feature 
partner.feature 

i mają definicje mój krok w folderze step_definitions:

./step_definitions/ 
    events.rb 
    partner.rb 

Wydaje się, że ogórek wygląda we wszystkich .rb plików za informacje kroku .

Czy istnieje ograniczenie polegające na ograniczeniu funkcji do określonego pliku definicji kroku?

Powodem, dla którego chcę to zrobić, jest to, że otrzymuję niejednoznaczne błędy dopasowania, nawet jeśli używam flagi --guess.

Powód, dla którego chcę to zrobić, jest następujący: Testuję CMS i chcę przetestować każdy z różnych typów treści (zdarzenia & partnerów) w oddzielnych funkcjach.

events.feature

Feature: Add partner 
    As an administrator I can add a new partner 

    Scenario: Create partner 
    Given I am logged in 
    When I create a partner 
    Then I should see content 

partner.feature

Feature: Add event 
    As an administrator I can add a new event 

    Scenario: Create event 
    Given I am logged in 
    When I create an event 
    Then I should see content 

Tylko koncentrując się na 'potem muszę zobaczyć zawartość', który jest w obu przypadkach występuje błąd ponieważ w .rb plików muszę to:

partners.rb

Then /^I should see content$/ do 
    BROWSER.html.should include('SOME PARTNER CONTENT') 
end 

events.rb

Then /^I should see content$/ do 
    BROWSER.html.should include('SOME EVENT CONTENT') 
end 

co oznacza, że ​​jest niejednoznaczny mecz „powinien zobaczyć zawartość”.

Rozumiem, istnieją różne sposoby strukturyzacji to znaczy mogę utworzyć funkcję zawartości i użyć scenariusz przedstawia:

Feature: Add content 
    As an administrator I can add a new content 

    Scenario Outline: Create content 
    Given I am logged in 
    When I create an <content type> 
    Then I should see <example content> 

    Examples: 
    |event |March Event | 
    |partner |Joe Blogs | 

Ale nie chcę tego robić, bo chcę ująć każdą treść wpisz własną funkcję testową.

Zasadniczo muszę opracować sposób uruchamiania określonych plików kroków zgodnie z testowaną funkcją.

Odpowiedz

9

Ogórek zawsze ładuje wszystkie pliki i nie sądzę, że istnieje sposób na zastąpienie tego zachowania.Jeśli chodzi o problem z niejednoznacznych etapów - rozwiązanie jest proste - dodaj parametry do swoich krokach

Then /^(?:|I)should see "([^"]*)"$/ do |text| 
    page.should have_content(text) 
end 

I w scenariuszach po prostu nazwać jak ten

Następnie należy widzę „Content Partner”

  • darmowy bonus - Twój scenariusz jest teraz znacznie bardziej czytelny
+0

Zgadzam się w ten sposób. Jest też dużo bardziej wyrazisty, tak jak powinny być twoje kroki. –

1

Nie widzę niczego złego w alternatywnym podejściu, które sugerujesz. Rozdzielenie definicji kroków na domeny logiczne ma sens. Wygląda jednak na to, że możesz próbować zająć go zbyt daleko, a to doprowadzi do wielu powielonych kodów i problemów z niejednoznacznymi dopasowaniami, tak jak teraz. Ja polecam robić coś takiego:

Feature: Add partner 
    As an administrator I can add a new partner 

    Scenario: Create partner 
    Given I am logged in 
    When I create a partner 
    Then I should see "partner content" 

I podobnie, w funkcji zdarzenia:

... 
Then I should see "event content" 

Następnie można następujące w osobnym pliku: step_definitions/common_steps.rb

Then /I should see "(.*)"$/ do |content| 
    BROWSER.html.should include(content) 
end 

Ten krok nie ma nic wspólnego z konkretnym partnerem/zdarzeniem. Zamiast tego scenariusze zawierają ciągi danych specyficzne dla twoich funkcji.

Jeśli pracujesz nad aplikacją Rails, klejnot cucumber-rails faktycznie utworzy dla Ciebie szereg wspólnych kroków testowania aplikacji internetowych. Nawet jeśli nie używasz Railsów, warto przyjrzeć się niektórym z nich: steps.

+0

Tak - widzę twój punkt o duplikacie kodu - dziękuję. – JonB

0

Szukałem tego, ale wydaje się, że nie jest możliwe "od razu po wyjęciu z pudełka".

Moje rozwiązanie jest rozróżnienie czynności zawsze za pomocą jakiegoś dodatkowego opisu, takie jak nazwa klasy, na przykład:

Scenario: Buildings List 
    Given I have a Building with code "B1" 
    And I have a Building with code "B2" 
    When I go to the list of buildings 
    Then I should see "B1" building code 
    And I should see "B2" building code 

Te „kod budynku” opisy to wszystko czego nie trzeba ponownie użyć kroki pomiędzy różnymi plikami/domains.