Birim testi mi, entegrasyon testi mi, sistem testi mi sorusu bazen deneyimli geliştiricileri bile şaşırtır. Bu üç test seviyesi yazılım kalitesinin temelini oluştursa da, ekipler bunları sıklıkla yanlış kullanarak ya çok sığ ya da bakımı imkansız derecede pahalı test suitleri oluşturur. Her birinin test stratejinizde nerede yer aldığını anlamak akademik bir konu değildir, aksine ne kadar hızlı yayın yapabileceğinizi ve yayınlarınıza ne kadar güvenebileceğinizi doğrudan etkiler.
Bu kılavuz, her bir test seviyesinin kapsamını, amacını ve zamanlamasını açıklayacak, test piramidinde nasıl birlikte çalıştıklarını gösterecek ve hemen uygulayabileceğiniz pratik örnekler sunacaktır. İster mikro servisler, ister monolitler veya API'lar geliştiriyor olun, birim testleri, entegrasyon testleri ve sistem testleri arasındaki farkı anlamak çok önemlidir.
Birim Testi Nedir?
Birim testi, uygulamanızın en küçük test edilebilir kısımlarını — bireysel fonksiyonları, metotları veya sınıfları — tamamen izole bir şekilde doğrular. Amaç, her bir birimin kendi spesifikasyonuna göre doğru çalıştığını kanıtlamaktır.
Kapsam ve Örnek
Birim testi, bağımlılıkları olmayan tek bir mantık parçasını inceler. İşte basit bir örnek:
// Test edilecek fonksiyon
function calculateDiscount(price, discountPercent) {
if (discountPercent < 0 || discountPercent > 100) {
throw new Error('Geçersiz indirim yüzdesi');
}
return price * (discountPercent / 100);
}
// Birim testi
describe('calculateDiscount', () => {
it('20% indirimi doğru hesaplar', () => {
expect(calculateDiscount(100, 20)).toBe(20);
});
it('negatif indirim için hata fırlatır', () => {
expect(() => calculateDiscount(100, -5)).toThrow();
});
});
Testin doğrudan girdi sağladığını ve çıktıları doğruladığını unutmayın — veritabanı, API veya kullanıcı arayüzü dahil değildir.
Artıları ve Eksileri
Artıları:
- Hızlı yürütme (milisaniyeler)
- Hata yerinin kesin tespiti
- Modüler tasarımı teşvik eder
- Bakımı kolaydır
- Her kod commit'inde çalışır
Eksileri:
- Entegrasyon hatalarını yakalamaz
- Mock'lar gerçek sorunları gizleyebilir
- Yüksek başlangıç yazım maliyeti
- Kullanıcı iş akışlarını test edemez
Entegrasyon Testi Nedir?
Entegrasyon testi, birden fazla bileşenin birlikte doğru çalıştığını doğrular. Birimler arasındaki arayüzlere — API uç noktalarına, veritabanı bağlantılarına, mesaj kuyruklarına ve hizmet etkileşimlerine — odaklanır.
Kapsam ve Örnek
İşte veritabanına dokunan bir kullanıcı kayıt uç noktası için entegrasyon testi:
// POST /api/users için entegrasyon testi
describe('Kullanıcı Kayıt API\'si', () => {
it('kullanıcı oluşturur ve veritabanına kaydeder', async () => {
const userData = {
name: 'Test Kullanıcı',
email: 'test@example.com',
password: 'GecerliParola123'
};
// Eylem: Gerçek API'yi çağır
const response = await axios.post('http://localhost:3000/api/users', userData);
// Doğrulama: Yanıtı VE veritabanını kontrol et
expect(response.status).toBe(201);
expect(response.data).toHaveProperty('userId');
// Veritabanı durumunu doğrula
const userInDb = await db.users.findByEmail('test@example.com');
expect(userInDb).toBeTruthy();
expect(userInDb.name).toBe('Test Kullanıcı');
});
});
Bu test, API, iş mantığı ve veritabanı entegrasyonunun birlikte çalıştığını kanıtlar.
Artıları ve Eksileri
Artıları:
- Arayüz uyumsuzluklarını yakalar
- Gerçek bileşen etkileşimini doğrular
- Gerçek veri akışını test eder
- Birim testlerinden daha gerçekçidir
Eksileri:
- Birim testlerinden daha yavaştır (saniyeler)
- Hataları ayıklamak daha zordur
- Test altyapısı gerektirir
- Zamanlama sorunları nedeniyle kararsız olabilir
Sistem Testi Nedir?
Sistem testi, tamamlanmış, entegre sistemi iş gereksinimlerine karşı doğrular. Uygulamayı bir kara kutu olarak ele alır ve kullanıcı bakış açısından uçtan uca iş akışlarını test eder.
Kapsam ve Örnek
Bir e-ticaret satın alma iş akışı için sistem testi:
// Sistem testi: Tam satın alma akışı
describe('E-ticaret Satın Alma Sistemi', () => {
it('kullanıcının ürünleri gezinmesine, sepete eklemesine ve ödeme yapmasına izin verir', async () => {
// Adım 1: Kullanıcı kaydı
const user = await api.register('alisverisci@example.com', 'parola');
// Adım 2: Ürünlere göz atma
const products = await api.searchProducts('dizüstü bilgisayar');
expect(products.length).toBeGreaterThan(0);
// Adım 3: Sepete ekle
await api.addToCart(user.token, products[0].id, 1);
// Adım 4: Ödeme
const order = await api.checkout(user.token, {
shippingAddress: '123 Ana Cadde',
paymentMethod: 'visa'
});
// Oracle: Siparişin tamamlandığını doğrula
expect(order.status).toBe('onaylandı');
expect(order.total).toBeGreaterThan(0);
// Yan etkileri doğrula
const inventory = await api.getInventory(products[0].id);
expect(inventory.stock).toBe(initialStock - 1);
});
});
Bu, birden çok API'yi, veritabanını ve harici hizmetleri (ödeme ağ geçidi) kapsar.
Artıları ve Eksileri
Artıları:
- Gerçek kullanıcı iş akışlarını test eder
- İş gereksinimlerini doğrular
- Katmanlar arası entegrasyon sorunlarını yakalar
- Yayın güveni sağlar
Eksileri:
- Çok yavaştır (dakikalar)
- Karmaşık kurulum ve bakım
- Kırılgan — UI değişiklikleriyle kolayca bozulur
- Hata kök nedenini izole etmek zordur
Yazılım Test Piramidi: Üçü Arasındaki İlişki
Test piramidi, birim testi, entegrasyon testi ve sistem testinin nasıl dağıtılması gerektiğini görselleştirir:
Sistem Testleri (%10)
▲
Entegrasyon Testleri (%30)
▲
Birim Testleri (%60)
Alt Katman (Birim Testleri): En büyük hacim, en hızlı yürütme, sürekli çalışır
Orta Katman (Entegrasyon Testleri): Orta hacim, kritik entegrasyonları doğrular
Üst Katman (Sistem Testleri): En küçük hacim, çekirdek iş akışlarını test eder
Bu şekil, hızlı geri bildirim sağlarken güveni korur. Piramidi ters çevirirseniz (çok sayıda sistem testi, az sayıda birim testi), test paketiniz yavaş, kırılgan ve pahalı hale gelir.

