TDD gerçekten karmaşık projeler için çalışıyor mu?


53

TDD projeleri sırasında yaşadığım problemlerle ilgili bu soruyu soruyorum. Birim testleri oluştururken aşağıdaki zorlukları farkettim.

  • Sahte veri oluşturma ve sürdürme

Büyük alay verilerini korumak zor ve gerçekçi değil. Veri tabanı yapısı değişime uğradığında daha da zordur.

  • GUI testi

MVVM ve GUI'yi test etme becerisiyle bile, GUI senaryosunu yeniden oluşturmak çok fazla kod alır.

  • İşi test etmek

TDD'nin basit bir iş mantığıyla sınırlarsanız iyi çalıştığını biliyorum. Ancak karmaşık iş mantığını test etmek zordur, çünkü testlerin kombinasyon sayısı (test alanı) çok fazladır.

  • Gereksinimlerde çelişki

Gerçekte, analiz ve tasarım altındaki tüm gereklilikleri yakalamak zordur. Çoğu zaman bir not gerekliliği, proje karmaşık olduğu için çelişkilere yol açmaktadır. Çelişki uygulama aşamasında geç bulunur. TDD, gereksinimlerin% 100 doğru olmasını gerektirir. Bu gibi durumlarda, testlerin yaratılması sırasında çelişkili şartların yakalanması beklenebilir. Ancak sorun şu ki, karmaşık senaryolarda durum böyle değil.

Bu soruyu okudum: TDD neden çalışıyor?

TDD gerçekten karmaşık işletme projeleri için mi çalışıyor yoksa proje türüyle sınırlı mı?


+1 Bu soruyu okuduktan sonra aynı soruyu yaşadım - Sahte verilerle aynı problemle sınırlı bir anlamda kullanıyorum.
Michael K

20
"TDD, gereksinimlerin% 100 doğru olmasını gerektirir" ve "gereksinimler", "bu tek yöntemin nasıl çalışması gerektiğini bilmem gerekir" anlamına gelir. Ve eğer yöntemin nasıl çalışması gerektiğini bilmiyorsanız, onu nasıl uygulamanız gerekiyor?
Frank Shearar

@ FrankShearar: Yöntemin beklenen girdi üzerinde nasıl çalışması gerektiğini biliyorsunuz. Diyelim ki strcmp, hiçbiri nullptr olmayan ve ikisi de geçerli olmayan 2 işaretçi almalıdır. Kötü işaretçiyi beslediğinizde ne olacağını bilmiyorsunuz. Belki bazı mimarilerde AV yakalayabilir ve akıllıca bir şeyler yapabilirsiniz, ancak böyle bir senaryonun mümkün olduğunu hayal edemezsiniz, bu yüzden testleriniz bunu kapsamıyor.
Kodlayıcı

7
TDD'nin büyük projeler için işe yarayan tek şey olduğunu söyleyebilirim! Proje büyüdükçe etkileşimler ne kadar karmaşıklaşır ve rasgele değişiklikler o kadar fazla değişir - yalnızca TDD devam edebilir
Martin Beckett

2
Gerçekte, TDD ile ilgili ihtiyaç değişiklikleri açısından harika olan şey, ihtiyaçlar değiştiği zaman, sadece bu gereksinim için yeni bir test yazabilir ve projenin geri kalanının hiçbirini bozmayacağından emin olabilirsiniz. Zaten yazılı bir sınavınız olmasaydı, yaptığınız değişikliğin başka hiçbir şeyi bozmadığından emin olmak için sınavlar yazmanız gerekirdi. Ayrıca, hata düzeltmeleri için seviyorum. TDD'yi kullanarak her şeyi geliştirmemiş olsanız bile, hatayı düzeltmek için kullanın: Hatayı yeniden üreten bir test yazın, ardından hatayı düzeltin ve testi tekrar çalıştırın.
Jordan Reiter,

Yanıtlar:


53

Büyük alay verilerini korumak zor ve gerçekçi değil. Veri tabanı yapısı değişime uğradığında daha da zordur.

Yanlış.

Birim testi "büyük" sahte veri gerektirmez. Senaryoları test etmek için yeterince sahte veriye ihtiyaç var ve daha fazlasını değil.

