Ana içeriğe geç

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 (000001000009)
  • backend/internal/db/migrations/panel/ → panel set (000001000002)

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:

  1. testcontainers geçici CockroachDB açar (insecure mod).
  2. Bağlantı URL'i ConnectionConfig'ten elle kurulur. (ConnectionString URL değil, pgx'e kayıtlı bir config adı döndürür; golang-migrate ve pgxpool gerçek URL ister.)
  3. golang-migrate tabloları kurar — şema: cockroachdb://
  4. pgxpool veritabanına bağlanır — şema: postgres://
  5. Seed: testlerin ihtiyaç duyduğu 1 test üniversitesi eklenir.
  6. Testler çalışır.
  7. defer ile container silinir.

Not: Temizlik run() adlı bir sarmalayıcıda yapılır; çünkü os.Exit defer'leri çalıştırmaz. TestMainos.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.test kaldırıldı — test DB testcontainers ile açılıyor, env dosyasına gerek yok.
  • config.go'daki findBackendRoot fonksiyonu kaldırıldı — test dalı artık yok.
  • backend/register.test (derlenmiş binary) .gitignore'a eklendi.