Her Testi Ne Zaman Yapmalı: Yaşam Döngüsü Entegrasyonu
| Geliştirme Aşaması | Birincil Test Türü | Sıklık | Yürütme Süresi |
|---|---|---|---|
| Kod yazma | Birim testleri | Her kaydetmede | < 1 saniye |
| Çekme isteği | Birim + Entegrasyon | Commit öncesi | 1-5 dakika |
| Birleştirme öncesi | Entegrasyon + Seçilmiş Sistem | PR onayı üzerine | 5-15 dakika |
| Gece derlemesi | Tam paket (tüm türler) | Günlük | 30-60 dakika |
| Yayın öncesi | Sistem testleri + Smoke testleri | Dağıtımdan önce | 15-30 dakika |
| Üretim | Smoke testleri + İzleme | Sürekli | Gerçek zamanlı |
Birim testi, entegrasyon testi ve sistem testi zamanlamasını doğru yapmak, darboğazları önlerken kalite geçişlerinin anlamlı olmasını sağlar.
Karşılaştırma Tablosu: Doğru Testi Seçmek
| Faktör | Birim Testi | Entegrasyon Testi | Sistem Testi |
|---|---|---|---|
| Hız | ⚡⚡⚡ Çok Hızlı | ⚡⚡ Orta | ⚡ Yavaş |
| İzolasyon | Yüksek | Orta | Düşük |
| Hata Ayıklama Yeteneği | Kolay | Orta | Zor |
| Güven | Düşük | Orta | Yüksek |
| Bakım | Düşük | Orta | Yüksek |
| Ne Zaman Yazılır | Kodlamadan önce/sırasında | Birimler çalıştığında | Entegrasyondan sonra |
| Kim Yazar | Geliştiriciler | Geliştiriciler + QA | QA + Geliştiriciler |
Pratik Örnek: Bir API Uç Noktasını Test Etme
Bir POST /api/users uç noktası için birim testi, entegrasyon testi ve sistem testini eylemde görelim:
Birim Testi (Doğrulama Mantığını Test Etme)
// Sadece doğrulama fonksiyonunu test et
describe('validateUser', () => {
it('geçersiz e-postayı reddeder', () => {
const result = validateUser({ email: 'gecersiz' });
expect(result.isValid).toBe(false);
expect(result.errors).toContain('Geçersiz e-posta formatı');
});
});
Entegrasyon Testi (API + Veritabanını Test Etme)
// Gerçek veritabanı ile API katmanını test et
describe('POST /api/users entegrasyonu', () => {
it('veritabanında kullanıcı oluşturur', async () => {
const response = await request(app)
.post('/api/users')
.send({ name: 'Test', email: 'test@example.com' });
expect(response.status).toBe(201);
// Oracle: Veritabanını doğrula
const user = await db.users.findByEmail('test@example.com');
expect(user.name).toBe('Test');
});
});
Sistem Testi (Tam İş Akışını Test Etme)
// Kayıt → giriş → profil güncelleme iş akışını test et
describe('Kullanıcı yönetim sistemi', () => {
it('tam kullanıcı yaşam döngüsüne izin verir', async () => {
// Kayıt
const reg = await api.post('/api/users', userData);
expect(reg.status).toBe(201);
// Giriş yap
const login = await api.post('/api/auth/login', credentials);
expect(login.data.token).toBeTruthy();
// Profili güncelle
const update = await api.put('/api/users/me', updates, {
headers: { Authorization: `Bearer ${login.data.token}` }
});
expect(update.status).toBe(200);
// Son durumu doğrula
const profile = await api.get('/api/users/me', {
headers: { Authorization: `Bearer ${login.data.token}` }
});
expect(profile.data.name).toBe(updates.name);
});
});
Apidog, API Testlerinde Geliştirici Ekiplerine Nasıl Yardımcı Olur?
Birim testi, entegrasyon testi ve sistem testini anlamak çok önemlidir, ancak bunları API'lar için uygulamak zahmetli olabilir. Apidog, özellikle entegrasyon ve sistem testleri için ağır iş yükünü otomatize eder.
Otomatik Test Oracle Oluşturma
Entegrasyon testleri için Apidog, OpenAPI spesifikasyonunuzdan doğrudan test oracle'ları oluşturur:
# API spesifikasyonunuzdan Apidog şunları oluşturur:
Test: POST /api/users
Oracle 1: Durum 201 olmalı
Oracle 2: Yanıt Kullanıcı şemasıyla eşleşmeli
Oracle 3: Konum başlığı mevcut olmalı
Oracle 4: Yanıt süresi < 500ms
Oracle 5: Veritabanı sorgusu oluşturulan kullanıcıyı döndürmeli
Bu, manuel oracle tanımını ortadan kaldırır ve testleri API sözleşmenizle senkronize tutar.
Sistem Testleri için Görsel Test Oluşturucu
Karmaşık iş akışlarını sistem testi, Apidog'da görsel hale gelir:
Test: Kullanıcı Girişini Tamamlama
1. POST /api/users (oluştur)
2. POST /api/auth/verify (e-posta doğrulama)
3. POST /api/auth/login (kimlik doğrulama)
4. GET /api/dashboard (veri yükle)
5. POST /api/preferences (tercihleri ayarla)
Her adımda doğrulamalar + nihai durum doğrulaması
Bunu, API çağrılarını sürükleyip bırakarak oluşturursunuz; Apidog, kimlik doğrulamasını, veri zincirlemesini ve doğrulamaları otomatik olarak ele alır.

