For the complete documentation index, see llms.txt. This page is also available as Markdown.
Unit Testing
Unit testing adalah praktik menulis kode untuk menguji kode lainnya. Tujuannya adalah memastikan setiap unit (fungsi, method, atau struct) berperilaku sesuai yang diharapkan. Dalam konteks ini, yang menjadi fokus adalah coverage โ seberapa banyak cabang logika (branch) dan aturan bisnis yang teruji.
๐ Kode Lengkap Bab Ini:
Seluruh kode yang dibahas di bab ini tersedia di GitHub:
Repository memiliki ketergantungan pada *sql.DB dan logger.Logger. Karena kita sudah menerapkan dependency injection, kita bisa dengan mudah mengganti dependency asli dengan mock.
Mock Logger
Buat logger kosong (no-op) untuk testing (mock/mockpkg/logger.go):
Mock Database dengan sqlmock
sqlmock memungkinkan kita mensimulasikan query database tanpa perlu database sungguhan.
Pola Umum Mocking:
ExpectQuery() โ untuk QueryRowContext() atau QueryContext()
ExpectExec() โ untuk ExecContext()
ExpectPrepare() โ untuk PrepareContext()
Test untuk QueryRowContext (Create Role)
Buat file internal/repository/role_repository_test.go.
Test untuk QueryContext (List Roles)
Test untuk ExecContext (Update Role)
Menjalankan Test Repository
Untuk mengetes bisa digunakan perintah
20.5 Test Service
Service bergantung pada repository.RoleRepository (interface). Kita buat mock repository untuk mengontrol perilaku yang diinginkan.
Mock Repository untuk Service
buat file mock/mockrepo/role.go
Test Service Update
Kita akan membuat unit test untuk fungsi Update() yang komplektitas-nya sedang. Buat file internal/service/roles_test.go
20.6 Test Handler
Handler bergantung pada service.Roles (interface). Kita buat mock service dan gunakan httptest untuk mensimulasikan HTTP request.
Mock Service untuk Handler
Test Handler Update
Buat file internal/hanlder/role_handler_test.go
20.7 Menjalankan Semua Test
20.8 Best Practices Unit Testing
Praktik
Penjelasan
Satu skenario per test
Satu fungsi test hanya menguji satu skenario (success atau satu jenis error)
# Jalankan satu test
go test ./internal/repository -run "TestRoleRepository_Create_Success"
# Jalankan semua test role repository
go test ./internal/repository -run "TestRoleRepository" -v
# Lihat coverage
go test -cover ./internal/repository
# Generate coverage report (HTML)
go test -coverprofile cover.out ./internal/repository
go tool cover -html cover.out
# Jalankan semua test di semua package
go test ./...
# Dengan verbose (detail)
go test -v ./...
# Dengan coverage
go test -cover ./...
# Coverage ke file dan lihat di browser
go test -coverprofile=coverage.out ./...
go tool cover -html=coverage.out