Ayrıca, gerçekten tembel olan programcılar konu uzmanlarından çeşitli test vakalarının basit elektronik tablolarını oluşturmalarını ister. Sadece basit bir elektronik tablo.

Sonra tembel programcı, elektronik tablo satırlarını birim test durumlarına dönüştürmek için basit bir komut dosyası yazar. Gerçekten çok basit.

Ürün geliştiğinde, test senaryolarının elektronik tabloları güncellenir ve yeni birim testleri oluşturulur. Her zaman yap. Gerçekten çalışıyor.

MVVM ve GUI'yi test etme becerisiyle bile, GUI senaryosunu yeniden oluşturmak çok fazla kod alır.

Ne? "Yeniden"?

TDD'nin amacı, Test Edilebilirlik için şeyler tasarlamaktır (Test Sürüşü Geliştirme). Eğer GUI bu kadar karmaşıksa, daha basit ve daha test edilebilir olması için yeniden tasarlanması gerekir. Daha basit, daha hızlı, daha sürdürülebilir ve daha esnek demektir. Ancak çoğunlukla daha basit, daha test edilebilir demektir.

TDD'nin basit bir iş mantığıyla sınırlarsanız iyi çalıştığını biliyorum. Bununla birlikte, karmaşık iş mantığını test etmek zordur, çünkü test kombinasyonunun sayısı (test alanı) çok fazladır.

Bu doğru olabilir.

Bununla birlikte, konu uzmanlarından çekirdek test vakalarını basit bir biçimde (bir elektronik tablo gibi) sağlamalarını istemek gerçekten yardımcı olur.

Elektronik tablolar oldukça büyük olabilir. Ama sorun değil, elektronik tabloları test senaryolarına dönüştürmek için basit bir Python betiği kullandım.

Ve. E-tablolar eksik olduğu için bazı test durumlarını manuel olarak yazmak zorunda kaldım.

Ancak. Kullanıcılar "hatalar" bildirdiğinde, elektronik tabloda hangi test durumunun yanlış olduğunu sordum.

O anda, konu uzmanları elektronik tabloyu düzeltecek veya ne olması gerektiğini açıklamak için örnekler ekleyecekti. Hata raporları - çoğu durumda - açıkça bir test durumu sorunu olarak tanımlanabilir. Gerçekten de, deneyimlerime göre, hatayı kırık bir test durumu olarak tanımlamak tartışmayı çok daha basit hale getirir.

Uzmanların dinlemesinden ziyade, süper karmaşık bir iş sürecini açıklamaya çalışmak yerine, uzmanlar sürecin somut örneklerini üretmek zorunda.

TDD, gereksinimlerin% 100 doğru olmasını gerektirir. Bu gibi durumlarda, testlerin yaratılması sırasında çelişkili şartların yakalanması beklenebilir. Ancak sorun şudur ki, karmaşık senaryoda bu böyle değildir.

TDD kullanmamak kesinlikle gereksinimlerin% 100 doğru olmasını zorunlu kılar. Bazıları, TDD'nin tamamlanmamış ve değişen gereklilikleri tolere edebileceğini, TDD dışı bir yaklaşımın eksik şartlarla çalışamayacağını iddia ediyor.

TDD kullanmazsanız, çelişki uygulama aşamasında geç bulunur.

TDD kullanıyorsanız , kod bazı testleri geçip diğer testleri geçemediğinde çelişki daha önce bulunur . Aslında, TDD size , uygulamadan çok önce (ve kullanıcı kabul testi sırasındaki argümanlar) işlemin başındaki çelişkilerin kanıtını verir .

Bazı testleri geçen ve bazılarında başarısız olan bir kodunuz var. Sadece bu testlere bakarsınız ve çelişkiyi bulursunuz. Uygulamada gerçekten çok iyi sonuç veriyor çünkü kullanıcılar artık çelişki hakkında tartışmalı ve istenen davranışa dair tutarlı, somut örnekler üretmelidir.


4
@ S.Lott OP, MVVM ile ilgili olarak WPF / SL hakkında konuşuyor olduğundan, GUI test yorumlarınız biraz kapalı. Ayrılma ve katı bir MVVM yaklaşımı olsa bile, tanımlara göre görünüm hala test etmek zordur. Bu herhangi bir UI ile. Görünümü Test Etmek, zaman alıcı, hantal ve düşük bir yatırım getirisidir. Bu noktada, M / VM'yi test eden ve V'yi göz ardı eden MVVM yüzeyleri ile ilgili argüman en iyi yaklaşım olabilir, ancak kontrollerin yerleştirilmesi, renklendirme vb. kompleksi.
Aaron McIver