Sürekli Test için CI/CD Entegrasyonu
Apidog, CI/CD'de birim testi, entegrasyon testi ve sistem testi hiyerarşinizi çalıştırır:
# GitHub Actions pipeline
- name: Birim Testlerini Çalıştır
run: npm test:unit
- name: Apidog Entegrasyon Testlerini Çalıştır
run: apidog run --tags "@integration"
- name: Apidog Sistem Testlerini Çalıştır
run: apidog run --tags "@system"
Bu, her test türünün uygun aşamada çalışmasını sağlar ve sonuçlar doğrudan Slack veya e-postaya gönderilir.

Test Kapsamı Görünürlüğü
Apidog, hangi API'lerin birim, entegrasyon ve sistem testi kapsamına sahip olduğunu gösterir:
| Uç Nokta | Birim | Entegrasyon | Sistem | Kapsam |
|---|---|---|---|---|
| POST /users | ✅ | ✅ | ✅ | %100 |
| GET /users/:id | ✅ | ✅ | ❌ | %67 |
| DELETE /users | ❌ | ✅ | ✅ | %67 |
Bu görünürlük, ekiplerin test boşluklarını stratejik olarak doldurmasına yardımcı olur.
Sıkça Sorulan Sorular
S1: API uç noktaları için birim testleri yazmalı mıyım?
Yanıt: API uç noktaları mantığı organize eder — entegrasyon testleri olmalıdır. Uç noktaların içindeki iş mantığı ayrı ayrı birim testinden geçirilmelidir.
S2: Kaç tane entegrasyon testi yeterlidir?
Yanıt: Tüm kritik yolları ve hata senaryolarını kapsayın. İyi bir kural: entegrasyondaki bir hata üretime ulaşacaksa, bunun için bir test yazın.
S3: Sistem testleri bakım maliyetine değer mi?
Yanıt: Evet, ancak yalnızca temel iş akışları için. Sistem testlerini, iş değerinin %80'ini oluşturan özelliklerin %10-20'si ile sınırlayın.
S4: Apidog birim testleri oluşturabilir mi?
Yanıt: Hayır. Birim testleri, dahili kod yapısı hakkında bilgi gerektirir. Apidog, API davranışını dışarıdan gözlemleyebildiği entegrasyon ve sistem testlerinde başarılıdır.
S5: Yeni bir proje için hangi test türüne öncelik vermeliyim?
Yanıt: Birim testleriyle (temel) başlayın, bileşenler bağlandıkça entegrasyon testleri ekleyin, ardından kritik kullanıcı yolculukları için sistem testleri ekleyin. Bu piramit yaklaşımı teknik borcu önler.
Sonuç
Birim testi mi, entegrasyon testi mi, sistem testi mi kararı, birini diğerine tercih etmekle ilgili değildir – her birini doğru zamanda ve oranda uygulamakla ilgilidir. Birim testleri geliştirme için hız ve hassasiyet sağlar. Entegrasyon testleri, birimlerin gözden kaçırdığı bağlantı sorunlarını yakalar. Sistem testleri, tüm ürünün kullanıcılar için çalıştığına dair güven verir.
Bu hiyerarşide ustalaştığınızda, test paketiniz bir bakım yükü olmaktan çıkarak stratejik bir varlık haline gelir. Mevcut test dağılımınızı denetleyerek başlayın. Çok fazla yavaş, kırılgan sistem testiyle mi ters dönmüş durumdasınız? Odağınızı aşağı kaydırın. Kritik entegrasyon kapsamınız mı eksik? Bu boşlukları doldurun.
Apidog gibi modern araçlar, test oluşturma ve yürütmeyi otomatikleştirerek entegrasyon ve sistem katmanlarını çok daha yönetilebilir hale getirir. Bu, geliştirme hızını yavaşlatmadan test piramidi şeklini korumanıza olanak tanır. Kalite, süreçlerinizin doğal bir sonucu haline gelir, yayınları geciktiren ayrı bir aşama olmaktan çıkar.
Unutmayın: amaç her şeyi test etmek değil – doğru şeyleri doğru seviyede test etmektir. Birim testi mi, entegrasyon testi mi, sistem testi mi stratejinizde net olduğunda, yayınlar öngörülebilir hale gelir, güven artar ve ekibiniz yangın söndürmek yerine değer yaratmaya daha fazla zaman ayırır.
