package mesure func Taille(a int) string { switch { case a < 0: return "negatif" case a == 0: return "zéro" case a < 10: return "petit" case a < 100: return "grand" case a < 1000: return "énorme" } return "énorme" }Dans le même répertoire ($GOPATH/src/mesure), créez le fichier mesure_test.go. Ce test unitaire va exécuter deux fois la méthode Taille : une fois avec le paramètre "-1" et une seconde fois avec le paramètre "5".
package mesure import "testing" type Test struct { in int out string } var tests = []Test{ {-1, "negatif"}, {5, "petit"}, } func TestTaille(t *testing.T) { for i, test := range tests { taille := Taille(test.in) if taille != test.out { t.Errorf("#%d: Taille(%d)=%s; attendu %s", i, test.in, taille, test.out) } } }Ouvrez une console et allez dans le répertoire où sont stockées les sources de ce package ($GOPATH/src/mesure), puis lancez les tests unitaires :
%go test PASS ok mesure 0.038sDepuis la version 1.2, il est possible d'obtenir le taux de couverture des tests unitaires à l'aide de l'option -cover :
%go test -cover PASS coverage: 42.9% of statements ok mesure 0.045sComment cet indicateur est-il calculé ? Comme expliqué dans l'introduction, une version spéciale de l'exécutable – dans laquelle go injecte l'instrumentation des tests unitaires – est compilée. Regardons à quoi ressemble code source de cette version spéciale :
func Taille(a int) string { GoCover.Count[0] = 1 switch { case a < 0: GoCover.Count[2] = 1 return "negatif" case a == 0: GoCover.Count[3] = 1 return "zéro" case a < 10: GoCover.Count[4] = 1 return "petit" case a < 100: GoCover.Count[5] = 1 return "grand" case a < 1000: GoCover.Count[6] = 1 return "énorme" } GoCover.Count[1] = 1 return "énorme" }Chaque partie exécutable du programme est complétée avec un compteur d'exécution qui, une fois qu'il est exécuté, enregistre que cette section a été exécutée. Le compteur est instrumenté dans le code source par l'outil de calcul de la couverture de test. Une fois que le code a été exécuté, l'outil fait les comptes et il est capable de déduire le pourcentage du code qui a été exécuté. Par exemple – en relisant le test unitaire – on sait que les lignes suivantes seront exécutées par les tests unitaires (soit un peu moins que la moitié du code):
go test -coverprofile=coverage.outPermet de générer un fichier de statistique (dans ce exemple, coverage.out) avec les lignes de code qui ont été exécutées ou pas
mode: set mesure\mesure.go:3.27,4.12 1 1 mesure\mesure.go:16.5,16.21 1 0 mesure\mesure.go:5.5,6.25 1 1 mesure\mesure.go:7.5,8.22 1 0 mesure\mesure.go:9.5,10.23 1 1 mesure\mesure.go:11.5,12.23 1 0 mesure\mesure.go:13.5,14.25 1 0On peut ensuite exploiter ce fichier de statistique en ligne de commande. Par exemple, avec cette commande qui donne le taux de couverture fonction par fonction :
go tool cover -func=coverage.outL'outil est également capable de générer un rapport HTML montrant les lignes de code sollicitées par le test unitaire (la commande ouvre le fichier HTML avec votre navigateur par défaut) :
go tool cover -html=coverage.outToujours avec notre exemple de code, voici ce qui serait généré : en vert, les lignes couvertes par les tests unitaires ; en rouge, les lignes non couvertes et en gris, les lignes où le code n'a pas été instrumenté :
Exemple de rapport de couverture de test unitaire en go
go test -covermode=count -coverprofile=count.outCette commande produit le fichier ci-dessous. On voit effectivement que la ligne contenant l'instruction switch a été exécutée deux fois (car il y a deux cas de test et ils passent tous les deux par ce point commun) :
mode: count mesure\mesure.go:3.27,4.12 1 2 mesure\mesure.go:16.5,16.21 1 0 mesure\mesure.go:5.5,6.25 1 1 mesure\mesure.go:7.5,8.22 1 0 mesure\mesure.go:9.5,10.23 1 1 mesure\mesure.go:11.5,12.23 1 0 mesure\mesure.go:13.5,14.25 1 0Comme précédemment, nous pouvons produire un rapport HTML qui montre cette fois-ci les endroits du code les plus sollicités par les tests unitaires :
Exemple de rapport de heatmap de couverture
Une traduction du blog officiel de golang expliquant le mécanisme de la réflexion en Go. Lire »
Traduction d'une partie des spécifications officielles du langage Go, cet article explique comment développer en Go. Lire »
Traduction d'un article du blog officiel expliquant comment échanger des données entre deux programmes golang grâce à un format natif Lire »
Exemples d'utilisation du type chan et des go routines stateful et stateless Lire »
Traduction d'une partie des spécifications officielles du langage go, cet article explique comment go gère la mémoire. Lire »
Soyez le premier à commenter cet article
Tous les commentaires sont soumis à modération. Les balises HTML sont pour la plupart autorisées. Les liens contextuels et intéressants sont en follow.