3
@ S.Lott Bu kapsama bağlıdır. TDD, bir Görüntüyü test etmek için önemli bir değer sağlamaz. Ancak TDD, Model ve ViewModel testlerinde önemli bir değer sağlar. Kapsamınız ViewModel ve View ise, TDD'nin değeri kapsamınıza göre çok daha farklı olacaktır, daha sonra kapsamınız Model ve gerekli hizmetler ise. Beni yanlış anlama, TDD'nin karmaşık projeler arasında büyük bir değeri olduğuna inanıyorum ... değeri kapsamına göre değişir.
Aaron McIver

5
@Robert Harvey: Bu benim icadım olamaz. Bir şey icat edemeyecek kadar tembelim.
S.Lott

4
@Amir Rezaei: Minimal birim test verilerinizin karmaşık olduğu için özür dilerim. Bunun TDD ile ilgisi yok. Uygulamanız karmaşık. Hala test etmen gerekiyor, değil mi? Hala test verisi üretmelisin? TDD'yi takip etmeyecekseniz, nasıl test edilebilir bir uygulama yaratacaksınız? Şans? Umut? Evet. Bu karmaşık. Hiçbir şey karmaşıklığı ortadan kaldıramaz. TDD, bu karmaşıklığı gerçekten test edeceğinizi garanti eder.
S.Lott

4
@Amir Rezaei: "Biz gerçeklik için tasarlıyoruz". Test yazacak mısın? Eğer öyleyse, o zaman test edilebilirlik için tasarım yapın. Eğer test yazamayacaksanız, bir şeylerin nasıl çalıştığını nasıl bileceksiniz?
S.Lott,

28

Evet

TDD'ye ilk maruz kalmam, Linux tabanlı bir cep telefonu için ara katman bileşenleri üzerinde çalışıyordu. Sonunda, çeşitli açık kaynaklı bileşenler için yaklaşık 9 gigabaytlık kaynak kodu olarak adlandırılan, milyonlarca satırlık kaynak kodu satırı oluşmuştur.

Tüm bileşen yazarlarından hem bir API hem de bir dizi test önerisi sunmaları ve bir akran komitesi tarafından tasarım incelemeleri yapılmasını beklemekteydi. Kimse testte mükemmelliği beklemiyordu, ancak halka açık tüm fonksiyonların en az bir test yapması gerekiyordu ve bir bileşen kaynak kontrolüne sunulduktan sonra, tüm birim testlerinin her zaman geçmesi gerekiyordu (bile olsa bile, bileşen hatalı raporlama yapıyordu) tamam çalıştı).

Hiç şüphesiz en azından kısmen TDD'ye bağlı olarak ve tüm birim testlerinin daima geçmekte ısrarı nedeniyle, 1.0 sürümü erken, bütçe altında ve şaşırtıcı bir kararlılıkla geldi.

1.0 sürümünden sonra, kurumsal müşteri talepleri nedeniyle hızlı bir şekilde kapsamı değiştirmek istediğinden, TDD'yi bırakmamızı söylediler ve birim testlerinin geçmesi gerekliliğini kaldırdılar. Tuvaletin kalitesinin ne kadar hızlı düştüğü şaşırtıcıydı ve ardından program bunu takip ediyordu.


8
removed the requirement that unit tests pass. It was astonishing how quickly quality went down the toilet, and then the schedule followed it.- F1 sürücünüze Pit Stops'a izin vermediğini söylemek gibi bir şey çünkü çok fazla zaman alıyor ... Idiotic.
Jess Telford

1
Bu benim söylediklerimi örneklendirir: Hızlı gitmenin tek yolu iyi gitmektir !
TheCatWhisperer

18

Proje ne kadar karmaşıksa, TDD'den elde ettiğiniz faydayı o kadar fazla savunuyorum. Başlıca yararları, TDD'nin sizi daha küçük ve çok daha bağımsız parçalarda kod yazmaya zorlayacağının yan etkileridir. Anahtar faydaları:

