Mevcut Kod İçin Test Yazma


68

Birinin nispeten büyük bir programı olduğunu varsayalım. Tüm kod tabanı, artık şirkette olmayan, tek bir üst düzey geliştirici tarafından yazılmıştır. Tüm kodlar olduğu gibi test edilebilir ve IoC boyunca kullanılır - bazı garip sebepler dışında herhangi bir ünite testi yazmadılar. Şimdi, şirketiniz kodu dallamak istiyor ve değişikliklerin temel işlevselliği ne zaman bozduğunu tespit etmek için birim testlerinin eklenmesini istiyor.

  • Test eklemek iyi bir fikir midir?
  • Öyleyse, böyle bir şeye nasıl başlanır?

DÜZENLE

Tamam, bu yüzden karşıt sonuçlar için iyi argümanlar yapan cevaplar beklemiyordum. Sorun yine de ellerimden çıkmış olabilir. "Yinelenen soruları" da okudum ve genel fikir birliği "test testleri iyi" ... evet, ama bu özel durumda çok yardımcı olmadı.

Eski bir sistem için test yazarken, burada yalnız olduğumu sanmıyorum. Ne kadar zaman harcandığı ve yeni testlerin kaç kez sorunlara karıştığı (ve kaç kez) ile ilgili ölçümleri tutacağım. Sonuçlarıma geri dönüp bunu bir yıl ya da öylesine güncelleyeceğim.

SONUÇ

Bu nedenle, herhangi bir ortodokside herhangi bir semblance ile mevcut koda sadece birim testi eklemenin imkansız olduğu ortaya çıktı. Kod çalıştıktan sonra, testlerinizin açıkça kırmızı veya yeşil ışık kullanamayacağınız, genellikle hangi davranışların test edilmesi gerektiği açık değildir, nereden başlayacağınız açık değildir ve işiniz bittiğinde kesinlikle net değildir. Gerçekten de bu soruyu sormak bile ilk başta test yazmanın ana noktasını özlüyor. Vakaların çoğunda, TDD kullanarak kodu tekrar yazmak, amaçlanan işlevleri çözmek ve geriye dönük olarak birim testlerine eklemek kadar kolaylaştı. Bir sorunu düzeltirken veya yeni bir özellik eklerken farklı bir hikaye ve birim testleri ekleme zamanı geldiğine inanıyorum (bazıları aşağıda belirtildiği gibi). Sonunda çoğu kod yeniden yazılır, genellikle beklediğinizden daha kısa sürede - bu yaklaşımı benimsem


10
Testler eklemek mevcut kodu bozmaz.
Dan Pichelman

30
@DanPichelman Hiç bir schroedinbug yaşamamışsınız - "Birini, kaynağı okuyan veya programı alışılmadık bir şekilde kullanmayana kadar hiçbir zaman çalışmaması gerektiğini farkeden bir programdaki tasarım veya uygulama hatası; "düzeltilinceye kadar herkes için çalışmayı bıraktı."

8
@MichaelT Bundan bahsettiniz, sanırım onlardan birini veya ikisini gördüm. Yorumum "Testler eklemek genellikle mevcut kodu bozmaz" okumalıydı . Teşekkürler
Dan Pichelman

3
Yalnızca refactor veya değiştirmeyi düşündüğünüz şeylerin testlerini yazın.
Steven Evers,

3
"Eski Kod ile Etkili Çalışma" kitabına bakın: amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/… , Michael Feathers herhangi bir eski kodu değiştirmeden önce testleri yazmanızı önerir.
Skarab

Yanıtlar:


68

Testler iyi bir fikir olsa da , asıl kodlayıcının , kodun nasıl çalışması gerektiği ve daha sonra size ne aktarılacağı konusundaki bilgisini yakalamak için uygulamayı oluştururken bunları oluşturması için bir niyet vardı .

Bu yaklaşımı alırken, en az kırılması muhtemel testleri yazmanız ve uygulamayı oluştururken keşfedilecek olan son durumların çoğunu kaçırmanız olasılığı yüksektir.

