Birim testleri eklemek iyi bilinen eski kodlar için anlamlı mı?


21
  • TDD anlamında birim testlerinden bahsediyorum . (Otomatikleştirilmiş "entegrasyon" veya test olarak adlandırmayı sevdiğiniz şey değil.)
  • Eski kod olduğu gibi: (C ++) testler olmadan kod. (bakınız: Michael Feathers'ın Eski Kodla Etkili Çalışması )
  • Ancak şu şekilde olduğu gibi eski kod: Kodumuzun son 10-5 yıldır birlikte çalıştığı kodlar, bu yüzden bir şeyi değiştirmek için işleri nereye koyacağımızla ilgili çok iyi bir fikre sahibiz.
  • Daha sonra gelen ya da ünite testlerine (doğal uygulamaya özel kaplar, sicim, ağ yardımcıları, vb.) Uygun bir "doğal" olan bazı modüller için birim testler yapıyoruz (Boost.Test yoluyla ).
  • Henüz uygun otomatik kabul testlerine sahip değiliz.

Şimdi, son zamanlarda kullanıcılara yönelik 3 yeni özellik uygulamak için "zevk" aldım.

Bunların her biri, değiştirmem gereken kod parçalarını hızlandırmak için yaklaşık 1-2 saat, değiştirmem gereken (küçük) kodu uygulamak için 1-2 saat ve uygulamanın yapıldığından emin olmak için 1-2 saat daha aldı. Daha sonra doğru koştu ve yapmak gerekiyordu.

Şimdi, gerçekten küçük bir kod ekledim. (Her özellik için bir yöntem ve birkaç çağrı hattı olduğunu düşünüyorum.)

Bu kodu düzeltmek ( WEwLC'de önerilen yöntemlerden herhangi biriyle ), böylece bir birim testinin mantıklı olacağı (ve tam bir totoloji değildi) daha fazla olmasa bile 2-4 saat daha kolayca alabilecekti. Bu, her bir özelliğe, anında bir faydası olmadan,% 50 -% 100 zaman kazandıracaktır.

  1. Kod hakkında bir şey anlamak için birim testine ihtiyacım yoktu
  2. Manuel test, aynı miktarda çalışmadır, çünkü kodun uygulamanın geri kalanına doğru şekilde entegre edilip edilmediğini test etmem gerekir.

, Verilen eğer sonradan, "birisinin" gelip kod, o dokundu, teorik olarak bu birim testinden bazı yarar olabilir. (Sadece teorik olarak, test edilen kod adası olarak denenmemiş bir kod okyanusunda yaşayacaktır.)

Bu nedenle, "bu sefer" bir birim testi eklemek için çok çalışmamayı seçtim: Teste girenleri test etmek için kod değişiklikleri, özelliği doğru (ve temiz) bir şekilde uygulamak için kod değişikliklerinden önemli ölçüde daha karmaşık olurdu .

Bu güçlü bir şekilde bağlanmış eski kod için tipik bir şey mi? Tembel miyim / ekip olarak yanlış öncelikleri belirliyor muyuz? Yoksa, sadece ek yükün çok yüksek olmadığı şeyleri test etmek konusunda ihtiyatlı mıyım?


Ya başka bir bölüm "iyi bilinen eski kodunuzu" devralacaksa? Oradakiler ne yapacak?
Alex Theodoridis

Yanıtlar:


18

Bu durumlar hakkında pratik olmalısın. Her şeyin bir işletme değeri olması gerekir, ancak işletme, teknik çalışmanın değerinin ne olduğuna karar vermeniz için size güvenmelidir. Evet, birim test yaptırmanın her zaman bir faydası vardır, ancak bu fayda harcanan zamanı haklı çıkarmak için yeterince büyük mü?

Her zaman yeni kod üzerinde tartışırdım , ancak eski kodda, bir karar vermeniz gerekir.

Sık sık bu kod alanında mısınız? Sonra sürekli iyileştirme için bir durum var. Önemli bir değişiklik mi yapıyorsunuz? Sonra zaten yeni bir kod olduğu bir durum var. Ancak, karmaşık bir alanda muhtemelen bir yıl boyunca tekrar dokunulmayacak tek satırlık bir kod yapıyorsanız, elbette, yeniden yapılanmanın maliyeti (riskten bahsetmemek) çok fazla. Sadece bir satır kodunuzu girin ve hızlıca bir duş alın.

Genel kural: Her zaman şöyle bir düşünün, " Ben bu teknik işten iş faydaları daha ben onlar hangi sonucu gecikmiş olacak istedi işten daha yapması gerektiğini hissediyorum inanıyor musunuz? "


İyi bir kod parçası nedir? İyi tasarlanmış, test edilmiş, belgelenmiş ve gelecekteki kanıtı olan biri veya parasını ödediğiniz biri mi? Her zamanki gibi: iyi olabilir ; alabilirsin ucuz ; senin olabilir hızlı . Herhangi iki tanesini seç, üçüncü olan senin paran.
Sardathrion - Monica, 24:11

2
"Ben her zaman yeni kod üzerinde tartışmak" ... "yeni kod" eski bir kod temeli veya "yeni yeni kod"? :-)
Martin Ba

pdr'nin doğru fikri var. Bu bir mühendislik kararı (takasla). Genellikle büyük miktarda onaylanmış bir kodunuz varsa, onu yalnız bırakmak iyi bir fikirdir. TDD'nin eski kodu üzerinde bir TDD çabası gördüm (sadece bir yıl, ama bu yeterli) aylar süren maliyetlerle sonuçlandı ve sadece TDD refaktörünün getirdiği hatalar giderilinceye kadar aylarca para harcamak ve eski bir uygulamayı kırmakla sonuçlandı. Kod / özellik yapılır ve test edilirse, zaten zaten bildiğiniz bir şeyi (işe yaradığını) söylemek için enstrümantasyon (TDD) eklemeyi bırakmayın.
anon

10

TDD anlamında birim test kazanımı, yıllarca süren istikrarlı bir ekip tarafından yapılan sözlü geleneğe ihtiyaç duymadan kendi başına duran bir şey elde etmektir.

Aynı takımın uzun süredir aynı projede yer alması büyük bir şans. Ancak bu sonuçta değişecek. İnsanlar hastalanır, sıkılır veya terfi eder. Hareket ederler, emekli olurlar veya ölürler. Yenileri yeni fikirlerle gelir ve her şeyi okulda öğrendikleri gibi yeniden denemeye isteklidir. Şirketler satılır ve satın alınır. Yönetim politikaları değişir.

Projenizin devam etmesini istiyorsanız, onu değişikliklere hazırlamak zorundasınız.


3

Ünite testleri yazmak, kodunuzu gelecekte ispatlamaktır. Kod tabanının testleri yoksa, tüm yeni özellikler için yeni testler eklemelisiniz, çünkü kodun bu kısmını biraz daha sağlam kılar.

Test ekleme, hatta eski kodda bile orta ve uzun vadede faydalıdır. Şirketiniz orta veya uzun vadede umursamıyorsa, başka bir şirket ararım. Ayrıca, manuel olarak test etmenin, belirli bir birim testi yazmaktan daha uzun süreceğini sanmıyorum. Eğer öyleyse, o zaman test yazma üzerine odaklanmış kata kodunu uygulamanız gerekir.


1
Ama ama ama! :-) Bu özellik, yeni bir özellik uygulamak için gereken zaman içindeki% 100 artışa karşılık gelmeli . O mu değil müteakip özelliklerini uygulamak için gereken süreyi azaltır. Bu olabilir şeyler değiştirirken gereken süreyi azaltır.
Martin Ba

