Test en Go (Golang) : frameworks et outils
Go (Golang) a été conçu dès le départ en tenant compte des besoins du développement moderne, c'est pourquoi la bibliothèque standard contient déjà un puissant package testing. Cependant, pour les projets complexes, des outils supplémentaires sont souvent nécessaires : mocks, assertions, style BDD et vérification des fuites de goroutines. Dans cet article, nous allons passer en revue les principaux frameworks et bibliothèques pour les tests en Go, montrer des exemples de code et expliquer quand utiliser quoi.
1. Package intégré testing
Le package standard testing est la base de tout. Les tests sont écrits dans des fichiers avec le suffixe _test.go, et les fonctions doivent avoir la signature func TestXxx(t *testing.T). Exemple :
package main
import ( "testing")
func Sum(a, b int) int { return a + b}
func TestSum(t *testing.T) { result := Sum(2, 3) expected := 5 if result != expected { t.Errorf("Sum(2,3) = %d; want %d", result, expected) }}Exécution des tests : go test ./.... Pour les benchmarks, on utilise testing.B, pour les exemples — ExampleXxx.
2. Bibliothèque testify
Testify est la bibliothèque tierce la plus populaire pour les tests en Go. Elle fournit des assertions pratiques, des mocks et des fonctions auxiliaires.
Installation :
go get github.com/stretchr/testifyExemple avec des assertions :
package main
import ( "testing" "github.com/stretchr/testify/assert")
func TestSumWithTestify(t *testing.T) { result := Sum(2, 3) assert.Equal(t, 5, result, "Sum should be 5") assert.NotEqual(t, 0, result) assert.True(t, result > 0)}Testify inclut également le package mock pour créer des mocks. Exemple :
package main
import ( "testing" "github.com/stretchr/testify/mock")
// DataService — interface que nous allons mockertype DataService interface { GetData(id int) string}
// MockDataService — structure mocktype MockDataService struct { mock.Mock}
func (m *MockDataService) GetData(id int) string { args := m.Called(id) return args.String(0)}
func TestGetData(t *testing.T) { mockService := new(MockDataService) mockService.On("GetData", 1).Return("result1")
result := mockService.GetData(1) assert.Equal(t, "result1", result) mockService.AssertExpectations(t)}3. gomock — génération de mocks
Gomock de Google est un framework pour générer des mocks basés sur des interfaces. Il fonctionne via l'utilitaire mockgen.
Installation :
go install github.com/golang/mock/mockgen@v1.6.0Exemple d'utilisation :
//go:generate mockgen -source=service.go -destination=mock_service.go -package=main
type Service interface { Process(data string) error}
// Dans le test :func TestProcess(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish()
mockService := NewMockService(ctrl) mockService.EXPECT().Process("test").Return(nil)
err := mockService.Process("test") assert.NoError(t, err)}Gomock est adapté aux grands projets avec de nombreuses interfaces — la génération de code fait gagner du temps.
4. ginkgo — style BDD
Ginkgo est un framework pour le Behaviour-Driven Development (BDD). Il permet d'écrire des tests dans le style "Describe", "Context" et "It".
Installation :
go get github.com/onsi/ginkgo/v2go get github.com/onsi/gomegaExemple :
package main
import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" "testing")
func TestCalculator(