Uygulamaları devralırken zaten çalışan kod için birim testleri yazarken herhangi bir değer var mı?


27

Açıkçası bazı eski uygulamalar, ilk etapta yazıldığı için ünite testi yapmak zor olamaz veya çok zor olabilir.

Ancak bazı yerlerde, muhtemelen birim testine tabi tutulabilecek bazı yardımcı yöntemler gibi, onlar için birim testlerini yazmam gerekir mi?

Demek istediğim, bir köpek gibi yazılabilirler, ancak mantığı karmaşık bir şekilde kırmakla birlikte, zaman testi olması gerektiği gibi çalıştığını kanıtlamıştır. Ünite sınamasına yalnızca yeniden faktoring diyorsam mı yoksa zamanım olduğunda onlar için birim sınaması mı yazmalıyım?

Bunu yaparken herhangi bir değer var mı?

Metod tanımının belirsiz olabileceğini ve bu metotlardan bazılarının belirli koşullarda ne yapması gerektiğini araştırmam gerekebileceğini de dikkate alın.


4
Kendinize bir iyilik yapın ve Eski Kodla Etkili Çalışmayı okuyun . Eğer bu ve diğer ilgili soruları cevaplamaya ayrılmış bir kitap varsa.
Rein Henrichs

Yanıtlar:


15

Bence kesinlikle uygulama için mümkün olduğunca çok sayıda test yazmalısınız. Kod tabanını öğrenmenize ve sizi nihaî refactoring veya yeni gelişime hazırlamanıza yardımcı olacaktır.

Bu senaryoda yazabileceğiniz birkaç test türü vardır, her birinin kendi yararı vardır. Bu testleri yazmak, uğraştığınız uygulama hakkında size çok şey öğretecektir.

Her şeyden önce, doğruluk için yazma testleri koymadan önce , doğru ya da yanlış olsun, şu anki davranışı yakalayan testleri yazın . Köşe kasalarındaki veya programın çalıştırılmasıyla kodun ayrıntılı bir şekilde test edilmediği kısımlarındaki hataları ortaya çıkaracaksınız oldukça güvenli bir bahis. Kodun ne yapması gerektiği konusunda endişelenmeyin, sadece yaptığı şeyi yakalayın. İlerlerken, çıktının ne olacağını bulmak için kodu okumak veya ciddi zaman harcamak konusunda endişelenmeyin. Testinizi çalıştırın ve bu çıktıyı bir assert ile yakalayın.

Bu size kodun nasıl çalıştığını ve ana ağrı noktalarının veya zayıf alanların nerede olabileceğinin anlaşılması için sağlam bir temel sağlayacaktır. Eğer böcekleri ortaya çıkarırsanız, daha sonra tamir etmeye değer olup olmadıklarına karar vermek ve bu kararları almak için güç kullanan insanlara yaklaşabilirsiniz.

Daha sonra, kodun kolayca test edilebilir olmayan bölümlerini kapsayan ancak iş akışlarını mümkün olduğu kadar test etmenin önemli olacağı birkaç büyük (kapsam dahilindeki) test yazabilirsiniz. Bu iş akışı testleri veya entegrasyon testleri , onlara nasıl bakmak istediğinize bağlı olarak, mevcut iş akışını etkileyebilecek yeni bir özellik eklenmesi gerektiğinde onları daha test edilebilir hale getirmek ve sizi korumak için bu iş akışlarını yeniden yapılandırmak için iyi bir temel sağlayacaktır.

Zamanla, size veya uygulamayı devralacak sonuncu kişiye yardım etmek için orada olan bir testler paketi oluşturacaksınız.


13

Birim testlerini sadece testler yerine teknik özellikler olarak görüyorum. Belirli bir durumda, bahsi geçen gerçek değer, yeni spesifikasyona uygunluk için herhangi bir değişiklik yapmadan önce bir birim testiniz yapıldığında ortaya çıkacaktır. Miras alınan kodu değiştirecekseniz, gördüğüm en iyi yöntem, işlevsellik için birim testlerinin yapılmasıdır, bu yalnızca bir güvenlik ağı getirmez, aynı zamanda belirli birimin ne yaptığı konusunda daha fazla netlik getirmemize yardımcı olur. Ayrıca sizi anlayabileceğiniz iyi bir araştırma yapmaya zorlayabilir. Bu yüzden benim almam, bir modülün birim testini bir değişiklik yapmadan önce yapmaktır.