a) Tasarımınızın onaylanmasından çok, çok daha erken bir onay alırsınız, çünkü geri bildirim döngüsü baştan itibaren yapılan testler nedeniyle çok daha sıkıdır.

b) Bitleri ve parçaları değiştirebilir ve sistemin nasıl tepki verdiğini görebilirsiniz, çünkü sürekli bir test kapsamı yorganı yaratıyorsunuzdur.

c) Tamamlanan kod sonuç olarak daha iyi olacaktır.


1
TDD'nin faydalarını görüyorum ve biliyorum. Ancak bu tür projelerde TDD yapmak için ne kadar gerçekçi ve ne kadar kaynağa ve bütçeye ihtiyaç duyulduğunu tartışıyorum.
Amir Rezaei

Seninle aynı fikirdeyim. Karmaşık projelerde (benim görüşüme göre) her şeyin testlerden daha iyi çalıştığından emin olmanın başka bir yolu yok ... Birçok programcı size göre çalışıyorsa, hiç kimsenin çalışmalarınızı değiştirdiğinden emin olamazsınız. Test devam ederse - sorun değil. Değilse nereye bakılacağını biliyorsunuz .
mhr

10

TDD gerçekten karmaşık projeler için çalışıyor mu?
Evet. Bana söylenilen her proje TDD ile iyi çalışmaz, ancak çoğu iş başvurusu iyidir ve saf TDD biçiminde yazıldığında iyi çalışmayanlara büyük sorun olmadan ATDD biçiminde yazılabilir.

Sahte veri oluşturma ve bakımını
küçük tutun ve yalnızca ihtiyacınız olana sahip olun; bu göründüğü gibi korkutucu bir konu değil. Beni yanlış anlama, bu bir acı. Ama buna değer.

GUI
Testi MVVM'yi test edin ve görünüm olmadan test edilebildiğinden emin olun. Bunu, başka herhangi bir iş mantığını test etmekten daha zor buldum. Görünümü kodumda test yapmıyorum, sadece test ediyorsunuz ancak bu noktada hızlı bir manüel test yaptığınızda hangisinin hızlı bir şekilde yakalanacağına dair bir bağlanma mantığı var.

İşletmeyi sınama
Bir sorun bulunamadı. Çok sayıda küçük testler. Yukarıda belirttiğim gibi, bazı vakalar (Sudoku bulmacası çözücüler popüler biri gibi gözüküyor) TDD yapmak zor gibi görünüyor.

TDD gereksinimlerin% 100 doğru olmasını gerektirir
Hayır, hayır. Bu fikri nereden aldın? Tüm Çevik uygulamalar, gereksinimlerin değiştiğini kabul eder. Yapmadan önce ne yaptığınızı bilmeniz gerekir, ancak gereksinimlerin% 100 olmasını istemekle aynı şey değildir. TDD, gereksinimlerin (Kullanıcı Hikayeleri), tanımı gereği% 100 tam olmadığı, Scrum'da yaygın bir uygulamadır.


Doğru bir gereksiniminiz yoksa, birim testlerine nasıl başlayabilirsiniz? Bir sprint ortasında uygulama ve tasarım arasında ileri ve geri atlıyor musunuz?
Amir Rezaei

Bir "birim" bir gereklilikten daha küçüktür ve evet, tüm UAC'leri bağlamadan genel olarak yapılabilir.
mlk

Her Birim Birim Testini ve ayrıca Birim Birim Test kombinasyonunu gerektiririz.
Amir Rezaei

9

Öncelikle, konunuzun TDD'den çok genel olarak ünite testleriyle ilgili olduğuna inanıyorum, çünkü söylediklerinizde gerçekten TDD'ye özgü (test-ilk + kırmızı-yeşil-refactor çevrimi) hiçbir şey göremiyorum.

Büyük alay verilerini korumak zor ve gerçekçi değil.

Sahte verilerle neyi kastediyorsunuz? Bir sahtekarlığın kesin olarak herhangi bir veri içermediği, yani testte ihtiyaç duyulan bir veya iki alandan başka bir alan bulunmadığı ve test edilen sistemden başka bir bağımlılık olmadığı varsayılmaktadır. Sahte bir beklenti veya geri dönüş değeri oluşturmak tek bir satırda yapılabilir, bu yüzden korkunç bir şey olmaz.

