Le nostre competenze a vostra disposizione sul blog
Amiamo il nostro lavoro e vogliamo condividerlo con voi! Tenetevi aggiornati su tutte le news e le tecnologie con le quali lavoriamo e di cui potreste avere bisogno! Seguite il nostro blog.
×

Error message

The spam filter installed on this site is currently unavailable. Per site policy, we are unable to accept new submissions until that problem is resolved. Please try resubmitting the form in a couple of minutes.
alex.reggiani's picture

Tutte le volte che aggiungiamo una nuova caratteristica alle nostre applicazioni, lanciando il simulatore ed eseguendo una lunga serie di azioni ripetitive per verificare che tutto funzioni, eseguiamo la cosiddetta fase di Test.
Testare il software richiede quindi una mole di lavoro alquanto ripetitiva ed XCode ci viene ancora una volta in aiuto infatti, al posto di compiere le tipiche azioni che ci troviamo a fare in fase di test, come premere pulsanti o compiere "gesture" di ogni genere, è possibile creare degli script che svolgano questo compito al posto nostro.

A tale scopo, vedremo come utilizzare lo strumento UI Automation integrato in Instruments.

Come caso di studio, prenderò in considerazione un’app che gestisce una semplice tabella con un elenco di cibi, e le uniche azioni possibili sono le seguenti:

  • aggiungere un nuovo cibo alla lista
  • cancellarne uno presente
  • ordinare i cibi in ordine alfabetico o per data di inserimento

schermata_19.set.2013_21.37.59_simulatore_ios_.png

Apriamo Instruments scegliendo Profile dal menu Product. Xcode compilerà l'applicazione in modalità Release e successivamente aprirà Instruments.

Instruments quando è aperto presenta tutta una serie di template, ma per il nostro scopo quello che dobbiamo scegliere è UI Automation template.

schermata_2013-09-19_alle_21.57.01.png

Una volta selezionato, Instruments crea un nuovo Trace Document ed immediatamente incomincia a registrare una traccia dell'applicazione, ma siccome vogliamo incominciare la nostra cattura da zero, stoppiamo la registrazione cliccando il pulsante rosso di Stop nell'angolo in alto a sinistra.

schermata_2013-09-19_alle_22.15.05.png

Creiamo un nuovo script cliccando sul pulsante Add->Create nel pannello di sinistra, come mostrato in figura.

schermata_2013-09-19_alle_22.16.34.png

Una volta creato, viene mostrato il pannello nella parte inferiore dello schermo,

schermata_2013-09-19_alle_22.18.50.png

e come è possibile notare, UIAutomation ci espone tutto quanto attraverso JavaScript.
La prima linea, cattura l'istanza del target correntemente in uso, ovvero il simulatore.

Adesso incominceremo a registrare uno script compiendo diverse azioni sulla nostra applicazione, ad esempio:

  • clicchiamo sul pulsante "By Name"
  • clicchiamo sul pulsante Edit
  • clicchiamo sul pulsante "Done"

Per fare ciò, clicchiamo sul pulsante rosso di registrazione in basso nel pannello di script, ed una volta aperto il simulatore incominciamo a compiere in ordine le operazioni sopra elencate.

Ogni volta che compiamo un'azione, una linea di codice è aggiunta nel pannello dello script, mostrandoci come UIAutomation percepisce e cattura gli eventi.
Una volta eseguite tutte e quattro le azioni premiamo il pulsante di stop.

Se diamo uno sguardo al pannello dello script, noteremo le righe di codice aggiunte in relazione alle azioni che ha percepito:
schermata_2013-09-19_alle_22.38.06.png

A questo punto è sufficiente premere il pulsante Play per lanciare nuovamente il simulatore; instruments sostituisce automaticamente il pannello dello script con il pannello dei log
schermata_2013-09-19_alle_22.47.03.png

e magicamente verranno riprodotte tutte le azioni che avevamo registrato.

Abbiamo imparato quindi a registrare uno script che riproduca al posto nostro una serie ripetitiva di azioni, ma per il momento lo script che abbiamo registrato non fa nulla di utile.
Vediamo come scrive un acceptance test in modo che possiamo verificare che il comportamento dell'applicazione corrisponda effettivamente a quanto ci aspettiamo.

Scriviamo un semplice test per verificare che l'utente sia in grado di rimuovere un item dalla lista dei cibi, in particolare proviamo a rimuovere l'elemento "pizza".
Cancelliamo il contenuto dello script precedentemente registrato lasciando solamente la prima riga

var target = UIATarget.localTarget();

