2015-06-26 19 views
15

Ho costruito vari framework di automazione test utilizzando il modello di oggetto pagina con Java (https://code.google.com/p/selenium/wiki/PageObjects).Ruby è compatibile con il rigoroso Pattern oggetti pagina?

Due dei grandi vantaggi che ho trovato sono:

1) Si può vedere quali sono disponibili metodi quando si ha un esempio di una pagina (ad esempio, digitando homepage. mi mostrerà tutte le azioni/metodi che è possibile chiamare dalla homepage)

2) Poiché i metodi di navigazione (ad es. goToHomepage()) restituiscono un'istanza della pagina successiva (ad esempio la home page), è possibile spostarsi tra i test semplicemente scrivendo il codice e verificando la posizione.

ad es.

Questi vantaggi funzionano perfettamente con Java poiché il tipo di oggetto (o pagina in questo caso) è noto all'IDE.

Tuttavia, con Ruby, il tipo di oggetto non è fisso in nessun punto ed è spesso ambiguo rispetto all'IDE. Pertanto, non vedo come si possano realizzare questi benefici su una suite di automazione creata utilizzando Ruby (ad esempio utilizzando Cucumber).

Qualcuno può mostrarmi come useresti Ruby con il Page Object Pattern per ottenere questi benefici?

risposta

3

Da chiacchierando con i colleghi ho il sospetto che il seguente potrebbe essere la soluzione migliore (ma si prega di inviare una risposta alternativa, se esiste una soluzione migliore):

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 

Quindi, nell'esempio di cui sopra non restituiscono le istanze della pagina successiva quando si naviga intorno alla pagina (poiché la pagina restituita sarebbe semplicemente un tipo sconosciuto di oggetto). Inoltre, abbiamo bisogno di creare una nuova istanza di qualsiasi pagina su cui ci troviamo (usando ".new") in modo che almeno possiamo ottenere i vantaggi intellisense della digitazione di "film_page". e vedere quali azioni/metodi sono disponibili da quella pagina.

Qualcuno ha soluzioni migliori?

+2

Questo è l'approccio che uso in rubino. Penso che sia il modo più chiaro per lavorare. Tuttavia, definisco '@movie_page || = MoviePage.new', quindi posso riutilizzare l'istanza dell'oggetto di pagina in altri passaggi senza creare più oggetti di quanti ne abbia bisogno. Inoltre, questo ti consente di memorizzare le variabili tra i passaggi nell'istanza di quella pagina. In generale, lo evito, poiché da un POV di manutenzione non è sempre chiaro dove è stato impostato, ma in alcuni casi lo rende molto più facile da usare rispetto all'utilizzo di molte @ variabili nelle fasi di cetriolo. – alannichols

9

Da alcune ulteriori indagini, sembra che il requisito iniziale può essere soddisfatta utilizzando le variabili di istanza:

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 

Finché qualche parte sulla classe definizione passo si crea esplicitamente un nuovo oggetto pagina (nell'esempio di cui sopra : LaunchPage.new), quindi tutte le pagine successive appariranno e forniranno valori metodo/proprietà intellisense.

6

Uso Spinach invece di Cetriolo: è quasi identico, ma i passaggi sono racchiusi all'interno di una classe che è univoca per quel file di funzionalità, quindi non vi sono perdite di oggetti al di fuori dell'ambito corrente.

https://github.com/codegram/spinach

+0

Aggiungi collegamenti alle risorse che hai menzionato per essere il più utile possibile. –

+0

Modificato con un collegamento :-) –

Problemi correlati