Tek mantığın koruyucusu olduğu yerde test yöntemleri uygulamak yararlı mıdır?


12

Diyelim ki böyle bir yöntem var:

public void OrderNewWidget(Widget widget)
{
   if ((widget.PartNumber > 0) && (widget.PartAvailable))
   {
        WigdetOrderingService.OrderNewWidgetAsync(widget.PartNumber);
   }
}

Benim kodu (bir async Web Servis çağrısı için ön yarısı) bu tür birkaç yöntem var.

Onları birim testlere tabi tutmanın faydalı olup olmadığını tartışıyorum. Evet burada bir mantık var, ama sadece koruma mantığı. (Yani web servis çağrısının gerçekleşmesine izin vermeden önce ihtiyacım olan şeylere sahip olduğumdan eminim.)

Bir parçam "Onları birim test edebileceğinizden emin olabilirsiniz, ama zaman ayırmaya değmez" (zaten programın gerisinde olan bir projedeyim) diyor.

Ama diğer tarafım, eğer onları birim olarak test etmezseniz ve birisi Muhafızları değiştirirse, o zaman problemler olabilir.

Ama ilk bölümüm diyor ki, eğer birisi gardiyanları değiştirirse, onlar için daha fazla iş yapıyorsunuz (çünkü şimdi gardiyanları ve gardiyanlar için birim testlerini değiştirmek zorundalar).

Örneğin, hizmetim Widget kullanılabilirliğini kontrol etme sorumluluğunu üstlenirse, o korumayı daha fazla istemeyebilirim. Birim testi altındaysa, şimdi iki yeri değiştirmek zorundayım.

Artıları ve eksileri her iki şekilde de görüyorum. Bu yüzden başkalarının ne yaptığını soracağımı düşündüm.


17
Koruyucular için "daha fazla iş" yapmıyorsunuz. Eğer mantığı değiştirirlerse, karşılık gelen birim testlerini değiştirmelidirler. İşte böyle çalışır. Eksilerini görmüyorum: eğer birim testin değişmesi gerekmiyorsa, hiçbir şey test etmezdi, değil mi? Birim testinin hiç faydalı olup olmadığını da sorgulayabilirsiniz.
Andres F.

9
Bu konu dışı, ancak parça numarası 0 veya daha azsa bir istisna atmak için mantığı değiştiririm veya parça mevcut değilse, bence biri bu yöntemi biriyle çağırmak için bir hata olur sahte bir widget, sessizce başka bir sorun maskeleme.
Matthew

2
@ Mathew çok iyi bir nokta. Bu işlev yatar. Adlandırma size bir şey sipariş edeceğini söyler. Ve sonra değil, ama içerideki ile aynı mantığı uygulamadığınız sürece, asla bilemeyeceksiniz, bu da KURU ivioli yapar. Başka bir deyişle: tasarım daha doğru olacak şekilde değiştirilirse, bu soru ilk etapta sorulmayabilirdi.
stijn

2
but it is not worth the time" (I am on a project that is already behind schedule).Biz yazılım geliştiricisiyiz. Programda olduğumuz tek zaman öldüğümüz
zamandır

Yanıtlar:


26

Bir parçam "Onları birim test edebileceğinizden emin olabilirsiniz, ama zaman ayırmaya değmez" (zaten programın gerisinde olan bir projedeyim) diyor.

Üç çok kısa test. Kendinize soruyu sormak için çok zaman harcadınız.

Ama diğer tarafım, eğer onları birim olarak test etmezseniz ve birisi Muhafızları değiştirirse, o zaman problemler olabilir.

Bu tarafı dinleyin.

Ama ilk bölümüm diyor ki, eğer birisi gardiyanları değiştirirse, onlar için daha fazla iş yapıyorsunuz (çünkü şimdi gardiyanları ve gardiyanlar için birim testlerini değiştirmek zorundalar).

Eğer bakıcınız bir TDD somunu ise, onlar için daha zor hale getirirsiniz. İlgili bir değişiklik veya test eklenmesi olmadan yaptığım herhangi bir değişiklik, çok düşünmeme yol açıyor. Aslında, devam etmeden ve değişikliği yapmadan önce muhtemelen testleri eklerdim.

İlk kısmı sadece yanlış. İkinci bölüme arkada bir pat verin ve düşünmeyi bırakın.


Ben de bir cevap yazmış olmama rağmen kısa ve öz için +1
Jimmy Hoffa

3
+1. Evet, gereksinimler değişirse, bazı testlerin uyarlanması gerekecektir.
Olivier Jacot-Descombes

Ne dediğini gibi olsa da, benim kod (async çağrısının ön yarısı) bu tür bir çağrı birçok örnekleri var. Yani sadece 3 ünite testi değil. Yine de, "doğru" yol ise, onları halletmek istiyorum.
Vaccano

@Vaccano: Ne kadar çok yazmak zorunda kalırsanız, testleriniz o kadar mantıklı olmayan yollar ve bunları yazmak o kadar gerekli olur.
pdr

9

