Test aslında ne işe yarıyor
Kapsam yüzdesi kimsenin sormadığı bir soruya cevap veriyor. Asıl mesele hangi hataları yayına almaya razı olmadığınız.
Bir ekibe test kapsamlarının ne olduğunu sorun; size bir sayı verirler. O sayının hangi hata türlerini elediğini sorduğunuzda ise ortam sessizliğe bürünür.
Kapsam (coverage), testler çalışırken kodun ne kadarının yürütüldüğünü ölçer. Gerçekte bir şeylerin kontrol edilip edilmediği hakkında hiçbir bilgi vermez. Bir test paketi, bir ödeme hesaplamasının her satırını çalıştırabilir ancak yalnızca işlemin hata vermeden tamamlandığını doğrulayabilir; bu durumda kapsam oranı yükselir ama ürün daha güvenli hale gelmez.
Asıl sorulması gereken soru şudur: Hangi hataların canlıya alınmasına asla izin vermezsiniz ve bunların her birini ne engeller?
Bir güvenlik ağından önce bir tasarım aracıdır
Bir testin sağladığı ilk fayda, özellik henüz tamamlanmadan ortaya çıkar ve bunun gerileme hatalarını (regresyonları) yakalamakla bir ilgisi yoktur.
Test edilmesi zor olan kod, genellikle gereğinden fazla iş yapan koddur. Bir fonksiyonun tek bir kez çağrılabilmesi için veritabanı, saat, HTTP istemcisi ve oturum açmış bir kullanıcıya ihtiyaç duyması durumunda; test size, ilgili iş kuralının çevresindeki her şeyle iç içe geçtiğini söyler. Kuralı ayrıştırıp üç satırda test edilebilir hale getirmek, kodun okunmasını kolaylaştırır ve değiştirilmesini daha az maliyetli kılar; test yazmak ise bu sürecin doğal bir sonucudur.
Bu durum en çok, üzerinde tartışmaya değer kurallarda kendini belli eder: Ücret hesaplamaları, uygunluk kriterleri veya eşik değeri içeren her türlü kural. Bunları, kuralın bir teknik şartnamedeki kadar net ifade edildiği testlere dönüştürmek genellikle şartnamenin kendisini de iyileştirir; çünkü bu süreç, sınır durumların (boundary cases) açığa çıkmasını zorunlu kılar. Sınırda tam olarak ne olur? Taraflar genellikle, aslında farklı varsayımlarda bulunduklarını fark ederler.
Çabanın nereye harcandığı ve nereye harcanmadığı
Her şey aynı muameleyi hak etmez.
Para ve tarih işlemleri; sınır değerler ve yuvarlama kuralları da dahil olmak üzere sıkı testlerden geçirilir. Bunların kesin ve doğru cevapları vardır, test edilmeleri kolaydır ve hatalı bir sonuç, kayıt altına alınabilir bir müşteri şikayetine yol açar. Kimin neyi görüp yapabileceğine dair her kural için, olumsuz durumu (negatif senaryoyu) doğrulayan bir test yazılır; çünkü olumlu testler bir özelliğin çalıştığını teyit ederken, olumsuz testler yıllar boyunca bir güvenlik önlemi işlevi görmeye devam eder. Birden fazla kez veya sıra dışı bir sırayla gelebilecek durumlar (state), ikinci gelişlerinde test edilir; çünkü canlı ortamda sistemin göndereceği senaryo budur.
Son olarak, işletmenin bel bağladığı süreçler üzerinde az sayıda uçtan uca (end-to-end) test gerçekleştirilir: oturum açma, satın alma işlemini tamamlama, başvuru gönderme gibi. Kasıtlı olarak küçük tutulurlar. Bunlar, herhangi bir test paketindeki en yavaş ve en kırılgan testlerdir; elli tanesine sahip bir ekip hataları görmezden gelmeye başlar ki bu, hiç testin olmamasından daha kötüdür.
Bazı şeyler bilerek kendi haline bırakılır. Hiçbir test, bir başlığın belirli kelimeleri içerdiğini doğrulamaz; çünkü metin değiştiğinde test başarısız olur ve birisi testi okumadan günceller. Bu durum düzenleme sürecine bir yük bindirir ve ekibe, kırmızıya dönen bir build sonucunun hiçbir anlam ifade etmediğini öğretir. Kapsama hedefi de belirlenmez; çünkü belirli bir yüzdeyi tutturmayı amaçlamak, sadece o yüzdeyi yükseltmek için yazılan ve aslında hiçbir şeyi doğrulamayan testlerin ortaya çıkmasına neden olur. Ayrıca çerçeve yapısı (framework) da test edilmez: Eğer bir sorgu, satırları veritabanından talep edilen sırada döndürüyorsa, bunu doğrulamak bizim sorumluluğumuzda değildir.
Hiçbir makinenin sizin yerinize kontrol edemeyeceği şeyler
Erişilebilirlik bunun en belirgin örneğidir. Otomatik bir denetleyici, eksik alternatif metinleri veya kontrast hatalarını yakalayabilir; ancak odak sırasının başlıktan alt bilgiye (footer) atlayıp geri dönmesini, bir hata mesajının ilgili alandan önce seslendirilmesini veya klavye kullanan birinin bir iletişim kutusundan (dialog) çıkamaması durumunu size söyleyemez. Bunlar, fareyi bir kenara bırakıp ekran okuyucu kullanarak tespit edilebilir.
Gerçek cihazlar ise ikinci örnektir. Genişliği 390 piksele düşürülmüş bir masaüstü tarayıcısında düzgün çalışan bir arayüz; klavyenin ekranın yarısını kapladığı ve sabit alt bilginin (footer) yazı yazılan alanın üzerine bindiği gerçek bir telefonda test edilen arayüzle aynı değildir.
Bu site özelinde üçüncü bir durum daha vardır: Aynı sayfanın iki dildeki versiyonu. Türkçe metinler İngilizcelere kıyasla belirgin ölçüde daha uzundur; bu nedenle bir kartın düzenini bozan genişlik sınırı, İngilizcede değil genellikle Türkçede 360 piksel civarındadır. Bir test paketi, etiketi üç satıra taşmış bir düğmeyi fark etmez; ancak sayfaya bakan bir insan bunu hemen görür.
Test paketlerinin yanıltıcı olabildiği bir durum daha vardır ve bu, en sessiz işleyenidir. Düzenli ve temiz test verileriyle (fixtures) başarılı olan ancak canlı ortam verileriyle başarısız olan bir test paketi, aslında sadece o temiz verileri test ediyormuş demektir. Gerçek isimler kesme işaretleri, aksanlı karakterler ve noktasız 'i' harfi içerebilir. Gerçek adresler dört satırdan oluşabilir ve posta kodu içermeyebilir. Gerçek tutarlar, tam sınır değerindeki miktarları ve sınırın hemen altındaki değerleri kapsar. Gerçek yüklemeler; boş dosyaları veya belgenin kendisi yerine belgenin fotoğrafını içerebilir.
Yani, testlerin gözden kaçırdığı bir şey canlı ortama çıktığında, ilk adım başarısız olan testi yazmak ve başarısız olmasını izlemektir. Sonra hatayı düzeltip başarılı olmasını izlemektir. Aksi takdirde, düzeltmenin gerçek nedeni ele aldığına dair hiçbir kanıt olmaz ve aynı hatanın daha sonra farklı bir isim altında geri gelmesini engelleyecek hiçbir şey olmaz.
Bir projenin sonunda, testler kodla birlikte, neyi kapsadıkları ve neyi kasıtlı olarak kapsamadıkları hakkında kısa bir notla birlikte gider. Amacı belgelenmemiş bir test paketi, uygunsuz bir anda kırmızıya döndüğü anda bir sonraki ekip tarafından silinir. Haklı olacaklardır, çünkü kimse onlara neyi koruduğunu söyleyemez.