Alla base del test driven development c’è il concetto che si dovrebbe iniziare scrivendo un test che abbia successo solo quando il codice funziona nel modo desiderato. Può sembrare strano all’inizio, ma ha molto senso: il vostro nuovo test fallirà all’inizio perché il vostro programma non fa la cosa giusta, quindi è vostro compito scrivere il codice sufficiente (ma non di più!) per far passare il test.
Seguiremo questo approccio, ma prima dobbiamo fare un po’ di lavoro di impostazione per essere in grado di scrivere un test che fallisce.
Creiamo un nuovo progetto, per semplificare le cose possiamo anche scegliere di creeare già il terget di Test. Quindi: andate nel menu File e scegliete Nuovo > File. Dall’elenco delle opzioni, scegliete iOS > Sorgente > File Swift. Potete creare una classe qualsiasi, contenente un array. La useremo come demo.
class MyClass { var allWords = [String]() }
Ecco lo scheletro del nostro test:
import XCTest @testable import ProjectExample class ProjectExampleTests: XCTestCase { override func setUp() { super.setUp() } override func tearDown() { super.tearDown() } }
Scriveremo un test molto semplice per verificare che allWords abbia 0 elementi al suo interno. Aggiungiamo questo metodo subito dopo tearDown():
func test_allWordsEmpty() { let myInstance = MyClass() XCTAssertEqual(myInstance.allWords.count, 0, "allWords must be 0") }
Solito codice per creare un nuovo oggetto. La seconda riga è invece nuova e utilizza una funzione chiamata XCTAssertEqual(). Questa verifica che il suo primo parametro (myInstance.allWords.count) sia uguale al secondo (0). In caso contrario, il test fallisce e stampa il messaggio indicato nel parametro tre (“allWords must be 0”).
Ora che avete capito come funziona il test, passate il mouse sul diamante grigio accanto al test e fate clic sul pulsante play. Oppure per eseguire tutti i test (quando ne avrete scritti di più) potete usare la scorciatoia CMD+U. Xcode eseguirà questo singolo test, ovvero lancerà l’applicazione nel simulatore iOS e verificherà che l’array allWords contenga 0 elementi. Poiché non abbiamo ancora scritto alcun codice di caricamento, questo test avrà successo e il diamante diventerà un segno di spunta verde. Si vedrà anche un segno di spunta verde accanto al nome della classe in alto, il che significa che tutti i test di questa classe sono stati superati l’ultima volta che sono stati eseguiti.
Seguendo l’approccio TDD, potremmo scrivere un test che chiami un metodo e inserisca un nuova parole nell’array allWords. Scriviamo prima il test, che fallirà e ci porterò in red state, poi correggendo il codice tornemo in green state.
func test_insertInAllWords() { let myInstance = MyClass() myInstance.add("it works") //red state XCTAssertEqual(myInstance.allWords.count, 1, "new word not added") }
class MyClass { var allWords = [String]() func add(_ word: String){ allWords.append(word) } }
Tutti i test dovrebbero di nuovo passare. Commit!