Ders 05 / 12
Teslimat Modelleri ve Test
Testin ayrı bir aşama mı yoksa süreç boyunca süren bir etkinlik mi olduğu sorusu, geri bildirim noktasının gecikme ve aday değişiklik sayısına etkisi ve kümenin süresinin yerleşimini belirlemesi.
İçindekiler
Buraya kadar test, tek bir kişinin bir işlevle baş başa kaldığı bir etkinlik gibi ele alındı. Gerçekte testin ne zaman yazıldığı, kimin yazdığı ve sonucunun kime ne kadar sürede ulaştığı çalışma biçimine bağlıdır. Aynı denetim kümesi sürümün sonunda tek seferde koşturulduğunda ile her değişiklikte koşturulduğunda farklı değer taşır.
Bu ders o farkı ölçülebilir kılar. Ölçülen şey testin kendisi değil, bir kusurun ortaya çıkmasıyla fark edilmesi arasındaki mesafedir.
Teslimat Modeli Testin Yerini Belirler
Şelale modelinde (waterfall) çalışma aşamalara bölünür ve her aşama bir sonrakine belge devreder: çözümleme, tasarım, geliştirme, test, teslim. Test burada bir aşamadır — önceden bitmiş bir ürünün üzerinde, sonda yapılır. Modelin gücü, her aşamanın kendi çıktısını yazılı bırakmasıdır; zayıflığı, geçerleme sorusunun en sona ertelenmesidir.
Artımlı ve yinelemeli modelde (incremental and iterative) ürün çalışan parçalar hâlinde büyür. Her yineleme kendi içinde çözümleme, geliştirme ve testi barındırır. Test bir aşamadan çok, her yinelemenin içine dağılmış bir etkinliğe dönüşür.
Sürekli teslimde (continuous delivery) her değişiklik teslim edilebilir bir aday sayılır; teslimin önündeki tek engel, otomatik denetim kümesinin sonucudur. Test burada etkinlik olmaktan da çıkıp bir kapıya dönüşür: kümesi geçmeyen değişiklik ilerlemez.
İkinci derste anılan V modelinin eşleştirmesi üç modelde de geçerlidir — her karar düzeyinin karşılık gelen bir sınama düzeyi vardır. Değişen şey eşleştirme değil, iki ucun arasındaki süredir.
Geri Bildirim Noktası
Bir kusur, kodun yazıldığı anda doğar. Fark edilmesi ise kümesinin koşturulduğu ilk noktada olur. Aradaki mesafenin iki ölçüsü vardır: gecikme, kusurun doğmasıyla haberin gelmesi arasındaki süre; aday değişiklik sayısı, o sürede biriken ve kusurun kaynağı olabilecek değişikliklerin sayısı.
// geri-bildirim.mjs — ayni denetim kumesinin farkli noktalarda verdigi geri bildirim const NOKTALAR = [ { ad: 'kaydetmede', gecikmeDk: 0.5, biriken: 1 }, { ad: 'gonderim oncesi', gecikmeDk: 3, biriken: 4 }, { ad: 'tumlestirme', gecikmeDk: 20, biriken: 12 }, { ad: 'gece kosusu', gecikmeDk: 720, biriken: 40 }, { ad: 'surum oncesi', gecikmeDk: 20160, biriken: 380 }, ]; for (const n of NOKTALAR) { console.log(`${n.ad.padEnd(16)}: ${String(n.gecikmeDk).padStart(7)} dk gecikme, ${String(n.biriken).padStart(3)} degisiklik aday`); } const ilk = NOKTALAR[0]; const son = NOKTALAR[NOKTALAR.length - 1]; console.log(`oran: gecikme ${son.gecikmeDk / ilk.gecikmeDk} kat, aday ${son.biriken / ilk.biriken} kat`);
kaydetmede : 0.5 dk gecikme, 1 degisiklik aday gonderim oncesi : 3 dk gecikme, 4 degisiklik aday tumlestirme : 20 dk gecikme, 12 degisiklik aday gece kosusu : 720 dk gecikme, 40 degisiklik aday surum oncesi : 20160 dk gecikme, 380 degisiklik aday oran: gecikme 40320 kat, aday 380 kat
Tablodaki sayılar bir kitaplık ekibinin çalışma temposunu temsil eden varsayımlardır; ölçülmüş değerler değil, model girdileridir. Modelden çıkan sonuç ise sayılara pek bağlı değildir: geri bildirim noktası geriye kaydıkça gecikme ve aday sayısı birlikte büyür.
İki büyümenin etkisi ayrıdır. Gecikme, kusuru yazan kişinin bağlamını kaybetmesine yol açar; iki hafta önceki kararın gerekçesi hatırlanmaz. Aday sayısı ise ayıklama işini büyütür: tek bir değişiklik varken sorun onda, üç yüz seksen değişiklik varken sorun aralarında bir yerdedir ve bulunması ayrı bir arama problemidir.
Şelale modelinin pratikteki maliyeti buradadır. Test aşaması sürüm sonunda tek noktada toplandığında, bütün kusurlar en pahalı geri bildirim noktasında ortaya çıkar.
Kümenin Süresi Yerleşimini Belirler
Geri bildirim noktası özgürce seçilemez. Bir denetim kümesi her kaydetmede koşturulabiliyorsa süresi saniyenin altında olmalıdır; kümenin süresi arttıkça noktası geriye kayar. Süre burada bir yerleşim ölçütüdür.
// bekleme.mjs — dis kaynaga erisimi taklit eden engelleyen bekleme export function bekle(ms) { Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms); }
// kume-suresi.mjs — iki denetim kumesinin suresi ve ait olduklari geri bildirim noktasi import assert from 'node:assert/strict'; import { bekle } from './bekleme.mjs'; const ucret = (gun) => Math.min(Math.max(gun - 3, 0) * 2, 20); const HIZLI = [ () => assert.equal(ucret(0), 0), () => assert.equal(ucret(3), 0), () => assert.equal(ucret(4), 2), () => assert.equal(ucret(13), 20), () => assert.equal(ucret(99), 20), ]; const YAVAS = [ () => { bekle(400); assert.equal(ucret(10), 14); }, () => { bekle(400); assert.equal(ucret(20), 20); }, () => { bekle(400); assert.equal(ucret(1), 0); }, ]; const ESIK_MS = 1000; for (const [ad, kume] of [['hizli', HIZLI], ['yavas', YAVAS]]) { const bas = performance.now(); for (const denetim of kume) denetim(); const sure = performance.now() - bas; const yer = sure < ESIK_MS ? 'her kaydetmede kosturulabilir' : 'gonderim oncesine tasinir'; console.log(`${ad} kume (${kume.length} denetim): ${ESIK_MS} ms esigi — ${yer}`); }
hizli kume (5 denetim): 1000 ms esigi — her kaydetmede kosturulabilir yavas kume (3 denetim): 1000 ms esigi — gonderim oncesine tasinir
İki kümenin sınadığı kural aynıdır; ayrıldıkları yer, yavaş kümedeki her denetimin dış bir kaynağa erişimi taklit eden bir bekleme içermesidir. Beş denetimli küme üç denetimli kümeden hızlıdır, çünkü denetim sayısı değil dış bağımlılık belirleyicidir. Bu ölçüm engelli bekleme kullandığı için her makinede aynı yargıyı verir; yalnız ham süre ortama bağlıdır.
Çıkan kural pratiktir: bir kümenin geri bildirim noktası, denetim sayısına değil, en yavaş bağımlılığına göre belirlenir. Kümenin bir bölümünü hızlı tutmak istiyorsa, dış bağımlılığın oradan çıkarılması gerekir. Sonraki kursun konusu tam olarak budur.
Modelin Getirdiği Pratikler
Teslimat modeli yalnız zamanlamayı değil, hangi test pratiklerinin gerekli olduğunu da belirler.
Sürüm sonunda tek noktada test yapılan bir modelde sürüm dondurma (code freeze) dönemi kaçınılmazdır: kusurları bulmak ve gidermek için değişikliklerin durdurulduğu bir aralık gerekir. Değişiklik her an teslim edilebilir olduğunda böyle bir aralık yoktur; onun yerine her değişikliğin geçmesi gereken bir kabul kapısı (quality gate) tanımlanır.
Geri bildirim noktası geride olduğunda kusur toplu hâlde bulunur ve önceliklendirme ayrı bir iş kalemi olur; ileride olduğunda kusur tek tek bulunur ve çoğu anında giderilir. Bu yüzden hata kaydı tutma disiplini de modele göre ağırlık değiştirir.
Ortak nokta şudur: hiçbir model testi ucuzlatmaz. Modelin belirlediği şey, aynı sınamanın ne zaman ve hangi maliyetle yapılacağıdır.
Özet
- Şelalede test bir aşama, artımlı modelde her yinelemenin içine dağılmış bir etkinlik, sürekli teslimde ilerlemenin önündeki bir kapıdır.
- Geri bildirim noktası iki büyüklükle ölçülür: gecikme ve aday değişiklik sayısı; nokta geriye kaydıkça ikisi birlikte büyür.
- Gecikme bağlam kaybına, aday sayısının artması ayıklamanın ayrı bir arama problemine dönüşmesine yol açar.
- Bir kümenin geri bildirim noktası denetim sayısına değil en yavaş bağımlılığına göre belirlenir; örnekte beş denetimli küme üç denetimli kümeden hızlı çıktı.
- Model, testi ucuzlatmaz; aynı sınamanın ne zaman ve hangi maliyetle yapılacağını belirler.
Sonraki Adım
Bu konu kalitenin ne olduğunu, hangi sorularla sınandığını ve sürecin bu sınamayı nasıl konumlandırdığını kurdu. Eksik olan, sınamanın kendi iç düzenidir: bir denetim neyi kapsıyor, nereye kadar uzanıyor, hangi bilgiyle yazılıyor? Sonraki konu testleri sınıflandırır. İlk soru kapsamla ilgilidir — aynı kusur tek bir işlevi sınayan bir testle de, bütün sistemi ayağa kaldıran bir testle de yakalanabilir; ikisinin maliyeti ve söylediği şey aynı değildir.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.