Veri tabanı yapısı değişime uğradığında daha da zordur.

Veritabanının nesne modelinde uygun değişiklikler yapılmadan değişikliklerden geçtiğini kastediyorsanız, kuyu birim testleri tam da sizi uyarmak için buradadır. Aksi taktirde, modelde yapılan değişiklikler açıkça birim testlerine yansıtılmalıdır, fakat derleme göstergeleri ile yapılması kolay bir şeydir.

MVVM ve GUI'yi test etme becerisiyle bile, GUI senaryosunu yeniden oluşturmak çok fazla kod alır.

Haklısınız, birim GUI'yi test etmek (Görünüm) kolay değildir ve birçok kişi onsuz iyi iş çıkarmaktadır (ayrıca GUI'yi test etmek TDD'nin bir parçası değildir). Bunun aksine, Controller / Presenter / ViewModel / ne olursa olsun ara katmanı tavsiye eden ünite testi, MVC veya MVVM gibi kalıpların temel nedenlerinden biridir.

TDD'nin basit bir iş mantığıyla sınırlarsanız iyi çalıştığını biliyorum. Ancak karmaşık iş mantığını test etmek zordur, çünkü testlerin kombinasyon sayısı (test alanı) çok fazladır.

Eğer iş mantığınız karmaşıksa, birim testlerinizin tasarımı zor olması normaldir. Bunları mümkün olduğunca atomik yapmak size kalmıştır, her testte test edilen nesnenin sadece bir sorumluluğu vardır. Birim testler karmaşık bir ortamda daha fazla ihtiyaç duyulur çünkü kodda değişiklik yaparken iş kurallarını veya gereksinimlerini ihlal etmemenizi garanti eden bir güvenlik ağı sağlarlar.

TDD, gereksinimlerin% 100 doğru olmasını gerektirir.

Kesinlikle hayır. Başarılı bir yazılım, gereksinimlerin% 100 doğru olmasını gerektirir;) Birim testleri, şu anda gereksinimler hakkındaki görüşünüzü yansıtır; vizyon hatalıysa, kodunuz ve yazılımınız da olacaktır, birim testleri veya değil ... Ve birim testlerinin parladığı yer: yeterince açık test başlıklarıyla, tasarım kararlarınız ve gereksinimler yorumlamanız şeffaflaşır, bu da işaret etmeyi kolaylaştırır Müşteriniz bir dahaki sefere değişmesi gerektiğinde parmağınızı "Bu iş kuralı istediğim gibi değil" demiştir.


6

Birisinin TDD'yi uygulamalarını test etmek için kullanmamasının sebebinin, başvurularının çok karmaşık olması nedeniyle şikayet ettiğini duyduğumda gülmem gerekiyor. Alternatif nedir? Test maymunları klavye dönümünde çarpıyor mu? Kullanıcılar test ediciler olsunlar mı? Başka? Tabii ki zor ve karmaşık. Intel, gönderilinceye kadar fişlerini test etmediğini düşünüyor musunuz? Bu nasıl bir "kuma kafa"?


5
Basit ve etkili bir kod yazan yüksek vasıflı, profesyonel çalışanlara sahip olmak. Ve test cihazları kullanın. Bu yaklaşım birçok başarılı şirkette işe yaradı.
Kodlayıcı,

Bir alternatif regresyon testidir. Bir web tarayıcısını test etmeyi düşünün. Google olduğunu ve Chrome'un yeni bir sürümünü test etmek istediğinizi varsayalım. Her bir CSS öğesini ve her HTML etiketinin her özelliğini ve JavaScript'in yapabileceği her türlü temel şeyi test edebilirsiniz. Fakat bu özelliklerin kaç olası kombinasyonu var? Kimsenin bunu bildiğini sanmıyorum. Bu nedenle, çeşitli özelliklerde her türlü özelliğin testini yaparlar, ancak sonuçta bilinen bir web bankasına karşı regresyon uygularlar. İşte milyon maymunlar orada.
Dan Korn

Gerçekçi alternatif, işe yaramayan bir yazılım sunmaktır; Doğru şartlar altında, bu hala karlı olabilir. Favori örneğini seç.
soru

4

