Introduzione alla scrittura di test
Prima di iniziare a scrivere il programma, verranno fornite alcune nozioni sui test e si creerà il primo test. Il test dei pacchetti fornisce supporto per il test automatizzato dei pacchetti Go. L'esecuzione di test è importante per verificare che il codice funzioni come previsto. In generale si dovrebbe eseguire almeno un test per ogni funzione di un pacchetto per verificarne il funzionamento.
Una procedura consigliata per la scrittura di codice consiste nell'usare l'approccio di sviluppo basato su test (TDD). Usando questo approccio, si inizierà a scrivere i test. Si verificherà che tali test abbiano esito negativo perché il codice testato non esiste ancora. Infine si scriverà il codice che soddisfa i test.
Creare il file di test
Prima di tutto occorre creare il file Go in cui salvare tutti i test per il pacchetto bankcore
. Quando si crea un file di test, il nome del file deve terminare con _test.go
. Prima di _test.go si può usare quello che si vuole, ma è buona norma usare il nome del file che si sta testando.
Inoltre, ogni test che si vuole scrivere deve essere una funzione che inizia con Test
. Quindi, in genere, si usa un nome descrittivo per il test che si sta scrivendo, ad esempio TestDeposit
.
Passare al percorso $GOPATH/src/bankcore/
e creare un file denominato bank_test.go
con il contenuto seguente:
package bank
import "testing"
func TestAccount(t *testing.T) {
}
Aprire un terminale e assicurarsi di essere nel percorso $GOPATH/src/bankcore/
. Usare quindi il comando seguente per eseguire i test in modalità dettagliata:
go test -v
Go cercherà tutti i file *_test.go
per eseguire i test, quindi dovrebbe essere visualizzato l'output seguente:
=== RUN TestAccount
--- PASS: TestAccount (0.00s)
PASS
ok github.com/msft/bank 0.391s
Scrivere un test con esito negativo
Prima di scrivere qualsiasi codice, è necessario scrivere un test con esito negativo tramite TDD. Modificare la funzione TestAccount
con il codice seguente:
package bank
import "testing"
func TestAccount(t *testing.T) {
account := Account{
Customer: Customer{
Name: "John",
Address: "Los Angeles, California",
Phone: "(213) 555 0147",
},
Number: 1001,
Balance: 0,
}
if account.Name == "" {
t.Error("can't create an Account object")
}
}
Nel codice riportato sopra è stata introdotta una struttura per un conto e un cliente che non è stata ancora implementata. È stata inoltre usata la funzione t.Error()
per indicare che il test avrà esito negativo se qualcosa non accade nel modo in cui si presuppone che accada.
Si noti anche che il test contiene la logica per creare un oggetto account, che non esiste ancora. Ma in questo momento si sta progettando il modo in cui si vuole interagire con il pacchetto.
Nota
Il codice per i test viene messo a disposizione per evitare di spiegarlo riga per riga. Si dovrebbe però seguire il modello mentale di iniziare poco a poco ed eseguire tutte le iterazioni necessarie.
In questo caso si eseguirà una sola iterazione: scrivere il test, verificare che abbia esito negativo e scrivere il codice che soddisfa il test. Quando si scrive codice autonomamente, è consigliabile iniziare con un codice semplice e aggiungere complessità man mano che si procede.
Quando si esegue il comando go test -v
, nell'output dovrebbe essere visualizzato un test non superato:
# github.com/msft/bank [github.com/msft/bank.test]
.\bank_test.go:6:13: undefined: Account
.\bank_test.go:7:13: undefined: Customer
FAIL github.com/msft/bank [build failed]
Per il momento non si procederà oltre. Il test verrà completato e verranno creati nuovi test durante la scrittura della logica per il sistema di online banking.