3
Kodun bu alanındaki değişikliklerin yeni hatalar ortaya koymadığından, yeni (daha az deneyimli kullanıcılar) kodu açıkça anlayabildiğinden ve bu bölgeyi etkileyen yan etkilerin sürüm yerine test sırasında öksürdüğünden emin olmaktasınız. saati. Sınama yardımı, kodun daha sonra özellikler eklemeyi kolaylaştırmadığı şeyi yaptığını doğrular. Test ekleme, hatta eski kodda bile orta ve uzun vadede faydalıdır . Şirketiniz orta veya uzun vadede umursamıyorsa, başka bir şirket ararım.
Sardathrion - Monica, 24:11

1
@ Martin, çünkü ne yaptığınız açıkça, özelliğin ne olması gerektiğini düşündüğünüzü kodlayın ve ardından gönderin. Hiçbir aşamada test yapılmaz ... hayır, bekle. Geliştiriciler olarak, kodumuzu (en azından el ile) yapılmadan önce test ediyoruz. "El ile" yerine "otomatik bir test yazarak" değiştirmek zaman içinde% 100 artış değildir. Sık sık, yaklaşık aynı zamanda alındığını anlıyorum.
Kaz Ejderha

1
@Kaz - "El ile" yerine "otomatik bir test yazarak" zamanın% 100 oranında bir artış değil. Sık sık, aynı zamanda yaklaşık alındığını düşünüyorum. " - YMMV, fakat kod tabanım için, bu açıkça yanlış (soruda belirtildiği gibi).
Martin Ba

3
@Kaz: Demek istediğim :-) şuydu: Bir birim testi kodumu yalıtımlı olarak test ediyor. Bir birim testi yazmazsam, kodu yalıtımlı olarak test etmem, ancak yalnızca kod doğru çağırıldığında ve uygulamada istenen sonucu ürettiğinde. Bu iki nokta (doğru olarak adlandırılan ve ne yapması gerekiyorsa), yine de test etmem gerekiyor (manuel olarak) ve bir birim testinin kapsamına girmiyor. Ve birim testi bu iki noktayı kapsamaz, ancak işlevimi yalıtılmış olarak "sadece" test eder. (Ve bu birim test testleri ek olacak ve görebildiğim kadarıyla hiçbir şey ile dengelenmeyecekti.)
Martin Ba

