Test Ortamı¶
Bu doküman test ortamının nasıl kurulduğunu, hangi araçların neden seçildiğini ve testlerin arka planda nasıl çalıştığını anlatır.
Test komutları için: ../TEST_KOMUTLARI.md
1. Test Ortamı Nedir¶
Geçici (ephemeral) ve izole bir ortamdır:
- Her
go testçalıştığında sıfırdan bir CockroachDB başlatılır. - Testler biter bitmez bu veritabanı silinir.
- Buluta çıkmaz, dev veritabanına dokunmaz.
Bu sayede her test koşusu temiz, tekrarlanabilir ve birbirinden bağımsızdır.
2. Ön Koşul¶
- Docker Desktop açık olmalı. testcontainers, container'ı Docker üzerinden açar.
3. Kullanılan Araçlar (2026 araştırmasıyla seçildi)¶
| Araç | Sürüm | Görevi |
|---|---|---|
| testcontainers-go | v0.42.0 | Geçici CockroachDB container'ı açar |
| testcontainers-go/modules/cockroachdb | v0.42.0 | CockroachDB'ye özel modül |
| golang-migrate/migrate/v4 | v4.19.1 | Tabloları (migration) kurar |
| stretchr/testify | v1.11.1 | Assertion + mock (zaten projede vardı) |
Test imajı: cockroachdb/cockroach:latest-v24.3
Önemli: testcontainers ve golang-migrate rakip değildir¶
İkisi farklı iş yapar, birlikte çalışır:
- testcontainers → boş veritabanını açar
- golang-migrate → o veritabanına tabloları kurar
Neden testserver değil de testcontainers?¶
CockroachDB'nin resmi cockroach-go/v2/testserver paketi de vardı ve çalışıyordu.
Ama testserver yalnızca CockroachDB açabilir. İleride Redis / Kafka gibi servisler
eklenebilsin diye tek çatıda her servisi açabilen testcontainers seçildi
(testcontainers'ın Redis, Kafka, RabbitMQ vb. için resmi modülleri var).
4. Migration Yapısı¶
Migration dosyaları golang-migrate formatındadır: NNNNNN_isim.up.sql
İki ayrı set vardır (panel ayrı bir domain olduğu için):
backend/internal/db/migrations/→ ana set (000001–000009)backend/internal/db/migrations/panel/→ panel set (000001–000002)
golang-migrate tek klasör okuyup birleştiremediğinden, her set kendi
numarasından (000001) başlar. Sıra numaraları foreign key bağımlılıklarına
göre belirlenmiştir (önce universities, sonra ona bağlı users ...).
5. Nasıl Çalışıyor (TestMain Akışı)¶
TestMain paketteki tüm testlerden önce bir kez çalışır:
- testcontainers geçici CockroachDB açar (insecure mod).
- Bağlantı URL'i
ConnectionConfig'ten elle kurulur. (ConnectionStringURL değil, pgx'e kayıtlı bir config adı döndürür; golang-migrate ve pgxpool gerçek URL ister.) - golang-migrate tabloları kurar — şema:
cockroachdb:// - pgxpool veritabanına bağlanır — şema:
postgres:// - Seed: testlerin ihtiyaç duyduğu 1 test üniversitesi eklenir.
- Testler çalışır.
deferile container silinir.
Not: Temizlik
run()adlı bir sarmalayıcıda yapılır; çünküos.Exitdefer'leri çalıştırmaz.TestMain→os.Exit(run(m))deseni kullanılır.
Test veritabanı production şemasının aynısıdır (9 tablonun tamamı kurulur), böylece testler gerçekçi bir şemaya karşı koşar.
6. Test Stratejisi (Test Piramidi)¶
| Kategori | Oran | Ne test eder |
|---|---|---|
| Birim (Unit) | ~%60 | Saf mantık (DB yok) |
| Entegrasyon | ~%30 | DB katmanı (testcontainers ile) |
| E2E | ~%10 | Gerçek gRPC/Connect endpoint'leri uçtan uca |
API-ağırlıklı backend için entegrasyon payı yüksek tutulmuştur. Yük/stress/chaos testleri şimdilik kapsam dışıdır (gerçek trafik olunca eklenir).
7. Yapılan Temizlikler¶
.env.testkaldırıldı — test DB testcontainers ile açılıyor, env dosyasına gerek yok.config.go'dakifindBackendRootfonksiyonu kaldırıldı — test dalı artık yok.backend/register.test(derlenmiş binary).gitignore'a eklendi.