TL; DR
İyi, yararlı testler yazmak zordur ve C ++ 'da yüksek bir maliyeti vardır. Deneyimli geliştiriciler neyi ve ne zaman test edeceğinizi gerekçenizi paylaşabilir misiniz?
Uzun Hikaye
Eskiden test odaklı geliştirme yapıyordum, aslında tüm ekibim, ama bizim için iyi çalışmadı. Birçok testimiz var, ancak hiçbir zaman gerçek hatalar ve gerilemelerimiz olan vakaları kapsamıyor gibi görünüyor - genellikle üniteler etkileşime girdiğinde, izole davranışlarından değil.
Bu, birim seviyesinde test etmek o kadar zordur ki, TDD yapmayı bıraktık (gelişimi gerçekten hızlandırdığı bileşenler hariç) ve bunun yerine entegrasyon testi kapsamını artırmak için daha fazla zaman harcadık. Küçük birim testleri hiçbir zaman gerçek bir hata yakalamadı ve temelde sadece bakım yükü olsa da, entegrasyon testleri gerçekten çabaya değerdi.
Şimdi yeni bir proje miras aldım ve nasıl test edeceğimi merak ediyorum. Bu yerel bir C ++ / OpenGL uygulamasıdır, bu nedenle entegrasyon testleri gerçekten bir seçenek değildir. Ancak C ++ 'da birim testi Java (biraz açık bir şekilde şeyler yapmak zorunda virtual
) daha zordur ve program ağır nesne odaklı değil, bu yüzden bazı şeyler alay / saplama olamaz.
Sadece test yazma uğruna bazı testler yazmak için her şeyi parçalamak ve OO-boyutlandırmak istemiyorum. Size soruyorum: Testler ne için yazmalıyım? Örneğin:
- Sık sık değiştirmeyi beklediğim fonksiyonlar / sınıflar?
- Manuel olarak test edilmesi daha zor olan fonksiyonlar / sınıflar?
- Test edilmesi kolay fonksiyonlar / sınıflar?
Bazı saygın C ++ kod üslerini nasıl test ettiklerini görmek için araştırmaya başladım. Şu anda Chromium kaynak kodunu arıyorum, ancak test gerekçelerini koddan çıkarmak zor buluyorum. Herkesin popüler C ++ kullanıcılarının (komite mensupları, kitap yazarları, Google, Facebook, Microsoft, ...) buna nasıl yaklaştığına dair iyi bir örneği veya yayını varsa, bu çok yardımcı olacaktır.
Güncelleştirme
Bunu yazdığımdan beri bu sitede ve web'de yolumu araştırdım. Bazı iyi şeyler buldum:
- Ünite testinin yapılmaması ne zaman uygundur?
- /programming/109432/what-not-to-test-when-it-comes-to-unit-testing
- http://junit.sourceforge.net/doc/faq/faq.htm#best
Ne yazık ki, bunların hepsi Java / C # merkezlidir. Java / C # 'da çok sayıda test yazmak büyük bir sorun değildir, bu nedenle fayda genellikle maliyetlerden ağır basar.
Ama yukarıda yazdığım gibi, C ++ 'da daha zor. Özellikle kod tabanınız OO değilse, iyi bir birim test kapsamı elde etmek için işleri ciddi şekilde karıştırmanız gerekir. Örneğin: Devraldığım uygulamanın Graphics
OpenGL üzerinde ince bir katman olan bir ad alanı var. Tüm işlevlerini doğrudan kullanan varlıklardan herhangi birini test etmek için bunu bir arayüze ve sınıfa dönüştürüp tüm varlıklara enjekte etmem gerekir. Bu sadece bir örnek.
Bu soruyu cevaplarken, test yazmak için oldukça büyük bir yatırım yapmam gerektiğini lütfen unutmayın.