Tests dans les sous-dossiers Go : analyse complète pour débutants

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Tests dans les sous-dossiers Go : résolvons le problème dont les tutoriels ne parlent pas

\n\n

Avez-vous déjà écrit des tests en Go et constaté qu'ils fonctionnent parfaitement à la racine du projet, mais dès que vous les déplacez dans un sous-dossier, tout se casse ? Cela vous dit quelque chose ? Si oui, vous n'êtes pas seul. La question "Golang tests in sub-directory" sur Stack Overflow a recueilli des milliers de vues. Et ce n'est pas surprenant : la documentation Go en parle de manière succincte, et les développeurs débutants sont souvent perdus.

\n\n

Dans cet article, nous allons comprendre comment organiser correctement les tests Go en utilisant des packages imbriqués, pourquoi c'est nécessaire et comment éviter les pièges. C'est parti !

\n\n

Pourquoi les tests dans les sous-dossiers sont-ils un problème ?

\n\n

Imaginez : vous avez un projet dont la structure ressemble à ceci :

\n\n
myapp/\n├── main.go\n├── go.mod\n└── utils/\n    ├── math.go\n    └── math_test.go
\n\n

Vous exécutez Go test à la racine - et tout fonctionne. Mais lorsque vous essayez d'exécuter les tests depuis le dossier utils, Go râle : "package myapp/utils is not in GOROOT". Une erreur familière ?

\n\n

Le problème est que Go fonctionne avec des packages, pas avec des dossiers. Lorsque vous créez un sous-dossier, vous créez en fait un nouveau package. Et les tests dans ce dossier doivent être exécutés en tenant compte de la structure modulaire du projet. Mais procédons dans l'ordre.

\n\n

Les bases : comment Go voit les tests

\n\n

En Go, les tests sont des fichiers ordinaires avec le suffixe _test.go. Ils peuvent se trouver :

\n
    \n
  • Dans le même package (tests blancs) - ils ont accès aux fonctions non exportées.
  • \n
  • Dans un package séparé avec le suffixe _test (tests noirs) - ils testent le package comme un utilisateur externe.
  • \n
\n\n

Lorsque vous placez des tests dans un sous-dossier, vous créez un nouveau package. Par exemple, le dossier utils est le package utils. Et les tests qu'il contient doivent appartenir à ce package.

\n\n

Exemple de structure correcte

\n\n
myapp/\n├── go.mod\n├── main.go\n└── utils/\n    ├── math.go        // package utils\n    └── math_test.go   // package utils
\n\n

Dans le fichier math.go :

\n
package utils\n\nfunc Add(a, b int) int {\n    return a + b\n}
\n\n

Dans le fichier math_test.go :

\n
package utils\n\nimport "testing"\n\nfunc TestAdd(t *testing.T) {\n    result := Add(2, 3)\n    if result != 5 {\n        t.Errorf("Expected 5, got %d", result)\n    }\n}
\n\n

Exécutez maintenant les tests depuis la racine du projet :

\n
go test ./utils/
\n\n

Ou depuis le dossier utils :

\n
cd utils\ngo test
\n\n

Tout fonctionne ! Mais que faire si vous avez une structure plus complexe ?

\n\n

Sous-dossiers imbriqués : plus profond qu'il n'y paraît

\n\n

Supposons que vous ayez un projet avec cette structure :

\n\n
myapp/\n├── go.mod\n├── main.go\n└── services/\n    ├── user/\n    │   ├── user.go\n    │   └── user_test.go\n    └── order/\n        ├── order.go\n        └── order_test.go
\n\n

Ici, chaque sous-dossier est un package séparé. Pour exécuter tous les tests de manière récursive, utilisez trois points :

\n\n
go test ./...
\n\n

Cette commande trouvera tous les packages du projet et exécutera leurs tests. Très pratique pour le CI/CD !

\n\n

Et si les tests sont dans le même dossier que le code ?

\n\n

Parfois, les développeurs placent les tests dans le même dossier que le code principal. C'est acceptable pour les petits projets. Mais pour les grands projets, il est préférable de placer les tests dans des sous-dossiers séparés - la structure devient plus propre.

\n\n

Erreurs typiques et leurs solutions

\n\n

Examinons les problèmes les plus courants rencontrés par les débutants lorsqu'ils travaillent avec Golang tests in sub-directory.

\n\n

Erreur 1 : "package is not in GOROOT"

\n

Cause : Vous essayez d'exécuter un test depuis un sous-dossier sans spécifier le module. Go ne sait pas à quel module appartient le package.

\n

Solution : Assurez-vous d'avoir un fichier go.mod à la racine

Blogs

Book Recommendations