Sorun, değerin çoğunun bu “gotchas” dan ve daha az belirgin durumlardan gelmesidir. Bu testler olmadan test paketi neredeyse tüm etkinliğini kaybeder. Buna ek olarak, şirket, uygulamalarında yanlış bir güvenlik hissine sahip olacak, çünkü önemli ölçüde daha fazla gerileme kanıtı olmayacak.

Tipik olarak, bu tür kod tabanını işlemenin yolu, eski kod tabanı tamamen yeniden yapılandırılıncaya kadar yeni kod için ve eski kodun yeniden düzenlenmesi için testler yazmaktır.

Ayrıca bakınız .


11
Ancak TDD'siz bile, ünite testleri yeniden yapılanma sırasında kullanışlıdır.
pdr

1
Kod iyi çalışmaya devam ederse, sorun olmaz, ancak yapılacak en iyi şey, davranışına dayanan bir şey yazdığınızda arayüzün eski kodu test etmesidir.
deworde,

1
Bu yüzden test kapsamını ölçtünüz . Belirli bir bölüm için yapılan testler tüm ifs ve else'leri ve tüm kenar kasalarını kapsamıyorsa, o bölümü güvenli bir şekilde yeniden yerleştiremezsiniz. Kapsam, tüm hatlara isabet edilip edilmediğini size söyleyecektir; bu nedenle hedefiniz yeniden yapılanmadan önce kapsamı olabildiğince artırmaktır.
Rudolf Olah

3
TDD'nin önemli bir eksikliği, süit çalıştırılabilirken, kod tabanına aşina olmayan geliştiriciye, bunun yanlış bir güvenlik duygusudur. Çıktı olarak BDD bu konuda çok daha iyi niyeti düz ingilizce kod.
Robbie Dee,

3
Sadece% 100 kod kapsamının, kodunuzun% 100 doğru çalıştığı anlamına gelmediğini belirtmek gibi. Test edilen yöntem için her kod satırına sahip olabilirsiniz, ancak yalnızca value1 ile çalıştığından, değer2 ile çalışmanın garanti olduğu anlamına gelmez.
ryanzec

35

Evet, test eklemek kesinlikle iyi bir fikir.

İyi bir şekilde belgelendiğini söylüyorsun ve bu seni iyi bir pozisyona sokuyor. Sistemin kritik ya da sık sık değişebileceği bölümlerine odaklanarak bu belgeleri kılavuz olarak kullanarak testler oluşturmayı deneyin.

Başlangıçta, kod tabanının büyüklüğü küçük çaplı testlere kıyasla büyük olasılıkla zor görünecek, ancak büyük patlama yaklaşımı yok ve bir yerden başlamak en iyi yaklaşımın ne olacağı konusunda acı vermekten daha önemli.

Bazı iyi, ayrıntılı tavsiyeler için Michael Feathers'ın Eski Kod ile Etkili Çalışma kitabını öneririm .


10
+1. Testleri belgelere dayanarak yazarsanız, çalışma kodu ile belgeler arasındaki herhangi bir tutarsızlığı keşfedersiniz ve bu paha biçilmezdir.
Carl Manaster,

1
Test eklemek için başka bir neden: bir hata bulunduğunda, gelecekteki regresyon testi için kolayca bir test durumu ekleyebilirsiniz.

Bu strateji temel olarak, eski kodlarla ilgili bölümdeki (ücretsiz) edX çevrimiçi kursu CS169.2x'te ana hatlarıyla anlatılan stratejidir. Öğretmenlerin söylediği gibi: Kitapta Bölüm 9'daki "Karakterizasyon Testleriyle Temel Doğruluk Oluşturma": beta.saasbook.info/table-of-contents
FGM

21