Testleri çalışacak en üst dilde yazınız. Bir değişiklik yapmanın zamanını tahmin etmeniz istendiğinde, eksik testleri yazmak için gereken zamanı ekleyin. Değişikliği yapmak daha uzun sürebilir, ancak alana daha az böcek koyacaksınız.
kevin cline

8
 > Is there any value in writing unit tests for code that 
 > already works when inheriting applications?

NO . Tecrübelerime göre , üretim kodu yazıldıktan sonra birim testleri yazmak için kötü bir maliyet / fayda ilişkisi var, çünkü kodun ağır refaktör olmadan izole edilmiş bir şekilde test edilmesinin yollarını bulmak pek mümkün değil / zor . Teste dayalı geliştirmenin yararlarından biri, gevşek bir şekilde birleştirilmiş kod almanızdır. Eğer testleri daha sonra yazarsanız, kodun sıkı bir şekilde bağlanmış olması ihtimali yüksektir.

EVET , değişiklik yapmayı planladığınız fonksiyonlar için uygulama için Entegrasyon testleri yazabilirsiniz . Bu şekilde , değişikliklerinizi bir şeylere çarpıp bozmadığını görmek için regresyon testini yapabilirsiniz .

Kalite ve geliştirici bakış açısından EVET Testlere sahip olmak için değerlidir.

İş açısından HAYIR çünkü gerçek bir iş değeri elde etmek için zamana / paraya ihtiyacınız olmayan müşteriyi satmak çok zordur, ancak belirsizlikler iş değişikliklerinin işleri daha da kötüleştirmeyeceğine dair söz verir.


Bu durumda ünite testi yerine entegrasyon testleri için +1. Çok pragmatik tavsiye
gbjbaanb

5

Mümkünse, "zaten çalışan" mevcut kod için testler yazmak için daha fazla neden vardır . Test yoksa, şans kodun kokularla olgunlaşması ve iyileştirilmesi için kapsamlı yeniden düzenlemeler kullanması; Test paketi refactor için size yardımcı olacaktır. Hatta orijinal kod olmadığını ortaya çıkarabilir değil düzgün çalışması; Bir keresinde bir satış raporu üreten bir yöntem için bir test yazdığımı hatırladım ve bir şeylerin doğru hesaplanmadığını tespit ettim, böylece satışlar gerçekte olduğundan birkaç bin dolar daha fazlaydı ve beş yıl içinde kodun yapımda olduğunu kimse bilmiyordu. (Neyse ki, olayların gerçek finansal sonu değildi, sadece bir satış raporu tahmini).

Tabii ki, bu tavsiye sadece gerçekten geçerlidir olabilir testleri yazmak. Tecrübelerime göre, testleri olmayan bir kod temeli, testleri güçlendirmek için neredeyse imkansızdır, çünkü ilk önce testi destekleyecek kadar soyut olması için kod modüllerinin yarısını yeniden yazmak zorunda kalırsınız ve bunu yapamazsınız.


Neden gerçeği belirten bir oy kullandı?
Wayne Molina

4

Kesinlikle evet , çünkü birim testleri doğruluğunu onaylamamalı, sistemin gerçek davranışını karakterize etmelidir. Özellikle eski bir projede, gereksinimlerin çoğu gerçek davranışta dolaylı olarak kodlanmıştır.

Bu karakterizasyon, işlevselliğin temelini oluşturur. Davranış bir işletme açısından yanlış olsa bile, davranışı daha da azaltıyorsunuz. Eski bir projede çekiş kazanmak zor olabilir ve bu size daha da kötüye gitmeden ilerlemeniz için bir temel sunar.

Yani, yapabileceğiniz tüm ünite testlerini yazın. Test edilemeyen kod için, kodunuza "dikişler" ekleyerek bağımlılıkları ayırmak için kodunuzu yeniden ayarlayın; test etmek istediğiniz kodu, test etmek istemediğiniz koddan ayırabilirsiniz.

