Birim testi - özellikle C ++ 'da - belirli bir sorun için kesinlikle çağrılacak daha fazla dikiş eklemek için test edilen koddan gereklidir.
Sadece problem çözmenin ayrılmaz bir parçasını test etmeyi düşünmüyorsanız. Herhangi bir önemsiz sorun için, sadece yazılım dünyasında değil.
Donanım dünyasında, bu uzun zaman önce - zor yoldan öğrenildi. Çeşitli ekipman üreticileri yüzyıllar boyunca sayısız düşen köprülerden, patlayan arabalardan, sigara içen CPU'lardan vb. Hepsi, test edilebilir hale getirmek için ürünlerine "ekstra dikişler" oluşturur. Günümüzde çoğu yeni otomobil, tamircilerin motorda neler olduğu hakkında veri almaları için teşhis portlarına sahiptir. Her CPU üzerindeki transistörlerin önemli bir kısmı teşhis amaçlıdır. Donanım dünyasında, her "ekstra" malzeme maliyeti ve bir ürün milyonlarca kişi tarafından üretildiğinde, bu maliyetler kesinlikle büyük miktarlarda para ekler. Yine de, üreticiler bu parayı test edilebilirlik için harcamak istiyorlar.
Yazılım dünyasına geri dönersek, C ++, dinamik sınıf yüklemesi, yansıma vb. İçeren daha sonraki dillerden birim testi yapmaktan daha zordur. Yine de, sorunların çoğu en azından hafifletilebilir. Birim testleri kullandığım bir C ++ projesinde, testleri bir Java projesinde yaptığımız kadar sık çalıştırmadık - ama yine de CI derlememizin bir parçasıydık ve onları faydalı bulduk.
Birim Testlerinin bir kişinin kodunu "sadece" yapılandırması, birim testler için faydalı mıdır, yoksa aslında uygulama yapısına faydalı mıdır?
Deneyimlerime göre test edilebilir bir tasarım genel olarak yararlıdır, ünite testleri için "sadece" değil. Bu faydalar farklı düzeylerde gelir:
- Tasarımınızı test edilebilir yapmak, uygulamanızı birbirini yalnızca sınırlı ve iyi tanımlanmış şekillerde etkileyebilecek küçük, daha fazla veya daha az bağımsız parçalara ayırmanızı sağlar - bu, programınızın uzun vadeli istikrarı ve sürdürülebilirliği için çok önemlidir. Bu olmadan kod, kod tabanının herhangi bir bölümünde yapılan herhangi bir değişikliğin programın görünüşte ilgisiz, farklı kısımlarında beklenmedik etkilere neden olabileceği spagetti koduna dönüşme eğilimindedir. Söylemeye gerek yok ki, her programcının kabusu.
- Testleri TDD tarzında kendileri yazmak aslında API'lerinizi, sınıflarınızı ve yöntemlerinizi kullanır ve tasarımınızın mantıklı olup olmadığını tespit etmek için çok etkili bir test görevi görür - eğer testler ve arayüze karşı yazma testleri garip veya zor geliyorsa, değerli bir erken geri bildirim alırsınız API'yı şekillendirmek hala kolay. Başka bir deyişle, bu sizi API'larınızı erken yayınlamaktan korur.
- TDD tarafından uygulanan geliştirme modeli, yapılacak somut görev (ler) e odaklanmanıza yardımcı olur ve sizi hedefte tutar, ihtiyaç duyduğunuzdan başka problemleri çözme şansınızı en aza indirir, gereksiz ekstra özellikler ve karmaşıklık ekler , vb.
- Birim testlerinin hızlı geri bildirimi, kodu yeniden düzenlemede cesur olmanızı sağlar, böylece kodun ömrü boyunca tasarımı sürekli olarak uyarlamanıza ve geliştirmenize olanak tanır, böylece kod entropisini etkili bir şekilde önler.
Kodu kullanan ikinci bir yer olana kadar genelleme yapmadığını söyleyen bir başparmak kuralını hatırlıyorum. Birim Testleri ile her zaman kodu kullanan ikinci bir yer vardır - birim testi. Peki bu sebep genelleme için yeterli mi?
Yazılımınızın tam olarak yapılması gerekeni yaptığını kanıtlayabilir ve birim testleri ile zorlanan "ekstra" genelleme veya dikişler olmadan müşterilerinizi tatmin edecek kadar hızlı, tekrarlanabilir, ucuz ve belirleyici bir şekilde kanıtlarsanız, bunu deneyin (ve bunu nasıl yaptığınızı bize bildirin, çünkü bu forumdaki birçok insanın benim kadar ilgi duyacağından eminim :-)
Btw "genelleme" ile tek bir somut sınıf yerine bir arayüz (soyut sınıf) ve polimorfizm tanıtmak gibi şeyleri kastediyorum - değilse, açıklığa kavuşturun.