e registriamone uno nuovo compiendo le seguenti azioni:

  • clicchiamo sul pulsante Edit
  • clicchiamo sul pulsante rosso a sinistra dell'elemento "Pizza" per mostrare il pulsante "Delete"
  • schermata_2013-09-20_alle_09.36.53.png

  • clicchiamo sul pulsante Delete
  • clicchiamo sul pulsante Done

Se avete eseguito tutto quanto alla lettera, lo script riporterà il seguente codice:

schermata_2013-09-20_alle_09.40.23_0.png

Ora proviamo a "spaccare" il codice dell'applicazione per far si che l'elemento non venga più cancellato, ma prima di procedere proviamo a riscrivere lo script in una maniera un po' più comprensibile:
schermata_2013-09-20_alle_10.05.30.png
Quando accediamo alle celle della tabelle con l'istruzione

tableView.cells()

otteniamo un oggetto di tipo UIAElementArray, il quale fornisce diversi metodi di ricerca in una collezione.
Quello che fa al caso nostro, è il metodo firstWithName()
che ritorna il primo elemento che trova e che corrisponde al nome passato come parametro.

var pizzaCell = cells.firstWithName("pizza");

o nella sua forma equivalente

var pizzaCell = cells["pizza"];

Accediamo alla navigation bar per la pressione del pulsante Edit:

var navigationBar = app.navigationBar();

var editButton = navigationBar.leftButton();

if (editButton.name() == "Edit") {

	editButton.tap();

}

Una volta entrati in modalità di editing, dobbiamo recuperare e cliccare il pulsante rosso a sinistra dell'elemento pizza per far comparire il pulsante di Delete e successivamente cliccare su tale pulsante:

var deleteSwitch = pizzaCell.switches()[0];

if (deleteSwitch.value() == 0) {

	deleteSwitch.tap();

}


var deleteButton = pizzaCell.buttons()[0];

deleteButton.tap();

A questo punto, abbiamo riscritto il codice precedentemente registrato da Instruments, e se lo eseguiamo otteniamo lo stesso risultato, ovvero di cancellare la cella dell'elemento "Pizza".
La vera utilità però, sta nel poter testare se effettivamente la cella è stata cancellata o meno dopo la pressione del pulsante Delete, in modo da riportare un errore, facendo quindi fallire il test, nel caso in cui la cancellazione non sia andata a buon fine.
Per seguire tale controllo, possiamo dire allo script di aspettare che la cella da cancellare venga invalidata.
Esistono 2 metodi, pushTimeout() e popTimeout() che dicono al sistema quando aspettare prima di interrogare nuovamente l'interfaccia, per cui possiamo attendere qualche istante dopo la pressione del pulsante di delete prima di verificare se la cella da cancellare è ancora presente o meno. Sia in caso positivo che in caso negativo verrà poi stampato un messaggio nel pannello dei log.

target.pushTimeout(0.1);

pizzaCell.waitForInvalid();

target.popTimeout();


if (pizzaCell.isValid()) {

	UIALogger.logError("Error: the cell was not deleted!!");

} else {

	UIALogger.logMessage("The cell is gone!!!");

}

Prima di eseguire nuovamente lo script, accertiamoci che nella lista sia presente l'elemento "pizza": se non è presente, aggiungiamolo.

Una volta eseguito, se tutto va bene l'elemento pizza verrà cancellato, e il pannello del log mostrerà i seguenti messaggi:

schermata_2013-09-20_alle_10.40.13.png

Adesso proviamo a far fallire il test, commentando l'istruzione che cancella la riga della tabella

//[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

Clicchiamo nuovamente su menu Product->Profile, in modo che xcode compili le nostre modifiche e riavviamo poi lo script (ancora una volta accertiamoci che nella lista sia presente l'elemento "pizza" prima di eseguire lo script ed eventualmente aggiungerlo).

Questa volta, la cella non verrà cancellata e il nostro test fallirà.
Otre ad averne un riscontro visivo, è sufficiente controllare il pannello dei log che riporterà i seguenti messaggi:
schermata_2013-09-20_alle_10.51.24.png

Come è possibile notare, viene mostrato il messaggio di errore, a riportare il fatto che il test è fallito.

Questo è solo un piccolo esempio di come si crea uno script di test per un' applicazione, ma è possibile crearne una moltitudine, ciascuno dei quali vada a testare un sottoinsieme di funzionalità dell'applicazione.

Per approfondire l'argomento, si rimanda al testo "Test iOS Apps with UI Automation" scritto da Jonathan Penn.

Aggiungi un commento

Filtered HTML

  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Lines and paragraphs break automatically.

Plain text

  • No HTML tags allowed.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Lines and paragraphs break automatically.