TDD'yi (ve genel olarak ünite testini) ilgili bir nedenden dolayı neredeyse imkansız buldum: Karmaşık, yeni ve / veya bulanık algoritmalar. Yazdığım araştırma prototiplerinde en çok karşılaştığım konu, kodumu çalıştırmaktan başka doğru cevabın ne olduğu hakkında hiçbir fikrim olmadığı. Gülünç derecede önemsiz vakalardan başka bir şey için elle makul bir şekilde bulmak çok karmaşık. Algoritma sezgisel, yaklaşım veya determinizm içermiyorsa, bu özellikle doğrudur. Ben hala bu kodun dayandığı düşük seviyeli işlevselliği test etmeye çalışıyorum ve akıl sağlığı kontrolleri olarak ağır kullanıyoruz. Son çare test yöntemim, iki farklı kitaplık grubu kullanarak ideal olarak iki farklı dilde iki farklı uygulama yazmak ve sonuçları karşılaştırmak.


Bu problemi yaşadım. "Elle" çalışılan basit vakalara ve bir etki alanı uzmanı tarafından onaylanmış ve onaylanmış oldukça karmaşık bir vakaya ihtiyacınız var. Eğer kimse bunu yapamazsa, bir şartname probleminiz var. Algoritmik bir kabul fonksiyonunu kodlayabildiğiniz zaman, doğru şekil durum alanından
çıkmasa

"ve etki alanı uzmanı tarafından onaylanmış ve onaylanmış yeterince karmaşık bir durum" - O zaman bir birim testi mi, yoksa bir regresyon testi mi?
quant_dev

2
@Tim: Ben değilim (bir kişi genellikle alanı uzmanı ve programcı hem iş benim doğrultusunda) alanı uzmanı ve ben sanely elle bu şeyleri çalışamaz. Öte yandan, ben hemen hemen her zaman biliyorum yaklaşık cevabı ne olması gerektiği (örneğin, bir makine öğrenme algoritması oldukça doğru tahminlerde yapmalıdır, beslenen rastgele veriler hayır "ilginç" sonuçlar vermesi gerekir bir algoritma) ama bu otomatikleştirmek zordur. Ayrıca, araştırma prototipleri için neredeyse hiçbir zaman resmi bir şartname yoktur.
dsimcha

@quant_dev bu bir ünite testidir. Ünitenin davranışını daha karmaşık bir test veri setinde test eder. Regresyon testi için birim testlerini kullanabilirsiniz. Ayrıca yinelemelerini önlemek için oluştukları gibi hatalar için regresyon testleri yazmalısınız. (küme böcekleri güçlü kanıtlar var)
Tim Williscroft

@ dsimcha: bu nedenle, yaklaşık bir tahminde bulunabildiğiniz için birim testine istatistiksel bir yaklaşım sizin için işe yarayabilir. Bu yaklaşımı bir silah sisteminde hareketli hedefi seçmek ve hata ayıklamak, atıcı nişan kodunu taşımak için kullandım. Bunun için elle cevap vermek çok zordur, ancak öngörücünün işe yaradığını hesaplamak oldukça kolaydır (sanal olarak bir mermiyi ateşlersiniz ve nerede çarptığını görürsünüz, köpürür, durulayın, 100000 kez tekrarlayın ve "Algoritma" gibi güzel sonuçlar elde edin. Zamanın% 91'ini yapan AlgorithmB, zamanın% 85'ini kullanıyor.)
Tim Williscroft

4
> Does TDD really work for complex projects?

Tecrübelerime göre: Evet, Unittest'ler için (izolasyondaki modüllerin / özelliklerin test edilmesi) çünkü bunlar çoğunlukla bahsettiğiniz problemlere sahip değildir: (Gui, Mvvm, Business-Modell). Hiç birini en küçüğü doldurmak için 3 alay / taslak alamadım (ama alan adınız daha fazlasını gerektirir).

Bununla birlikte, TDD'nin BDD tarzı testlerle entegrasyon veya uçtan uca testte bahsettiğiniz sorunları çözüp çözemeyeceği konusunda emin değilim .

Ancak en azından bazı problemler azaltılabilir .

> However complex business logic is hard to test since the number 
> of combinations of tests (test space) is very large.

