Projemi test etmek için benim için ne kadar büyük olmalı? [kapalı]


86

Projemin, birim testine izin verecek kadar ayrıldığını varsayıyorum. Ancak, tam olarak, ipler ve fonksiyonlar açısından ne kadar büyük, projem için değerli bir birim testi yapmak zorunda mıyım?

Hepimiz hatalar yaparız ve hiç kimse kusursuz değildir, fakat kendimi küçük projelerin hatalarını atlatmak için iyi bir programcı olarak görüyorum. Veya projenizin boyutu ne olursa olsun, birim testi zorunluluktur mu?


26
Yaptığınız en büyük yanlış varsayım, projenin sadece sizin için olduğu ve sadece şimdilik olduğu . Ya birkaç aylığına bırakırsan, başka bir şey yaparsan, sonra geri dönersin? "İyi bir programcı" olmak konusunda aynı güvene sahip olacak mısınız (ki bunun test edip etmemekle ilgisi yok)? Ya projenizi başkası devraldıysa ... (Ne yazık ki artık aktif) Büyük bir blogger yazdı daima "kod okuyucu değil, kod yazar karşılamak" gerektiğini söyledi.
Amos M. Carpenter,

6
Buna ne dersin (C # .NET ile ilgilidir): int x = 3 * (1/3); işlem tamamlandıktan sonra x'te depolanan değer nedir? Demek istediğim bir satır kodunun bile test edilmesi gerekebilir, çünkü bir hataya neden olabilir, bilmediğiniz veya bildiğiniz, ancak yanlış kodu yaptığınız için bir hataya neden olabilir.
NoChance

2
@aaamos, sanırım amacımı kaçırıyorsunuz. Sadece bu soruyu sormam gerçeği, kod okuyucuyu da hazırlamayı düşündüğümü gösteriyor.
Lamin Sanneh

13
Her iki yönde de yaptıktan sonra, size testleri devam ederken (yani proje küçükken) yazmaktan çok daha kolay olduğunu söyleyebilirim, daha sonra projenin keyfi bir şekilde karşılaştığını düşündüğünüzde birim testleri yazmaktan daha geriye giderim " şimdi testleri yazmalıyız "durumu.
Wonko Sane

1
Yanlış soruyu soruyorsun. Projenin ne kadar büyük olduğu önemli değil. Soru, doğru olup olmadığını ne kadar önemsiyorsun? Doğruluk önemliyse, ünite testleri doğruluğu arttırmanın etkili bir yoludur.
Mark E. Haase,

Yanıtlar:


206

Projen zaten yeterince büyük.

Tecrübelerime göre, bir sınıf ve bir fonksiyon, ünite testi ihtiyacını göz önünde bulundurmak için yeterli olmuştur.

    class Simple {
        boolean reallySimple() {
            return true; // how do we make sure it doesn't change to false?
        }
    }


    class SimpleTest {
        void assertReallySimple() {
            // ensure reallySimple return value isn't changed unexpectedly
            UnitTestFramework.assertTrue(new Simple().reallySimple());
        }
    }

24
Elbette daha erken başlamalısınız, eğer 0 sınıf / 0 işlev noktasında ... eğer TDD'yi izliyorsanız :)
Kaz Dragon

115
+1. Programlamada hata yapacak kadar büyükseniz, birim sınamalarına tabi olacak kadar büyüktür.
Jason Orendorff

9
@JasonOrendorff: Bunu bir postere alay edip ofisime koyuyorum. Parlak.
Justin,

Ek olarak "güvenli" refactoring için izin verir.
Timo

7
Her ne kadar bu düşünceye katılmam gerekmiyor olsa da, eğer kodunuz gerçekten bu kadar basitse, tam gelişmiş ünite testleri yerine muhtemelen sadece iddialardan kurtulabilirsiniz.
Chuu,

109

"Her şeyi test etmelisin" fikrini asla satın almadım, kesinlikle orada olan kişiler var ( gnat'ın cevabını görün !).

İlgilendiğim kadarıyla, birim testinin temel faydaları:

  1. Değişikliklerin bir şeyleri bozmadığından emin olmaya yardımcı olmak.
  2. Sınıflarınız için mantıklı arayüzler tasarlamanıza yardımcı olmak (çünkü sizi kendi kodunuzda bir müşteri olmaya zorlar).
  3. Kodunuzun nasıl kullanılması bekleniyor belgelenmesine yardımcı olunması.

Temel olarak, bu faktörlere karşı testler yazma ve sürdürme sürenizi ölçmeniz gerekir.

Sayı 1, yazma sınavlarına değmek için genellikle yeterlidir. Deneyimlerime göre, kodun>% 95'i er ya da geç değiştiriliyor.


8
Buna katılıyorum - tek bir geliştirici dükkanında çalışırken, yazılım kalitesi ile her şeyin test edilmesi arasında bir denge kurmanız gerekir (bu da çok zamanınızı alabilir). Unutmayın, her değişiklik yaptığınızda, birim testlerinizi uygun hale getirmeniz gerekebilir
Matt Wilko

1
Her şeyi test etmemelisiniz, ancak dış dünyaya maruz kalan herhangi bir davranışı test etmelisiniz. Test için kesinlikle bakım maliyetleri var ve Kent Beck'in bazı SO cevaplarında (SO olduğunu düşünüyorum) dediği gibi - kodunuzun doğru olduğundan emin olmanız için yeterince test edin.
Wayne Werner

10
Sadece minimum otomatik test yapıyorsanız, birim testleri hedeflemek için yanlış seviyede olduğunu ekleyeceğim. Bunun yerine, birkaç veri setini uygulamanızın sonuna kadar hiçbir şeyle alay etmeden zorlayan yüksek seviye entegrasyon / duman testleri yapın. Bu testlerin kod tabanınızdan olabildiğince fazla egzersiz yapmasını ve tüm normal kullanım durumlarını ve uygulama yollarını kapsamasını istiyorsunuz. Değişikliklerinizi bilme şansı% 75, bir yerde bir şey bozdu, uygulamada,% 5% SomeClass.OneOfTheHandfulOfTestedFunctions () 'ı kırdığını bilme şansından daha faydalı.
Dan Neely,

3
Uh, bence birini özledin: "Kodun olması gerektiği gibi çalıştığından emin olun!"
BlueRaja - Danny Pflughoeft

3
@ BlueRaja-DannyPflughoeft: Aslında, "Kodun yazdığınız ünite testlerini geçtiğinden emin olmak!" Demek daha doğru olur! "
vaughandroid

34

Çok basit: Programı bir kez çalıştırdıktan sonra atacaksanız, birim testine ihtiyacınız yoktur.

Bu sizin için aşırı görünüyorsa, alternatifin ne anlama geldiğini düşünün. Hangi birim testinin ödemediği bir boyutun altında olsaydı, aklınızda karar vermeye devam etmek zorunda kalacaksınız: "Henüz büyü boyutuna ulaştım mı? Testler yazmaya başlamalı mıyım?" Şimdi, programcılar geleceği tahmin etmekte çok kötü davranıyorlar ve kendi yeteneklerini değerlendirmede açıkça kötüler. Şimdi size kristal gibi görünen kod, bir ay bekleyerek bile sizin için bile anlaşılmaz hale gelecektir. Kesinlikle olan bir proje, olumlu belli tekrar asla kullanılmayacaktır ve sadece daha önce, bir şeyi nasıl çözdüğünü yukarı bakmak isteyebilirsiniz uzak şans etrafında tutmak edecektir tekrar istenecek ve değişiklik istekleri alacaksınız.

Bu nedenle, testin faydalı olup olmadığına karar vermemeniz çok muhtemeldir ve testlere ihtiyaç duyduğunuzda, test etmek için tam bir anlambilim olduğundan emin değilsiniz. Önemsiz tek seferlik programlar dışındaki tüm ünitelerin test testlerinden faydalandığına inandığım için, denenmemiş ve anlaşılmayan kodları uzatma risklerine karşı bir daha ihmal edilemeyecek testler için çaba harcama maliyetini düşünüyorum.


22
Programcılar, geleceği tahmin etme becerilerini değerlendirmekte çok kötü
davranıyorlar

3
@superM Sana katılıyorum. Kalan kısa kariyerim boyunca zaten yazdığım "bir kez koş ve at" programı, birkaç günde bir koştu ve iş için kritik hale geldi. Ben "geçici" aka geçici-kalıcı etki
denir

@ Jalayn Cevabı basit bir şekilde geri dönmeli ve bu gerçekleştirme gerçekleşir gerçekleşmez birim testleri eklemeli mi?
Cornel Masson

@CornelMasson Kesinlikle haklısın, yöneticileri "henüz bitmedi" olduğuna ikna etmenin genellikle zor olacağını
bekleyin

@ Jalayn: Çok doğru!
Cornel Masson

22

Bir süre önce güzel bir yazı buldum: Ünite testi neden gelişimi hızlandırıyor . Soruyu cevaplamanıza yardımcı olabilir.

... Ya kod temeli ... önemli bir birim test seti ile sağlandıysa? “Tüm testler başarılı olursa, kodun yapması gerekeni yaptığını garanti ederim” diyen bir set ve bir test başarısız olursa, bazı davranışların nerede bozulduğunu size tam olarak gösterir. Bu harika, kod hala yapması gerekeni yaparsa dolaşmadan istediğim şeyleri eklemek için kodu değiştirebilirim, sadece testleri ... çalıştırırım ve inancım var. Bu, bir yazılım mühendisi olmak için harika bir dünya. Daha hızlı ilerleyebileceğimi farkettim ...

Benim inancım var".

Bu, muhtemelen birim testlerin kurumsal bağlamda gelişmeyi hızlandırmasının en önemli nedenidir.

Bütün testler geçerse her şeyin hala işe yaradığına güvenebilirim. Testler başarısız olursa, sorunun nerede olduğunu tam olarak gösterecekler ...

... yüksek ünite test kapsamı ve iyi ünite testlerine sahip olmalısınız . Bu şartlara saygı duyulduğunda, yeni işlevsellik ekleme çabasının uygulamanın boyutundan bağımsız olduğu ve uzun vadede gelişmeyi hızlandıracağı bir durumda bulacaksınız .

Michael Feathers kitaplarından birinde koddaki değişikliklerle çalışmanın iki yolunu sundu:

  • düzenle ve dua et,
  • ört ve değiştir.

Kod tabanının ne kadar büyük olduğu önemli değil.


18

Kent Beck'e göre Stack Overflow sorusuna cevabında Ünite testleriniz ne kadar derin? yanlış anlama eğiliminde olduğunuz kodu test etmelisiniz.

Genelde bir tür hata yapmazsam (bir kurucuda yanlış değişkenleri ayarlamak gibi), bunun için test yapmam.


4
İyi nokta ve bu OP'nin sorusunun yanlış olduğu anlamına gelir; Testin projenin büyüklüğü ile ilgisi olup olmadığı. 5 satırlık bir kod temeli sınamalara ihtiyaç duyabilir ve büyük bir kod tabanındaki 1 satırlık bir yöntem gerekmeyebilir (bu kod tabanındaki diğer şeyler de buna rağmen).
Nathan Long,

Bu, tek başına üzerinde çalıştığınız küçük projeler için işe yarayabilir, ancak iş için yapılan (gelecekte kimin üzerinde çalışacağını kontrol edemediğiniz) veya açık kaynak olabilecek herhangi bir proje için ihtiyacınız olabilir. her şeyi test etmek için. Ve hemen başlamalısın çünkü daha sonra "zaten yazılmış olan tüm kodları doldurmak çok zor" olacak
xaxxon

@xaxxon: Kent, Mansuro'nun bir takıma kod yazarken, toplu olarak yanlış anlaşmaya çalıştığımız kodu dikkatlice test etmek için stratejimi değiştiriyorum.
Henko

Hayır, hala inanılmaz derecede kısa görüşlü. Gelecekte kod üzerinde kimin çalışacağını bilemezsiniz. Bu, küçük geliştiricileri etkileyen bir zihniyet türüdür.
xaxxon

5

Zaman kazanmak ve iyileştirmek için birim testleri uygulanmaktadır:

  • Hata izleme
  • yeniden düzenleme ve / veya kodu tekrar yazma
  • entegrasyon testi
  • regresyon testi vb.

Programın nispeten karmaşık bölümleri için birim testleri yazmak şarttır.

Birim testlerinin şimdi yazılmasının gelecekte zaman kazanmayacağından eminseniz, bunu atlayabilirsiniz. Ancak, asla bilemezsiniz ve şahsen şahsen daha ucuz (zaman, para ve sinir anlamında) birim testleri yazmanın değil, bunun yerine tüm testleri manuel olarak yapmanın daha ucuz olduğu bir durum düşünemiyorum.


Genellikle iyi bir cevap, yani +1. Bununla birlikte, son noktanızın ünite testlerinizi manuel olarak test etmek isteyeceğiniz / ihtiyaç duyacağınız gerçeğini özlediğini düşünüyorum!
vaughandroid

@Baqueta, belki de net gelmedi, ancak birim testlerinin manuel testlerin tamamen yerine geçtiğini söylemek istemedim
superM

4

"Bunu test etmeli miyim?", Genellikle şu soruyu cevaplayarak cevaplandırılabilir: "Bu işlevin düzgün çalışması önemli mi ve çalışmayı ne zaman durduracağını bilmek benim için önemli mi?"

Tabii ki, bundan çok daha karmaşık, ama bu başlamak için iyi bir yol. Sonunda, kodun başka bir işlevde kullanılmasından dolayı test edilip edilmediğini veya zamanınızın başka bir işlevde daha iyi harcanmasını vb.


4

Test etmeden kod yazmayacağınız sürece, her zaman test maliyetine tabi olacaksınız.

Birim testine sahip olmak ve bunlara sahip olmamak arasındaki fark, testin yazma maliyeti ile testin maliyetini elle yapılan testin maliyeti arasındaki farktır.

Bir birim testinin yazılmasının maliyeti 2 dakika ise ve birim testinin çalıştırılmasının maliyeti pratik olarak 0 ise, ancak kodu manuel olarak test etmenin maliyeti 1 dakikaysa, testi iki kez çalıştırdığınızda bile kırılırsınız.


Uzun yıllar boyunca, kodum için birim testleri yazmak için yeterli zamanım olmadığından yanlış anlaşıldım. Testler yazarken, şişirilmişlerdi, beni ancak ihtiyaç duyduğumu bildiğimde sadece birim testleri yazmam gerektiğini düşünmem için cesaretlendiren ağır şeylerdi .

Son zamanlarda Test Odaklı Geliştirme'yi kullanmaya teşvik edildim ve tam bir vahiy buldum. Şimdi, kesin olarak birim testleri yazmamaya vaktim olmadığına ikna oldum .

Tecrübelerime göre, akılda tutularak test geliştirerek daha temiz arayüzler, daha çok odaklanmış sınıflar ve modüller ve genellikle daha fazla SOLID , test edilebilir kod ile karşılaşırsınız.

Her ne zaman birim testi olmayan eski kodla çalıştığımda ve bir şeyi manuel olarak test etmek zorunda kaldığımda, "bu kod zaten birim testleri olsaydı daha hızlı olacağını" düşünüyorum. Her ne zaman yüksek kuplajlı koda ünite testi işlevini denemek ve eklemek zorunda kalsam, "bunun çift bağlı bir şekilde yazılmış olsaydı daha kolay olacağını" düşünüyorum.


TL; DR versiyonu:

Testi yazmanın maliyeti ile birlikte, ihtiyacınız olduğu kadar çok çalıştırmanın maliyeti, gerektiğinde manuel olarak test etmenin maliyetinden daha düşük olacağında bir test yazın.

TDD kullanıyorsanız, yazma testlerinin maliyetinin daha iyi olduğunuz için düşmesi muhtemel olduğunu ve kod kesinlikle önemsiz olmadığı sürece, muhtemelen testlerinizi beklediğinizden daha sık kullanacağınızı unutmayın.


3

Regresyonların meydana geldiğini gözlemledikten hemen sonra test edin ya da düzenlemelerinizde bazılarına neden olan ve fark etmeyenlerden korkun .

Bu korkuyu giderin, yeterli büyüklükte büyümesine izin verin: ne kadar erken test ederseniz o kadar iyi.

Lütfen dikkat: Projedeki rolünüze bağlı olarak, birim testleri yazmak istediğiniz tek tür test olmayabilir.

Geçmişte kötü ana sınav uygulamalarından dolayı herkes birim sınavlarına haklı bir şekilde takıntılıdır ; ama daha önce hiç test etmediyseniz, genel olarak testlere odaklanmalısınız, tek başına birim testi dünyadaki sorunları çözmez.


1
Anladığını görüyorum ama başlangıç ​​programcıları için temel başlangıç ​​noktasını test etmiyor. Ayrıca, "genel olarak test" ile ne demek istediğinizi daha ayrıntılı olarak açıklayabilir misiniz? Teşekkürler.
Lamin Sanneh

1
En az iki test türü daha vardır - entegrasyon testi ve kabul testleri. Birim testleri belirli bir birimi kapsar (örneğin, bu sınıfın bu işlevinin Fizz'ı Frab etmesi gerekiyordu). Bu sınıfın etkileşime girdiği diğer tüm yerlerle alay ediyor / saplıyorsunuz, sahte verilerden geçiyorsunuz. Entegrasyon testleri yaptığınızda, sınıflarınızın olması gerektiği gibi bir araya geldiğinden emin olmak için iki (veya daha fazla) sınıfı birleştirirsiniz. Sonunda, bazen "duman testleri" olarak bilinen, tüm sisteminizin uçtan uca testini yaptığınız yeterince test geliştirirsiniz.
Wayne Werner

Ayrıca mahkemede regresyon testi var . Regresyon testleri genellikle ünite testinden daha büyüktür, oluşturulması bir gün alabilir, test verilerine ve özel test ortamlarına erişim anlamına gelebilir. Aslında ünite testleri daha küçük, daha zarif ve daha eski (eski tarz) regresyon testlerinin daha sürdürülebilir bir versiyonudur.
ZJR,

1

Projenin büyüklüğü değil, test kullanıp kullanmayacağına karar veren projenin türü olduğuna inanıyorum.

Kavramın bir kanıtı üzerinde veya hedefin kodlamadan öğrenmek olduğu başka bir projede çalışıyorsanız, test yapmak gerekmez. Projenin kullanılması gerekiyorsa, hatta üretime gönderilmesi durumunda, test edilmesi gerekir.

Robert C. Martin'in "Temiz Kodu" ndan bir alıntı : "Yazması önemsizse, test etmek önemsizdir", bu nedenle kısa ve önemsiz programların testini atlamak için hiçbir bahane yoktur.


0

Gerçekten büyüklük meselesi değil-- onunla ne iş yapıyorsunuz (ve kaç yaşında). Bir teknolojinin nasıl çalıştığını öğrenmek ve onu atmak için plan yapmayı öğrenmek için noodling yapıyorsam (biz buna Scrum'da bir spike diyoruz), çok fazla test yapmadan kodlayacağım. Daha fazla geliştirmeyi planlıyorsanız (sadece noodle yapıyor olsanız bile), kodun etrafına testler yazmalısınız. TDD, bir test tekniği olmadan önce bile bir tasarım tekniğidir. Yürütmeyle ilgili detaylara uymadan önce, kodun ne yapmasını istediğinizi net bir şekilde görmek istersiniz. Ben de olur DEĞİLbüyük miktarda eski kodun etrafına kapsamlı birim testleri yazmayı denemenizi öneririz. Karmaşık olan kısımları (kendileri için yüksek döngüsel karmaşıklık / spagetti koduna sahip olan) ve sık sık arızalı olan parçaları (genellikle aynı olacaktır) tanımlamaya çalışın. Diğerlerinin önerdiği gibi, Kent Beck'in TDD'deki kitabını okudum ve kesinlikle Michael Feather'ın kitabını okudum. Çok fazla kapsamadıkları şey, kod etrafında birim testleri yazmanın politik yönüdür. Pek çok geliştirici test edilebilir hale getirmek için kodunu değiştirmek zorunda kalmaktan nefret eder ve pek çok geliştirici kodları test etme gereği duymaz. Bu bir meslek olarak üzerinde çalışmamız gereken bir şey. Diğer her mühendislik disiplininin çalışmalarının şartnameye uygun olduğunu ispat etmesi (genellikle matematiksel olarak) gerekmektedir. Aynı şeyi yapmalıyız.


-1

Bir Projeleri sınıflar veya işlevler dahilinde bağlamak ve ardından bunun ünite testi için uygun olup olmadığına karar vermek yanlış olabilir. Bir uygulamayı test etmenin sayısız yararı vardır, ancak bir uygulamayı sürdürmeniz veya dağıtılmış ortamda çalışmanız gerektiğinde gerçek güzellik başlar. Yani seçim buraya geliyor. Kodunuzda küçük bir değişiklik bile felaketlere neden olabilir.
Sadece 'Birim Testi' önermekle kalmaz, aynı zamanda kodunuzun kapsamını kontrol etmenizi ve kodunuzun maksimumunun Birim Testi ile kaplandığından emin olmanızı öneririm. Kod kapsamı için eşik % 95'ten az olmayacak ve hedef % 100 civarında olmalıdır . Kod kapsamınızı takip etmek ve bir rapor oluşturmak için araçlara gidebilirsiniz.
Visual Studio, Kapsam Verileri Sağlıyor -http://msdn.microsoft.com/en-us/library/ms182496(v=vs.80).aspx
Ayrıca NCover veya dotCover kullanabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.