Her ne kadar ben birim testi için olduğum halde, bazen bu test ilk geliştirme biçiminin gerçekten faydalı olup olmadığını merak ediyorum ...
Bunun gibi küçük, önemsiz testler kod tabanınız için "kömür madenindeki kanarya" olabilir ve çok geç olmadan tehlikeyi uyarır. Önemsiz testler etrafta dolaşmak için kullanışlıdır çünkü etkileşimleri doğru yapmanıza yardımcı olurlar.
Örneğin, aşina olmadığınız bir API'yi nasıl kullanacağınızı araştırmak için uygulanan önemsiz bir testi düşünün. Bu testin API'yi "gerçekten" kullanan kodda yaptığınız şeyle herhangi bir ilgisi varsa, bu testi etrafta tutmak yararlıdır. API yeni bir sürüm yayınladığında ve yükseltmeniz gerektiğinde. Artık, API'nin regresyonları yakalamak için kullanabileceğiniz çalıştırılabilir bir biçimde kaydedilmiş olarak nasıl davranmasını beklediğinizle ilgili varsayımlarınız var.
... [I] Gerçek bir süreç yok, kodunuzun (İş Talebi, Gereksinimler Belgesi, Mimari Belgesi) üzerinde 3-4 katman var, burada gerçek tanımlanmış iş kuralı (İndirimli Fiyat, Fiyattır - İndirim) yanlış tanımlanabilir. Durum buysa, birim testinizin sizin için hiçbir anlamı yoktur.
Yıllardır testler yazmadan kod yazıyorsanız, herhangi bir değer olduğu sizin için hemen açık olmayabilir. Ancak, çalışmanın en iyi yolunun "erken yayınla, sık sık yayınla" veya "çeviklik" olduğu zihniyetindeyseniz, hızlı / sürekli yayılma yeteneği istiyorsanız, o zaman testinizin kesinlikle bir anlamı vardır. Bunu yapmanın tek yolu, kodda yaptığınız her değişikliği bir testle meşrulaştırmaktır. Test ne kadar küçük olursa olsun, yeşil bir test paketiniz olduğunda teorik olarak konuşlandırmaya hazırsınız. Ayrıca bkz. "Sürekli üretim" ve "kalıcı beta".
Bu zihniyette olmak için "önce test" olmanız da gerekmez, ancak bu genellikle oraya ulaşmanın en etkili yoludur. TDD yaptığınızda, kendinizi iki ila üç dakikalık küçük Red Green Refactor döngüsüne kilitlersiniz. Hiçbir noktada durup ayrılamaz ve ellerinizde hata ayıklamak ve bir araya getirmek için bir saat sürecek tam bir karmaşa yaşayamazsınız.
Ek olarak, birim testiniz başka bir başarısızlık noktasıdır ...
Başarılı bir test, sistemdeki bir arızayı gösteren testtir. Başarısız bir test, testin mantığında veya sisteminizin mantığındaki bir hata konusunda sizi uyaracaktır. Testlerinizin amacı, kodunuzu kırmak veya bir senaryonun işe yaradığını kanıtlamaktır.
Koddan sonra testler yazıyorsanız, "kötü" bir test yazma riskiyle karşılaşırsınız çünkü testinizin gerçekten çalıştığını görmek için hem bozuk hem de çalışır durumda olduğunu görmeniz gerekir. Koddan sonra testler yazarken, bu, testin başarısız olduğunu görmek için "tuzağı kurmanız" ve koda bir hata eklemeniz gerektiği anlamına gelir. Çoğu geliştirici bu konuda sadece tedirgin değil, aynı zamanda bunun zaman kaybı olduğunu da iddia ediyor.
Burada ne kazanıyoruz?
İşleri bu şekilde yapmanın kesinlikle bir faydası var. Michael Feathers, "eski kodu" "denenmemiş kod" olarak tanımlar. Bu yaklaşımı uyguladığınızda, kod tabanınızda yaptığınız her değişikliği meşrulaştırırsınız. Test kullanmamaktan daha titizdir, ancak büyük bir kod tabanını korumak söz konusu olduğunda, kendi masrafını çıkarır.
Tüylerden bahsetmişken, bununla ilgili incelemeniz gereken iki harika kaynak var:
Bunların her ikisi de bu tür uygulamaların ve disiplinlerin "Yeşil Alan" olmayan projelerde nasıl çalıştırılacağını açıklıyor. Sıkıca bağlanmış bileşenler, fiziksel bağlantılı bağımlılıklar ve üzerinde kontrol sahibi olmadığınız şeyler etrafında testler yazmak için teknikler sağlarlar. Her şey "dikiş" bulmak ve bunların etrafında test yapmakla ilgili.
[I] İndirimli fiyat yanlışsa, test ekibi sorunu yine de bulacaktır, birim testi nasıl bir çalışmayı kaydetti?
Bunun gibi alışkanlıklar bir yatırım gibidir. İade anında gerçekleşmez; zamanla oluşurlar. Test etmemenin alternatifi, esasen gerilemeleri yakalayamama, entegrasyon hataları korkusu olmadan kod sunamama veya tasarım kararlarını yönlendirememe borcunu almaktır. Güzel olan, kod tabanınıza yapılan her değişikliği meşrulaştırmanızdır.
Burada neyi özlüyorum? Lütfen bana TDD'yi sevmeyi öğret, çünkü şimdiye kadar onu yararlı olarak kabul etmekte zorlanıyorum. Ben de istiyorum çünkü ilerici kalmak istiyorum ama bu bana mantıklı gelmiyor.
Profesyonel bir sorumluluk olarak bakıyorum. Ulaşmak için ideal. Ama takip etmesi çok zor ve sıkıcı. Bunu önemsiyor ve test edilmemiş bir kod üretmemeniz gerektiğini düşünüyorsanız, iyi test alışkanlıklarını öğrenmek için irade gücünü bulabileceksiniz. Şu anda çok yaptığım bir şey (diğerleri gibi), kendime herhangi bir test yapmadan kod yazmak için bir saat timebox ve sonra onu çöpe atacak disipline sahip olmak. Bu savurgan görünebilir, ama gerçekten değil. Bu egzersiz bir şirketin fiziksel malzemelerine mal olmayacak. Sorunu anlamama ve kodu hem daha kaliteli hem de test edilebilir olacak şekilde nasıl yazacağımı anlamama yardımcı oldu.
Nihayetinde tavsiyem, eğer gerçekten iyi olma arzunuz yoksa, o zaman hiç yapmayın. Devam ettirilmeyen, iyi performans göstermeyen vb. Kötü testler, hiç test yaptırmamaktan daha kötü olabilir. Kendi başınıza öğrenmek zordur ve muhtemelen sevmeyeceksiniz, ancak bunu yapma arzunuz yoksa veya bunda yeterince değer göremiyorsanız öğrenmek neredeyse imkansız olacaktır. zaman yatırımını garanti eder.
Birkaç kişi, testin şartnamenin uygulanmasına yardımcı olduğundan bahsetti. Benim tecrübelerime göre teknik özelliklerin de yanlış olduğu, çoğu zaman ...
Bir geliştiricinin klavyesi, kauçuğun yolla buluştuğu yerdir. Spesifikasyon yanlışsa ve üzerindeki bayrağı kaldırmazsanız, bunun için suçlanmanız çok muhtemeldir. Ya da en azından kodunuz olacaktır. Testte yer alan disiplin ve titizliğe uymak zordur. Hiç de kolay değil. Pratik yapmak, çok öğrenmek ve birçok hata yapmak gerekir. Ama sonunda karşılığını veriyor. Hızlı tempolu, hızla değişen bir projede, sizi yavaşlatsa da, geceleri uyumanın tek yolu budur.
Burada düşünülmesi gereken başka bir şey de, temelde testle aynı olan tekniklerin geçmişte işe yaradığı kanıtlanmış olmasıdır: "temiz oda" ve "sözleşmeye göre tasarım" her ikisi de aynı tür "meta" kod yapılarını üretme eğilimindedir. testler yapar ve bunları farklı noktalarda uygular. Bu tekniklerin hiçbiri sihirli değnek değildir ve titizlik, pazara sunma süresi açısından sunabileceğiniz özellikler kapsamında sonuçta size mal olmayacaktır. Ama konu bu değil. Bu, sunduğunuz şeyi sürdürebilmekle ilgilidir. Ve bu çoğu proje için çok önemli.