Via G. Falcone 5, Pollenza (MC), Italy
+39 0733 203595

Uso del Page Object Pattern con Behat: esempio pratico

Il Page Object è un pattern utilizzato nei functional test per astrarre l’interazione con gli elementi della UI.
All’interno di un oggetto vengono incapsulate le interazioni e le funzionalità di una pagina web che vengono esposte tramite api, nascondendo la struttura degli elementi HTML all’esterno.
Per approfondire il concetto rimando all’articolo di Martin Fowler.

Perché usare il Page Object

L’uso del Page Object migliora la leggibilità e la manutenibilità dei test.
Incapsulando le interazioni con le pagine all’interno di oggetti riutilizzabili, si evita la duplicazione del codice.
I cambiamenti della UI saranno facilmente gestibili: basterà aggiornare i riferimenti o la logica nei metodi del Page Object, lasciando invariati i context e le features.

Esempio di utilizzo del Page Object Pattern

Per utilizzare questo pattern con Behat, occorre installare l’estensione BehatPageObjectExtension  seguendo le istruzioni presenti nella documentazione.

Scriviamo un semplice functional test per testare il corretto funzionamento del login utente, definito ad esempio dallo scenario:

Nello scenario vengono utilizzate due pagine:

  • Pagina di Login
  • Pagina del profilo utente

Vediamo come gestire l’interazione con la pagina di Login.
Creiamo il Page Object, LoginPage, che estende la classe  SensioLabs\Behat\PageObjectExtension\PageObject\PageQuesta classe estende  Behat\Mink\Element\DocumentElement , rendendo quindi utilizzabili le funzionalità di navigazione di Mink all’interno del Page Object.

L’HTML della pagina sarà ad esempio:

Compito del Page Object è di gestire l’interazione con la UI. Andiamo quindi a definire i metodi per interagire con essa:

Non ci resta che utilizzare la classe appena creata.
È possibile iniettare direttamente nel costruttore del Context i PageObject che ci servono:

Mappiamo quindi gli scenari con il contesto:

Per approfondire l’argomento vi invito a leggere la documentazione ufficiale.

Conclusioni

Come si può vedere dall’esempio, l’utilizzo del pattern ha permesso di separare la logica di interazione con la pagina, evitando qualsiasi riferimento agli elementi della UI nel Context, ed incapsulandola in un oggetto riutilizzabile.

Happy testing!

Se sei uno sviluppatore appassionato e curioso… scopri come unirti a noi!

P.S. Per rendere i test più solidi, conviene utilizzare come riferimenti degli attributi data-* creati ad hoc. Si eviterà così di dovere aggiornare i test ogni volta che viene cambiata una label, una classe o un name di un elemento. Ad esempio il codice potrebbe essere:

Related Posts

Leave a reply