Entegrasyon testi veya uçtan uca test düzeyinde tam kapsama yapmak istiyorsanız bu doğrudur. En kapsamlı seviyede tam kapsama yapmak daha kolay olabilir.

Örnek: Karmaşık kullanıcı izinlerini kontrol etme

Fonksiyonu IsAllowedToEditCusterData()bir entegrasyon testi düzeyinde test etmek, kullanıcı, etki alanı, müşteri, çevre hakkında bilgi için farklı nesneler sormayı gerektirir.

Bu parçaları alay etmek oldukça zor. Bu, özellikle IsAllowedToEditCusterData()bu farklı nesneleri bilmeniz gerekiyorsa geçerlidir .

En Son Bir Seviyede IsAllowedToEditCusterData(), örneğin, fonksiyonun bilmesi gereken her şeyi içeren 20 parametre alan bir İşlev olacaktır . Yana IsAllowedToEditCusterData()bir alanlar bilmek gerekmez user, bir domain, bir customer, .... Bunu test etmek kolaydır vardır.

Uygulamam IsAllowedToEditCusterData()gerektiğinde iki aşırı yüküm vardı:

Bu 20 parametreyi almaktan başka hiçbir şey yapmayan ve ardından karar vermeyi gerektiren 20 parametre ile aşırı yükü çağıran bir aşırı yük.

(benim IsAllowedToEditCusterData()sadece 5 parametrem vardı ve tamamen test etmek için 32 farklı kombinasyona ihtiyacım vardı)

Örnek

// method used by businesslogic
// difficuilt to test because you have to construct
// many dependant objects for the test
public boolean IsAllowedToEditCusterData() {
    Employee employee = getCurrentEmployee();
    Department employeeDepartment = employee.getDepartment();
    Customer customer = getCustomer();
    Shop shop = customer.getShop();

    // many more objects where the permittions depend on

    return IsAllowedToEditCusterData(
            employee.getAge(),
            employeeDepartment.getName(),
            shop.getName(),
            ...
        );
}

// method used by junittests
// much more easy to test because only primitives
// and no internal state is needed
public static boolean IsAllowedToEditCusterData(
        int employeeAge,
        String employeeDepartmentName,
        String shopName,
        ... ) 
{
    boolean isAllowed; 
    // logic goes here

    return isAllowed;
}

1
+1 Çok iyi bir örnek Tam senaryolarımızdan biri olan “Karmaşık kullanıcı izinlerini kontrol etme”.
Amir Rezaei

3

Üzücü cevap, hiçbir şey gerçekten büyük karmaşık projeler için işe yaramaz!

TDD, her şey kadar iyidir ve çoğundan daha iyidir, ancak yalnızca TDD büyük bir projede başarıyı garanti etmeyecektir. Ancak başarı şansınızı arttıracak. Özellikle diğer proje yönetimi disiplinleriyle birlikte kullanıldığında (gereksinimlerin doğrulanması, kullanım durumları, gereksinim izlenebilirlik matrisi, kod geçişleri vb.).


1

Unutmayın, birim testleri zorunlu şartnamelerdir . Bu özellikle karmaşık projelerde değerlidir. Eski kod tabanınızın bunu destekleyecek herhangi bir testi yoksa, hiç kimse bir şeyi değiştirmeye cesaret edemez, çünkü herhangi bir şeyi bozmaktan korkarlar.

“Wtf. Neden bu kod dalı orada bile var? Bilmiyorum, belki birisinin ihtiyacı var, onu kimseyi üzmek yerine orada bırakmak daha iyi…” Zamanla karmaşık projeler çöp toprağı olur.

Testlerle, herkes güvenle "Ben ciddi değişiklikler yaptım, ancak tüm testler hala geçiyor" diyebilir. Tanım olarak, hiçbir şeyi kırmadı. Bu, gelişebilecek daha çevik projelere yol açmaktadır. Belki de COBOL'i sürdürmek için hala insanlara ihtiyaç duymamızın nedenlerinden biri testlerin o zamandan beri popüler olmamasıdır: P


1

