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.