2015-06-26 12 views
15

Mam zbudowane różne struktury automatyzacji testów, używając wzorca obiektu strony z językiem Java (https://code.google.com/p/selenium/wiki/PageObjects).Czy Ruby jest zgodne ze ścisłym wzorcem obiektów strony?

Dwa duże korzyści znalazłem to:

1) Można zobaczyć, jakie są dostępne metody kiedy trzeba instancję strony (np wpisując homepage. pokaże mi wszystkich działań/metod można zadzwonić ze strony głównej)

2) Ponieważ metody nawigacyjne (np. goToHomepage()) zwracają instancję kolejnej strony (np. stronę domową), można przechodzić testy przez proste napisanie kodu i zobaczenie, gdzie to zajmie.

np.

WelcomePage welcomePage = loginPage.loginWithValidUser(validUser); 
PaymentsPage paymentsPage = welcomePage.goToPaymentsPage(); 

Korzyści te doskonale sprawdzają się w Javie, ponieważ typ obiektu (lub strona w tym przypadku) jest znany w IDE.

Jednak z Ruby typ obiektu nie jest ustalony w żadnym punkcie i często jest niejednoznaczny dla IDE. Dlatego nie widzę, w jaki sposób można wykorzystać te zalety w pakiecie automatyzacji zbudowanym przy użyciu Ruby (na przykład przy użyciu ogórka).

Czy ktoś może mi pokazać, w jaki sposób można użyć Ruby z wzorcem obiektów strony, aby uzyskać te korzyści?

Odpowiedz

3

Z rozmów z kolegami Podejrzewam, że po może być najlepszym rozwiązaniem (ale proszę pisać alternatywną odpowiedź, czy lepszym rozwiązaniem nie istnieje):

When(/^I buy a movie from the movie page$/) do 
    movie_page = MoviePage.new 
    movie_page.buyMovie("Test Movie") 
    purchase_page = PurchasePage.new 
    purchase_page.confirmPurchase 
end 

więc w powyższym przykładzie nie wracają wystąpień następna strona podczas nawigacji po stronie (ponieważ zwrócona strona byłaby po prostu nieznanym typem obiektu). Dodatkowo, musimy stworzyć nową instancję dowolnej strony, na której się znajdujemy (używając ".new"), abyśmy przynajmniej mogli uzyskać korzyści z intellisense wpisując "movie_page". i zobaczenie, jakie akcje/metody są dostępne na tej stronie.

Czy ktoś ma lepsze rozwiązania?

+2

Jest to podejście, którego używam w ruby. Myślę, że to najczystszy sposób działania. Jednak definiuję '@movie_page || = MoviePage.new', dzięki czemu mogę ponownie użyć instancji obiektu strony w innych krokach bez tworzenia więcej obiektów, niż potrzebuję. Umożliwia to również przechowywanie zmiennych między etapami w instancji tej strony. Generalnie unikam tego, ponieważ z POV konserwacji nie zawsze jest jasne, gdzie został ustawiony, ale w niektórych przypadkach czyni go dużo łatwiejszym w użyciu niż używanie wielu @ zmiennych w krokach ogórka. – alannichols

9

Od jakiegoś dalszego dochodzenia, wygląda początkowy warunek może być spełniony za pomocą zmiennych przykład:

Given(/^I am on the launch page$/) do 
    @launch_page ||= LaunchPage.new 
end 

When(/^I open the set alarm time page$/) do 
    @set_alarm_page = @launch_page.goto_set_alarm_page 
end 

When(/^I open our apps from the home page$/) do 
    @launch_page.navigation_toolbar.open_our_apps 
end 

Then(/^I should see the homepage alarm time is (\d+)$/) do |alarm_time| 
    alarm_time_actual = @launch_page.get_alarm_time 
    assert_equal(alarm_time, alarm_time_actual) 
end 

Dopóki gdzieś w klasie rozdzielczości krok jawnie utworzyć nową stronę obiektu (w powyższym przykładzie : LaunchPage.new), następnie pojawią się wszystkie kolejne strony i podadzą wartość inteligentnej metody/wartości właściwości.

6

Używam szpinaku zamiast ogórka - jest prawie identyczny, ale kroki są zawarte w klasie, która jest unikalna dla tego pliku funkcji - więc nie ma wycieku obiektów poza bieżącym zakresem.

https://github.com/codegram/spinach

+0

Dodaj linki do zasobów, o których wspomniałeś, aby były jak najbardziej pomocne. –

+0

Edytowane za pomocą linku :-) –

Powiązane problemy