Test en Go (Golang) : frameworks et outils
Le test est une partie essentielle du développement de logiciels fiables. Le langage Go (Golang) a été conçu dès le départ en tenant compte des besoins de test : la bibliothèque standard contient le puissant package testing, et un riche écosystème d'outils supplémentaires s'est développé autour de lui. Dans cet article, nous allons détailler les principaux frameworks et outils de test en Go, y compris l'écriture de tests unitaires, l'utilisation de mocks, l'approche BDD et les benchmarks.
1. Le package standard testing
Le cœur des tests en Go est le package testing. Il fournit un ensemble de fonctions minimaliste mais très efficace. Les tests sont écrits dans des fichiers avec le suffixe _test.go et sont des fonctions ordinaires avec la signature func TestXxx(t *testing.T).
Exemple d'un test simple pour une fonction d'addition :
package main
import "testing"
func Add(a, b int) int { return a + b}
func TestAdd(t *testing.T) { result := Add(2, 3) expected := 5 if result != expected { t.Errorf("Add(2, 3) = %d; want %d", result, expected) }}L'exécution des tests se fait avec la commande :
go test ./...Le package testing prend également en charge :
- Les tests tabulaires — pour vérifier plusieurs ensembles de données d'entrée.
- Les sous-tests (avec
t.Run) — pour le regroupement et l'exécution parallèle. - Les benchmarks — fonctions de la forme
func BenchmarkXxx(b *testing.B). - Les exemples — fonctions
func ExampleXxx(), qui servent également de documentation.
2. Testify — extension des capacités de test
Testify est l'une des bibliothèques tierces les plus populaires pour les tests en Go. Elle étend le package standard testing en fournissant :
- assert — des fonctions pratiques pour vérifier des conditions avec des messages d'erreur clairs.
- require — identique à assert, mais interrompt l'exécution du test en cas d'erreur.
- suite — la possibilité de structurer les tests sous forme d'ensemble (structure avec méthodes).
- mock — un framework simple pour créer des objets mock.
Exemple d'utilisation d'assert et suite :
package main
import ( "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/suite")
type MySuite struct { suite.Suite Value int}
func (s *MySuite) SetupTest() { s.Value = 10}
func (s *MySuite) TestValue() { assert.Equal(s.T(), 10, s.Value, "Value should be 10")}
func TestMySuite(t *testing.T) { suite.Run(t, new(MySuite))}Testify rend le code des tests plus lisible et réduit la quantité de code passe-partout.
3. GoMock — génération de mocks
GoMock est un framework pour créer des objets mock basés sur des interfaces. Il se compose de deux parties :
- mockgen — un utilitaire pour générer le code des mocks.
- gomock — un package pour utiliser les mocks dans les tests.
Exemple d'utilisation de GoMock :
- Nous définissons l'interface :
package main
type UserService interface { GetUser(id int) (string, error)}- Nous générons le mock :
mockgen -source=user.go -destination=mock_user.go -package=main- Nous l'utilisons dans le test :
func TestGetUserName(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish()
mockService := NewMockUserService(ctrl) mockService.EXPECT().GetUser(1).Return("Alice", nil)
name,