Tüm birim testlerinin eşit faydası yoktur. Birim testinin faydası, başarısız olduğunda ortaya çıkar. Başarısızlık olasılığı ne kadar düşükse, o kadar az yararlıdır. Yeni veya yakın zamanda değiştirilen kodun, üretimde iyi bir şekilde test edilen nadiren değiştirilen koddan daha fazla hata içerme olasılığı daha yüksektir. Bu nedenle, yeni veya yakın zamanda değiştirilmiş kod üzerinde yapılan birim testlerinin daha faydalı olması daha olasıdır.

Tüm birim testlerinin maliyeti aynı değildir. Bugün kendinizi tasarladığınız önemsiz kodu, uzun zaman önce tasarlanmış bir başkasının karmaşık kodundan çok daha kolaydır. Ayrıca, geliştirme sırasındaki testler genellikle geliştirme süresini kısaltır. Eski kodlarda bu maliyet tasarrufu artık mümkün değildir.

İdeal bir dünyada, eski test kodlarını test etmek için gereken her zamana sahip olursunuz, ancak gerçek dünyada, bir noktada eski kodlara birim testlerini eklemenin maliyetlerinin faydalarından ağır basacağının bir nedeni vardır. Hile bu noktayı tanımlamaktır. Sürüm kontrolünüz, en son değiştirilen ve en sık değiştirilen kodu göstererek size yardımcı olabilir ve bunları birim testine sokarak başlayabilirsiniz. Ayrıca, değişiklikleri ilerlettiğinizde, bu değişiklikleri ve yakından ilgili kodu birim testine alın.

Bu yöntemi izleyerek, en yararlı alanlarda nihayetinde oldukça iyi bir kapsama sahip olacaksınız. Bunun yerine aylar gelir getirici faaliyetlere devam etmeden önce birim testleri yapmak için harcıyorsanız, bu arzu edilen bir yazılım bakım kararı olabilir, ancak bu kötü bir iş kararıdır.


3
Kod nadiren başarısız olursa, gerçek hayatta asla oluşamayabilecek gizli meseleleri bulmak için çok zaman ve çaba harcanabilir. Öte yandan, kod buggy ve hataya açıksa, muhtemelen her yerde test etmeye başlayabilir ve sorunları hemen bulabilirsiniz.
Robbie Dee,

8

Test eklemek iyi bir fikir midir?

Kesinlikle, kodun temiz ve iyi çalıştığına ve modern teknikler kullandığına ve sadece birim testlerine sahip olmadığına inanmak biraz zor olsa da. Ayrı bir çözümde oturmadıklarından emin misin?

Her neyse, kodu genişletecek / koruyacaksanız, gerçek birim testleri bu işlem için paha biçilmezdir.

Öyleyse, böyle bir şeye nasıl başlanır?

Adım adım. Ünite testlerine aşina değilseniz, biraz öğrenin. Kavramlar konusunda rahat edince, kodun küçük bir bölümünü seç ve testler yap. Sonra bir sonraki ve bir sonraki. Kod kapsamı, kaçırdığınız noktaları bulmanıza yardımcı olabilir.

İlk önce test etmek için tehlikeli / riskli / hayati olan şeyleri seçmek en iyisidir, ancak ilk önce bir oluğa girebilmek için doğrudan ileriye dönük bir şeyi test etmekte daha etkili olabilirsiniz - özellikle de / ekip kod koduna ve / veya üniteye alışkın değilseniz test yapmak.


7
"Ayrı bir çözümde oturmadıklarından emin misin?" bu harika bir soru. Umarım OP bunu görmezden gelmez.
Dan Pichelman,

Maalesef hiç şansımız yok, başvuru TDD'nin çekiş kazandığı gibi yıllar önce başladı, bu nedenle amaç bir noktada testler yapmaktı, ancak bir nedenden ötürü proje başladıktan sonra asla başaramadı.
Paul

2
Muhtemelen asla başaramamışlardır çünkü onlara değmeyecek fazladan zaman alacaktı. Tek başına çalışan iyi bir geliştirici, otomatik testler olmadan nispeten büyük boyutta temiz, net, iyi organize edilmiş ve çalışan bir uygulama oluşturabilir ve genellikle bunu testlerde olduğu gibi daha hızlı ve hatasız bir şekilde yapabilir. Hepsi kendi başından beri, birden fazla geliştiricinin yarattığı durumla karşılaştırıldığında, hata veya örgütsel sorunların olasılığı daha düşüktür.
Ben Lee,

