2013-07-31 15 views
7

Napisałem modalny pokaz slajdów dla naszej aplikacji internetowej, która przedstawia nawigację dla zestawów dokumentów i udostępnia różne metadane dla tych dokumentów.Ograniczaj krok lub krok ogórka do określonej funkcji lub tagu.

Jest to duży składnik aplikacji o wymaganiach ezoterycznych, więc uważam, że jest wystarczająco sprawiedliwy, aby jego podstawowe scenariusze (dane mi jako kryteria akceptacji) były zarówno liczne, jak i wewnętrznie spójne.

Aby uniknąć nowy krok dla każdego z naszych wielu scenariuszy, jakie dostosowany a helper co przekłada ludzku-czytelne takich jak document caption do selektorów:

module SelectorsHelper 
    def selector_for(term) 
    case term 
    # Lightbox/modal/fancybox 
    when 'lightbox' 
     '#fancybox-inner' 
    when 'close button' 
     '.document-viewer__tools__close' 

... obok kilku definicji kroku generycznych, takich jak następujące:

# Generic click action 
When(/^I click (?:on)?(?:the |a)'(.*?)'?$/) do |element| 
    find(selector_for(element)).click 
end 

problem, czy jestem działając na bardzo ogólnych pojęć jak z powyższych lub bardziej konkretnych abstrakcji obejmujących wzory powtarzające się w zestaw funkcji, jest to, że mogą one siać spustoszenie w z innymi ezoterycznymi funkcjami, które mogą mieć znacznie bardziej szczegółowe kroki, aby je przeanalizować. Każdy przykład Cucumbera, który widziałem, zawiera pliki definicji kroków, których nazwa pliku zawiera związek proceduralny z konkretnym plikiem funkcji, a moim założeniem było, że w tych przypadkach ten plik definicji kroku byłby wywoływany tylko w celu analizowania scenariuszy powiązanych funkcji:

+ features 
| + step_definitions 
| | + global_steps.rb 
| | + modal_steps.rb 
| | + login_steps.rb 
| + modal.feature 
| + login.feature 

Ale to nie jest przypadek - a ja usiłuje pogodzić się z poglądem, że ogórek próby zastosowania co krok wzory definicję każdy scenariusza. Jeśli testy te będą miały jakąkolwiek wartość, będą się powiększać, wprowadzać nowe koncepcje i pozostaną aktualne bez ciągłego przepisywania. Chcę móc ograniczyć zakres moich działań, aby uniemożliwić im ingerencję w funkcje, dla których nie napisano, ale nie wiem jak. Następujące rozwiązania koncepcyjne przychodzą na myśl:

  • tle wykorzystania lub scenariusza @tags i wywołać kroki tylko dla scenariuszy z tych tagów
  • definicje krok
  • gniazdo w jakimś owijania pomocnika lub meta-krok-definition, która jest wywoływana przez fallacious tło podane

jestem zaznajomiony z Ruby i Ogórek wydaje się bardzo cienkie, więc jestem obawiają się nieograniczonym potencjałem, z jednej strony i nie ma ustalonej realizacji z drugiej. Jakieś pomysły?

Odpowiedz

4

Z mojego doświadczenia wynika, że ​​zbyt ogólne czynności prowadzą do wyjątkowo trudnej do utrzymania podstawy kodu automatyzacji. Jeśli to możliwe, staraj się zachować równowagę, tylko Ty możesz ocenić, gdzie leży ta równowaga. Nie chcesz zbytnio powtarzalnych definicji kroków, ale nie chcesz, aby super ogólny koszmar był debugowany.

Możliwe jest użycie obejścia, aby przejść do listy tagów, ale proszę, nie rób tego. To wulgarne, dziwne, a nie jak ma być użyty ogórek.

Jako obejście w swoim step_definitions można użyć obejść, aby uzyskać listę nazw znaczników ze scenariusza -

Around do |scenario, block| 
    begin 
    @tag_names = scenario.tags.collect { |tag| tag.name } 
    block.call 
    ensure 
    $tags = nil 
    end 
end 

Następnie w kontroli ciała step_definition jeśli znacznik chcesz wykryć jest zawarty w lista -

Given(/^I am testing a step with a "([^"]*)"$/) do |arg| 
    if @tag_names.include?('@a_tag') 
    puts 'Executing a step definition with tag - @a_tag' 
    else 
    puts 'Executing a step definition without tag - @a_tag' 
    end 
end 

Ta cecha -

Feature: Example feature 

    @a_tag 
    Scenario: Example scenario #1 
    Given I am testing a step with a "value" 

    Scenario: Example scenario #1 
    Given I am testing a step with a "value" 

Wyniki w t jego wyjście -

Feature: Example feature 

    @a_tag 
    Scenario: Example scenario #1    # features/example.feature:4 
    Given I am testing a step with a "value" # features/step_definitions/step_definitions.rb:10 
     Executing a step definition with tag - @a_tag 

    Scenario: Example scenario #1    # features/example.feature:7 
    Given I am testing a step with a "value" # features/step_definitions/step_definitions.rb:10 
     Executing a step definition without tag - @a_tag 

2 scenarios (2 passed) 
2 steps (2 passed) 
0m0.004s 

Jeszcze raz myślę, że używanie tego jest niesamowicie złym pomysłem. Lepiej jest mieć powtarzające się definicje kroków, które są łatwe do naśladowania i debugowania, a następnie mieć jedną ogólną definicję kroków, aby rządzić nimi wszystkimi!

Edytuj - Po ponownym przeczytaniu twojego pytania i wpisu na blogu nie sądzę, że to naprawdę odpowie na twoje pytanie. Jednak jestem dość pewny, że próbujesz zrobić coś nie-ogórkowego

+0

Myślę, że moje pytanie szukało zbyt specyficznego rozwiązania niewiarygodnie ogólnej sytuacji. Jest to równie dobre pytanie, na które mogłem liczyć. Twoja rada - _nie to, jak zamierza się używać ogórek- ma wiele sensu. Gdybym wrócił do używania ogórka, przestrzegałbym tej rady! – Barney