J'ai remarqué que le test basé sur les tables recommandé par Go peut également être écrit en C.
Test piloté par table est recommandé pour les tests Go. La paire de données d'entrée et de valeur attendue donnée à la cible de test est traitée comme un cas de test, et la liste de la valeur attendue et de la valeur mesurée est affichée dans le tableau.
Par exemple, si vous écrivez un test pour la méthode gcd ()
de manière basée sur une table:
gcd_test.go
func TestGcd(t *testing.T) {
cases := []struct {
a, b int
z int
}{
{12, 8, 4},
{3, 7, 1},
}
for _, c := range cases {
if gcd(c.a, c.b) != c.z {
t.Errorf("expected gcd(%v,%v) == %v\n", c.a, c.b, c.z)
}
}
}
Go peut écrire des définitions de structure et des initialisations de variables en même temps. L'initialisation du cas de test est simple et sécurisée avec la syntaxe struct literal{}
. Le code est très facile à lire car vous pouvez vous concentrer uniquement sur les données de test.
J'ai aussi écrit un test pour gcd ()
en C en table-driven. Même en C, la déclaration de structure et l'initialisation des variables peuvent être effectuées en même temps. Et l'initialisation peut être de type sécurisé avec la syntaxe struct literal{}
.
gcd_test.c
#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
int test_gcd() {
struct {
int a, b;
int z;
} cases[] = {
{12, 8, 4},
{3, 7, 1},
};
for (int i = 0; i < ARRAY_SIZE(cases); ++i) {
if (gcd(cases[i].a, cases[i].b) != cases[i].z) {
printf("expected gcd(%d,%d) == %d\n", cases[i].a, cases[i].b, cases[i].z);
}
}
}
Par rapport à Go, il n'y avait pas de grande différence dans la quantité de description et de lisibilité, et j'ai pu écrire un test basé sur une table en langage C.
Go est souvent appelé simple C, mais c'est aussi une bonne idée d'importer la culture Go dans C.
Recommended Posts