Birim testlerinin karakterizasyon testleri ve dikişleri gibi fikirleri, şiddetle tavsiye ettiğim bir kitap olan Michael Feathers'ın Eski Kodla Etkili Bir Şekilde Çalışmasının ana noktalarıdır .


2

Bu konuda kendimi çok düşünmüştüm, çünkü sistemimizde fena halde yazılan ve belgelenmemiş bir sürü belgelenmemiş yazı yazıyor, ancak eski kod çalışıyor.

İyi bir noktaya değindin:

Ünite sınamasına yalnızca yeniden faktoring diyorsam mı yoksa zamanım olduğunda onlar için birim sınaması mı yazmalıyım?

Gereksinimler değişirse, birim testleri yazmak en değerli olacağını düşünüyorum. Olmazsa, özellikle uygun testleri yazamadığınız için rahatsız olmazdım, çünkü tüm koşulları bilmiyorsunuz.

ne zaman vaktim var?

Öncelik verildiğinde zamanın var, değil mi? :)


1

Daha önce bir üretim uygulamasında kullanılmamış olan bu kod tabanının özelliklerinden yararlanmaya mı çalışıyorsunuz? Önce bu senaryolar için birim testleri yazın. Buradaki işinize öncelik verebilmeniz gerekiyor ve bence Ünite Testi Sanatı'nın bu konuda bazı önerileri var (özellikle eski kod tabanlarını test etmeye nasıl yaklaşacağınız).


1

Her şeyin sadece uygulama çalıştığı ve çalıştığı için çalıştığını varsaymayın ... tipik olarak, "zaman testi" yalnızca a) kusurların kalanını henüz bulamadığınızı veya b) bulduklarınızı gösterir. onları bildirmediler. (Ya da belki her ikisi de.) Muhtemelen şimdi çalışan kod bile bir sonraki değişiklik yapmanız gerektiğinde çalışmayabilir.

Birim testleri, belirli işlevselliklerin bozulmadan kaldığına dair bir ölçü verirken, makul miktarda vaka için bunu göstermenin bir yolunu sunar. Tek bir hata düzeltmesi için bile, "bunu dürtün ve test et" den çok daha değerli. (Etrafta dolaşmak, entegrasyon veya sistem testinin eşdeğeri gibidir, bu nedenle, uygulamanın manuel olarak test edilmesi, yalnızca birim testlerden daha fazlasını kapsayabilir, ancak bu hala verimsiz bir şekilde harcanan zamandır. onları elle yapmaktan daha iyidir.)

Kod değiştirirken, ister tamir olsun ister yeniden düzenleyin, kesinlikle testler yazmalısınız. Yapabildiğiniz gibi testler yazmak iyi olabilir, bir dahaki sefere zaman kaybetmekten başka bir sebep olmazsa bir hatayı düzeltmek zorunda kalırsanız (ve bir dahaki sefere). bu zamanı, yazılımı her zaman hatasız olarak kabul eden kişilerin beklentilerine karşı dengelemek zorundadır ve bu nedenle gelecekteki bakım için harcanan zaman "boşa harcanır". (Bu, mevcut programları görmezden gelmeniz gerektiği anlamına gelmez.) Bir noktada, bunu yaparsanız, eski uygulamalarda test etmenin değerini göstermeye başlayabileceğiniz ve harcamanıza yardımcı olabilecek yeterli kapsamınız olacak Gelecekteki uygulamalarda o zaman, ki bu daha sonra üretken gelişim için harcanan zamanı boşa harcamalıdır.


0

Lala-land kalbimden, evet diyeceğim ve sadece bu değil, hackleyin, yeniden düzenleyin ve test etmeye devam edin, ancak diğer önemli projelerde geride kalmayacağınızdan emin olun. Çalışan bir programcı olarak, İşiniz risk altındaysa veya bir yönetici size mülkiyeti almanızı söyledi ise, evet. Ekip veya şirket zarar görebilirse, şirketi felaketten korumak için test yapmak için gerekli olduğunu bilmesi için yöneticinizle görüşün. Endişelenme diyorsa, o zaman kancadan çıkmışsın (zorunlu olarak, delegasyonu suçlamak bir yönetim becerisidir, o yüzden kancanın dışında olduğundan emin ol ... gerçekten!)

İyi şanslar!

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.