2

Kesinlikle en iyi uygulamalar, değiştirdiğiniz herhangi bir kodu test etmenizi zorunlu kılar. Ancak gerçek dünya kodlaması birçok uzlaşmayı içerir, zaman ve materyaller sınırlıdır.

Yapmanız gereken, maliyeti sabitlemek ve ünite testleri olmadan değişiklik yapmak açısından maliyeti değerlendirmektir. Daha sonra bu testleri oluşturma yatırımına karşı değerlendirebilirsiniz. Birim testleri gelecekteki işlerin maliyetini büyük oranda düşürür ancak şimdi bir bedeli vardır.

Alt satırda, sisteminiz nadiren değiştirilirse, birim testlerini yazmaya değmeyebilir, ancak düzenli değişikliklere tabi ise, buna değecektir.


1

Test yapmamak için bu küçük rasyonel kararların hepsi, birileri ayrıldığında ve yeni bir işe girip hızlanmak zorunda kaldıklarında, sizi rahatsız etmek için geri gelecek olan zorlu bir teknik borç oluşturmaktır.

Evet, birim testlerini yazmak 2-3 saat daha mal olabilir, ancak kod testten geri gönderilirse, her şeyi tekrar manuel olarak test etmeniz ve testinizi yeniden belgelemeniz gerekir - öyle değil mi? Aksi halde, ne test ettiğinizi ve hangi değerleri kullandığınızı bilen var mı?

Birim testler, kodun beklenen davranışını belgeleyerek, işlevselliği kontrol etmek için kullanılan test verilerinin belgelenmesini sağlar ve yeni kodlayıcılara değişiklik yaparken hiçbir şeyi kırmadıklarına dair makul bir güven verir.

Bugün manuel testten çok birkaç saat maliyeti vardır, ancak daha sonra kodun kullanım ömrünün üzerinde saatlerce tasarruf yaptığınız her seferde test yaparsınız.

Ancak, kodun birkaç yıl içinde emekli olacağını biliyorsanız, tüm söylediklerimi değiştirdim çünkü koda test etmeyi bitirmeyeceksiniz ve asla geri ödeme yapmayacaksınız.


"ve testinizi tekrar belgeleyin - öyle değil mi?" - {alaycı şapka giyer:} Tabii ki değil. Biz geliştirici peri ülkesinde değiliz. Malzeme uygulanır ve test edilir ve gönderilir. Daha sonra kırılır ve sabitlenir, test edilir ve gönderilir.
Martin Ba

Birim test sayısından bağımsız olarak her şeyin manuel olarak test edilmesini umuyorum. Otomatik kabul testleri tamamen başka bir konudur. Ancak daha sonra kabul testleri kod temeli mirası nedeniyle daha da zorlaştırılmaz, burada kapsam dışıdır.
pdr

2
mcottle - Hayati bir noktanız eksik . Birim testleri olmaz bitmiş özelliğinin "manuel İşlevsellik testini" yapmak için gerekli süreyi azaltır. Ben hala tıklama mümkün girdilerin ihtiyatlı alt kümesi ile ilgili tüm diyaloglar bunu yapmak gerekeni yapar inşa olarak emin fiili bitmiş uygulamayı yapmak zorunda. (Bunu hibe teorik olarak birim testleri yalnızca bir döngü bu manuel test döngüsünü sınırlamak için yardımcı olabilir eğer ünite testleri emin ben sadece manuel test sırasında herhangi belirgin sorunu bulamazsınız olun.)
Martin Ba

0

Birim testlerinin değeri, yalnızca geliştirildiğinde yeni bir özelliği test etmekten ibaret değildir. Birim testlerin yararı, çoğunlukla gelecekte kazanılmaktadır.

Evet, ne harcamak zorunda kalabilirsiniz görünüyor eski kod test edilebilir hale getirmek için zaman aşırı miktarda gibi.

Ancak, yapmazsanız, kesinlikle veya kesinlikle yapmanız gerekir , özelliği sınamak için çok, çok, daha fazla saat harcayacaksınız. Sadece ilk geliştirmesinde değil, yazılımınızın her yeni sürümünde. Birim testler olmadan ve diğer otomatik test formları olmadan, başka bir seçeneğiniz yoktur, ancak bu özelliğin kendisi değişmemiş olsa bile, özelliğinizin yanlışlıkla bozulmaması için saatlerce manuel test yapmanız gerekir.


1
"Birim testleri olmadan, bu özelliğin kendisi değişmemiş olsa bile, özelliğinizin yanlışlıkla bozulmamasını sağlamak için başka bir aracınız yok." - Ünite testleri yardımcı olmaz. İçin gerçekten emin olmak , ben otomatik entegrasyon / kabul testlerini sahip olurdu.
Martin Ba

Evet, ünite testleri sadece ilk adımdır. Açıklığa kavuşturmak için düzenlenmiş cevap
Marjan Venema 24:11
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.