Koruma mantığı ve gerçek sıralama ayrı yöntemler olsaydı, birim testini basitleştirecekti.

In Widgetsınıfında

public bool IsReadyForOrdering { get { return PartNumber > 0 && PartAvailable; } }

veya başka bir yerde eşdeğer bir yöntem

public bool IsWidgetReadyForOrdering(Widget widget)
{
    return widget.PartNumber > 0 && widget.PartAvailable;
}

Sipariş yöntemi

public void OrderNewWidget(Widget widget)
{
   if (IsWidgetReadyForOrdering(widget)) {
        WigdetOrderingService.OrderNewWidgetAsync(widget.PartNumber);
   }
}

Artık testler IsWidgetReadyForOrderingkolaylaştı. Artık bu konuda uzun süre düşünmeyin. Dene!


1
Oof, bir özellikte durumsal mantık .. -1 bir yöntem olmalı ve basitliği nedeniyle PartNumber, PartAvailable almalıdır. Genel API'nin bir parçası değil, bir mülk değil, korunmasını sağlayın .. Ayrıca genellikle katılmıyorum. Yöntemin içindeki koruma mantığı tamamen iyi ve gözlerimde daha iyi çünkü çok küçük bir yöntem, zaten küçük bir yöntemi daha küçük yapmak için sınıfı kirletiyorsunuz. Bu durumda sınıfa yalnızca tekrarlayan mantık varsa ekleyin.
Jimmy Hoffa

1
İlk olarak, bu soruya cevap vermiyor. İkincisi, bu doğru değil. Her iki şekilde de üç test yazmanız gerekir. Üçüncüsü, uygulama ayrıntılarını gereksiz yere arama koduna maruz bırakır.
pdr

8
@JimmyHoffa: bu mülkte herhangi bir durumsal mantık nerede görüyorsunuz? Aslında, örnek, durum değiştiren mantığın (OrderNewWidget) statik olmayan mantıktan (ReadyForOrdering) nasıl ayrılacağını gösterir. Ve ben, o küçük fonksiyonları bile çıkarmanın, kodu düzelterek ve daha da kötüleştirmeyeceğinizi, belirttiğiniz gibi güçlü bir inancım. Yani +1.
Doc Brown

2
Yöntem OrderNewWidgetmuhtemelen bir sınıfta Widget, çünkü bir Widgetargümanı var. Yöntemin bir dönüş değeri olmadığından, test edilmesi açık değildir. Aramayı WigdetOrderingServiceizleyen bir -mock enjekte etmeniz gerekir OrderNewWidgetAsync.
Olivier Jacot-Descombes

2
@JimmyHoffa: aslında "vatansız" tanımınız C # 'da "statik" anlamına gelir. Bu nedenle, "özellikler bir nesnenin durumuna erişmemelidir" demektedir. Ancak aptal alıcılar bile durum değişkenlerine erişir, bu da "sadece statik özellikleri yaz" anlamına gelir - ki bu pek mantıklı gelmiyor.
Doc Brown

6

Birim testi için programınızda zamanınız yoksa ancak sağlam KG kullanımı için bir kenara ayırdığınız zaman varsa, birim testleri yazmak için bu KG süresinin bir kısmını çalabilecek misiniz veya KG döneminin bir kısmını harcayabileceğinizi sorun birim testleri yapmak, ya da belki sadece birim test edilmemiş kod ile uğraşmak. Ne yazık ki taşınmaz olan programlar size taviz vermeye ya da kendinizi ölüme zorlamak için, genellikle ilk seçeneği öneriyorum çünkü ikincisi sizi destekleyemez / sistemin süresi boyunca doğru şekilde bakımını yapmak.

Bununla birlikte, koruma ifadelerini test etme genel sorunuza; Evet! Koruma ifadelerini kesinlikle test edin! Bunlar, bu yöntemin davranışının önemli parçalarıdır, birisinin hata düzeltmesi yapan bir şeyi yanlış anladığını ve korumalarınızı çıkardığını veya değiştirdiğinizi &&bulmak ||istemez miydiniz? Birim testleri, a) korumalarınızdaki mantığı doğru bir şekilde aldığınızdan ve b) birim testlerini gerçekleştirdiklerinde hiç kimsenin şikâyet etmeden bu mantığı kırmadığını ve bunun bir sebepten ötürü böyle olması gerektiğini söyleyecektir.


0

Yukarıda bazı mükemmel cevaplar var ve yaptıkları noktalar çok önemli. Ancak kaçırılmış gibi görünen bir tanesi, kapsamlı bir dizi birim testinizin olması, kodun son derece ayrıntılı bir spesifikasyonu gibi okuyorlar. Test doğrulamasını yalnızca kod çok kolay olduğu için atlarsanız, nasıl yanlış gidebileceğini görmek zor, belirtiminizin bir kısmı eksik. Bu testlerin kaçırıldığı bir takıma girsem, aslında hizmetinizin argümanlarını doğrulamadığını varsayarım.


-5

Kod koddur. Test sırasında% 100 kapsama almaya çalışmalısınız. Eğer önemli olmasaydı orada olmazdı.

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.