3

Evet, test yaptırmak iyi bir fikirdir. Var olan kod temeli çalışmalarının amaçlandığı şekilde belgelenmesine ve beklenmeyen davranışların yakalanmasına yardımcı olurlar. Testler başlangıçta başarısız olsa bile, izin verin ve daha sonra kodu tekrar gözden geçirin, böylece istenildiği gibi geçip davranırlar.

Küçük sınıflar (bağımlılığı olmayan ve nispeten basit olanlar için) testlerine başlayın ve daha büyük sınıflara geçin (bağımlılıkları olan ve daha karmaşık olanlar). Uzun bir zaman alacaktır, ancak sonunda kodbaseini olabildiğince kapatabilmeniz için sabırlı ve ısrarcı olun.


Gerçekten iyi çalışan bir programa başarısız testler ekler misiniz (OP diyor?)?
MarkJ

Evet, çünkü bir şeyin amaçlandığı gibi çalışmadığını ve daha fazla gözden geçirme gerektirdiğini gösteriyor. Bu, tartışmaya yol açacak ve umarım yanlış anlamaları veya önceden bilinmeyen hataları düzeltecektir.
Bernard,

@Bernard - veya testler, kodun ne yapması gerektiğini yanlış anladığınızı gösterebilir. Gerçekten sonra yazılan testler, orijinal niyetleri doğru bir şekilde kapsamadığı riski taşımaktadır.
Dan Pichelman

@DanPichelman: Kabul ettin, ancak bu testlerden birini yazmaktan vazgeçmemelidir.
Bernard,

Başka bir şey değilse, kodun savunmada yazılmadığını gösterir.
Robbie Dee,

3

Tamam, tam tersi bir fikir vereceğim.

Mevcut, çalışan bir sisteme testler eklemek, bu sistemi değiştirecek, bu olmadığı sürece, sistem baştan alaycı olarak yazılmıştır. Şüpheliyim ki, sahte bileşenlerinizi içine yerleştirebileceğiniz kolay tanımlanabilir sınırlarla tüm bileşenlerin iyi bir şekilde ayrılması mümkündür. Ama değilse, o zaman işleri önemli şekilde kırabilecek oldukça önemli (nispeten konuşulan) değişiklikler yapmalısınız. En iyi durumda, bu testleri yazmak için çok zaman harcayacaksınız, bunun yerine ayrıntılı tasarım belgeleri, etki analizi belgeleri veya çözüm yapılandırma belgeleri yükleyerek daha iyi harcayabileceğiniz zaman. Ne de olsa patronun istediği iş, birim testlerinden daha fazlasını yapmak. Öyle değil mi?

Neyse, herhangi bir birim sınaması eklemeyeceğim.

Hiçbir şeyi değiştirmeden makul bir kapsam sağlayacak dış otomatik test araçlarına odaklanacağım. Ardından, değişiklik yapmaya geldiğinizde, o zaman kod tabanına birim testleri eklemeye başlayabilirsiniz.


2

Sık sık bu duruma rastladım, yeterli test kapsamı olmadan veya hiç test kapsamı olmadan geniş bir kod tabanını miras aldım ve şimdi işlevsellik eklemek, hataları düzeltmek vb.

Benim tavsiyem, eklediklerinizden emin olmak ve test etmek ve mevcut kodtaki hataları giderir ya da durumları değiştirirseniz, yazar test eder. Bir şeye dokunmanız gerekiyorsa, bu noktada testler yazınız.

Bu bozulma olduğunda, mevcut kod ünite testi için iyi bir şekilde yapılandırılmadığında, küçük değişiklikler için testler ekleyebilmeniz için çok fazla zaman harcarsınız.

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.