Testare applicazioni web con Selenium e Hudson

La fase di test di una applicazione è una di quelle più delicate in quanto dovrebbe cominciare (almeno il design) non appena i requisiti funzionali di una applicazione sono definiti. E’ difficile perchè entrano in gioco diversi fattori dall’usabilità di una applicazione all’architettura della applicazione stessa.

Normalmente in applicazioni Java avete Junit (o TestNG o ancora Nunit per applicazioni .NET) come libreria che vi permette di creare unit test per la vostra applicazione. In questa maniera avete modo di verificare che le vostre classi fanno il loro dovere. Per rendere poi gli unit test automatici potete usare continuous integration server come Hudson i quali non appena compilano il vostro codice permettono anche di eseguirli.

Se però sviluppate una applicazione con interfaccia web vi servirebbe uno strumento che vi permette di simulare il comportamento di un utente (cosa alquanto difficile) o comunque che dimostri che i requisiti funzionali dell’applicazione siano rispettati. Si parla di requisiti come:

  • se l’utente si vuole loggare sul sito web:
    • egli clicca sul link per accedere sulla pagina di login
    • digita username e password
    • clicca sul pulsante di login
    • appare una stringa dove esce il nome utente o comuque una pagina di benvenuto
    • l’attesa tra la pressione del pulsante login e il caricamento della pagina di benvenuto non deve essere più di tot secondi
  • se l’utente vuole cercare una risorsa nel sito web:
    • egli digita una parola chiave nell’apposito form
    • clicca sul pulsante cerca
    • visualizza, se esistono, pagine che contengono quella parola chiave

Rimane ovvio che il requisito del login più restringente è quello sul tempo di attesa, esso dovrebbe dipendere dall’achitettura software (accesso al database, uso di cookie ecc), mentre sulla ricerca non è sempre vero che inserendo una parola chiave riusciamo a trovare qualcosa.

Selenium è un software scritto per testare interfacce web che di base si presenta come una estensione per Firefox (Selenium IDE) o ancora come server (Selenium RC) per automatizzare i test e lanciare istanze di browser per eseguire i test stessi.

Selenium IDE in pratica permette di scrivere test tramite una comoda interfaccia web. Questi test in realtà vengono salvati come pagine html che contengono una semplice tabella come la seguente:

New Test
open /ig?hl=it
type q selenium
clickAndWait btnG
verifyTextPresent Selenium web application testing system
clickAndWait link=Selenium web application testing system
clickAndWait link=Documentation
clickAndWait link=Selenium-IDE

Questo test in particolare esegue la ricerca su http://www.google.it della parola “selenium”, verifica che tra i risultati compare la scritta “Selenium web application testing system”, clicca sul link e accede alla sezione documentazione sul Selenium-IDE. I comandi (scritti in Selenese :-) ) sono di semplice comprensione (accettano da 1 a 2 parametri) e possono essere generati automaticamente dal Selenium IDE utilizzando la modalità Record che registra l’attività utente sul sito web e modificati manualmente in ogni momento. Esistono diversi comandi che permettono per esempio:

  • di simulare il doppio click
  • di simulare la pressione di un tasto
  • di simulare il mouse sopra un particolare oggetto (evento OnMouseOver)
  • di fermare l’esecuzione del test per un determinato tempo
  • di rimuovere i cookie
  • di catturare lo screenshot di una pagina
  • di salvare e caricare variabili
  • ecc

Capite bene però che, leggendo il test precedente, il test può fallire per diversi motivi (il link documentazione è stato cambitato ad esempio) e non esistono condizioni per dire “se questa condizione fallisce allora verifica quest’altra”. Inoltre si vorrebbe verificare se gli stessi test sono validi su diversi browser e magari rendere la procedura più automatica possibile.

Ecco per cui è stato realizzato Selenium RC, un server java che rimane in ascolto di chiamate da client scritti in diversi linguaggi (Java, C#, Perl, PHP, Python, Ruby) ed esegue i test lanciando istanze di browser come Firefox, Internet Explorer, Safari e Opera.

Un esempio di test in Java sarebbe:

package com.example.tests;

import com.thoughtworks.selenium.*;
import java.util.regex.Pattern;

public class NewTest extends SeleneseTestCase {
    public void setUp() throws Exception {
        setUp("http://www.google.com/", "*firefox");
    }
      public void testNew() throws Exception {
          selenium.open("/");
          selenium.type("q", "selenium");
          selenium.click("btnG");
          selenium.waitForPageToLoad("30000");
          assertTrue(selenium.isTextPresent("Results * for selenium"));
    }
}

Il codice è anche qui di facile comprensione, occorre leggersi con comodo le API da usare. Quindi magari ora potreste pensare di includere il codice in Junit o Nunit test per esempio da essere eseguiti automaticamente da un continuous integration server.

Hudson in particolare ha 2 plugin di cui uno apposito per Selenium RC e permette di generare i report, alternativamente esiste un Ant task. La cosa interessante è che partono direttamente dall’html senza passare ai test scritti in Java (a voi la scelta).

Il problema concreto è quindi non tanto usare i comandi quanto identificare l’oggetto su cui eseguire il comando, infatti potete usare attributi Id, attributi Name, DOM, Xpath, CSS sta a voi vedere dove usare una tecnica o l’altra perchè per esempio in talune applicazioni gli attributi Id sono generati dinamicamente e non potete di conseguenza creare i test.

Sul sito di Selenium trovate molta documentazione dallo screencast, al forum, bug tracker e al wiki.

Sul sito di Refcardz trovate una scheda riassuntiva.

Qualche nota interessante:

Buon test e buon anno a tutti !

Advertisements

2 thoughts on “Testare applicazioni web con Selenium e Hudson

  1. buongiorno , volevo sapere se selenium ide è utilizzabile per modificare i parametri di un gioco online di facebook , esttamente si chiama kingdoms of camelot , se sì, volevo sapere come grazie

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s