TDD özel olarak kullanıldığında, yani en azından bir hata ayıklayıcı / IDE kurulmadan büyük bir karmaşık projenin tamamen başarısız olduğunu gördüm. Sahte veriler ve / veya testler yetersiz kaldı. Beta istemcilerinin gerçek verileri duyarlıydı ve kopyalanamadı veya kaydedilemedi. Bu yüzden, dev ekibi hiçbir zaman gerçek verilere işaret ettiğinde ortaya çıkan ölümcül hataları düzeltemedi ve tüm proje hurdaya atıldı, herkes ateş etti, hepsi bitti.

Bu sorunu çözmenin yolu, müşteri sitesinde bir hata ayıklayıcısında ateşe vermek, gerçek verilere karşı yaşamak, kod içinde ilerlemek, kırılma noktaları, değişkenleri izlemek, hafızayı izlemek vb. Olabilirdi. Ancak, bu ekip, Kodlarının en iyi fildişi kuleleri süslüyordu diye düşünen, yaklaşık bir yıl boyunca hiçbir zaman uygulamalarını ateşlememişti. Bu benim aklımı patladı.

Yani, her şey gibi, denge de anahtardır. TDD iyi olabilir, ancak yalnızca ona güvenmeyin.


1
TDD aptallığı engellemez. TDD çevik olmanın bir parçasıdır, ancak bir diğer önemli parça da her sprintte çalıştırılabilir, çalıştırılabilir kod sağlamakla ilgilidir ...
oligofren

0

Öyle düşünüyorum, bkz. Test Odaklı Geliştirme gerçekten çalışıyor

2008'de, Nachiappan Nagappan, E. Michael Maximilien, Thirumalesh Bhat ve Laurie Williams, “Test odaklı geliştirme yoluyla kalitenin iyileştirilmesi: dört sanayi ekibinin sonuçları ve deneyimleri” adlı bir makale yazdı (PDF bağlantısı). Soyut:

Test odaklı geliştirme (TDD), yıllardır sporadik olarak kullanılan bir yazılım geliştirme uygulamasıdır. Bu uygulamayla bir yazılım mühendisi, başarısız ünite testleri yazma ve bu testleri geçmek için uygulama kodu yazma arasında dakika dakika döngü yapar. Test odaklı geliştirme, yakın zamanda çevik yazılım geliştirme metodolojilerinin kritik bir olanak sağlayan uygulaması olarak ortaya çıkmıştır. Bununla birlikte, çok az deneysel kanıt, bu uygulamanın faydasını endüstriyel bağlamda desteklemektedir veya reddetmektedir. Microsoft'ta üç geliştirme ekibi ve biri TDD'yi benimseyen IBM'de vaka çalışmaları yapılmıştır. Vaka çalışmalarının sonuçları, dört ürünün ön salım öncesi kusur yoğunluğunun TDD uygulamasını kullanmayan benzer projelere göre% 40 ile% 90 arasında azaldığını göstermektedir. Öznel,

2012 yılında, Ruby on Rails geliştirme uygulamaları TDD'yi üstlenmiştir. Testleri ve alayları yazmak için rspec, nesne oluşturmak için factory_girl, tarayıcı otomasyonu için capibara, kod kapsamı için simplecov ve bu testleri otomatikleştirmek için koruma gibi araçlara şahsen güveniyorum.

Bu metodolojiyi ve bu araçları kullanmanın bir sonucu olarak, Nagappan ve ark.


0

Bütçenin, gereksinimlerin ve takım becerilerinin birleşimi, “buraya giren herkesi ümitten vazgeç” şeklinde bırakılan proje alanının kadranındaysa, tanım gereği projenin başarısız olması muhtemeldir.

Belki de gereksinimler karmaşık ve değişkendir, altyapı dengesiz, ekip gençliği ve ciroları yüksek, ya da mimar aptal.

Bir TDD projesinde, bu yaklaşmakta olan başarısızlığın belirtisi, testlerin programa göre yazılamamasıdır; Yalnızca keşfetmeye, denemeye 'alacak o bu uzun ve sadece sahip olduğu '.

Diğer yaklaşımlar başarısız olduklarında farklı semptomlar gösterecektir; en sık işe yaramayan bir sistemin teslimi. Politika ve sözleşmeler tercih edilip edilmeyeceğini belirleyecektir.


-1

TDDÖnceden acı gibi gelebilir ama uzun vadede en iyi arkadaşın olurdu, güven bana TDDuygulamayı uzun vadede sürdürülebilir ve güvenli kılar.

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.