Birim testleri ile ne kadar ileri gider


11

Bir soru daha önce birçok kez sordu ama belirli bir eğik twds mvc geliştirme ile.

Ben çok iyi bir çocuk oldum ve tüm denetleyici eylemlerimi harika olan karşılık gelen birim testleri ile kodluyorum (biraz [tekrar zaman oku] tekrarlı ise). Dürüst olmak gerekirse, aslında intial birim testlerinin çıplak kemiklerinin çoğunu yazmak için küçük bir T4 şablonu oluşturdum ve daha sonra kullanıma göre ayarladım. Kısmi görüş içeren görünümlerde testlerin nasıl yapılacağından emin olmadığımı itiraf edeceğim - ancak bu başka bir soru için bir hikaye.

Şimdi karar vermem zor olan şey, kapsamın hizmet katmanımda ne kadar derin olması gerektiği. Bunun nedeni, bazı servis yöntemlerimin (daha iyi veya daha kötü) aslında yöntem içinde sonraki mantığa gizli bilgi sağlayan çeşitli linq sorguları gerçekleştirmesidir. Ben sadece her linq deyimi için gerekli mantığı çağırmak ve daha sonra yöntem içinde uygulamak için bu yöntemleri yıkmak (gerekir ??) biliyorum. Bununla birlikte, birçok durumda, linq 'işlevlerinin' hiçbir zaman yeniden kullanımı yoktur ve bu nedenle, bunun kodu çok ileri bir seviyeye çıkaracağını düşünür.

Sorduğum şey, bir yöntem içinde karmaşık mantık oluşmasıyla, sadece gerekli sonucu ve / veya beklenen hatayı ortaya koyan bir test yöntemine sahip olmak ya da her mantık çizgisinin de simüle edilmesi ve test edilmesi gerektiğidir. Gördüğüm şekilde, testi doğru yapmak için, yöntem mantığı (satır satır) da bir tür kapsama giriyor olmalı. Ancak (saf görüşüme göre), testlerin kendisinde bir yazlık endüstrisi oluşturmak için testi ve uygulanan yöntemi bu kadar yakından hizalanmış (ki olması gerektiğini biliyorum) tutmaya çalışmak için hiç bitmeyen bir döngüye yol açabilir.

Sorumun, bunu beyinsiz olarak görecek TDD adananlarından birkaçını rahatsız edebileceğini biliyorum. TDD kampında olmamak, bu benim için 'evet bir beyin', dolayısıyla soru.

btw - bunu fikirler için kontrol etmişti:

http://dotnetslackers.com/articles/aspnet/Built-in-Unit-Test-for-ASP-NET-MVC-3-in-Visual-Studio-2010-Part-1.aspx

şimdi sabit inişlere fwd arıyorum :)

[değiştir] - bekarın yararına (şu anda bekar !!) 'yakın' seçmen. bu soru öznel değil . Çok odaklanmış bir konuda fikir birliği arıyorum. Negatif tutkuları karıştırmaya çalışmıyorum, teknolojideki kusurları ortaya çıkarmak istemiyorum - ben BÜYÜK bir hayranım. Bu nedenle, lütfen oy vermek yakınsa oy kullanmam için nazik bir yorum bırakın, çünkü belirsizlik veya yanlış bilgi varsa soruyu yeniden yapılandırmama yardımcı olabilir. bu soru, mvc nüfusunun büyük bir kısmına fayda sağlayabilir.

teşekkür ederim!!

jim


Kapatılması gereken ilk oy benim, ancak 'öznel ve tartışmacı' değil (ki bu değil), ama 'programmers.stackexchange.com'a geç' çünkü bu tek bir programla ilgili özel bir soru değil temiz Cevap.

aakashm, takdir ve anlaşıldı. bir kazmak değildi, sadece bilmek istedim :)
jim

Yanıtlar:


4

Öncelikle bahsettiğiniz şey TDD'ye benzemiyor. TDD, Test-> Code-> Refactor modelini izleyerek sisteminizin tasarımını yönlendirmekle ilgili bir test ilk yaklaşımı gerektirir . Belki de ilk probleminiz testlerinizin amacı, bunları kodlarken yazıyor musunuz? Eğer öyleyse, testinizdeki hemen hemen tüm mantığın bazı birim testlerle ilgili olmasını beklerim. Yüksek kod kapsamı bu nedenle TDD'nin uygulanmasının dolaylı bir sonucudur.

TDD yaparken yazmak istediğiniz kodu motive etmek için yeterli test kodu yazıyorsunuz. Ayrıca önce testin başarısız olduğundan da emin olursunuz . Temel olarak kendinize bu yöntemin ne yapması gerektiğini sorun. Daha sonra kodlarsınız, ancak test geçişini yapmak için yeterlidir, aradığınız şey değilse, ek testler yazıp yöntemi yeniden düzenlersiniz.

Gerçekten sonraki kod kapsamı, TDD'ye bağlılığınızı ölçmek için etkili bir yöntem değildir, ancak genellikle TDD kullanılarak yazılmış kodda çok yüksek kod kapsamı bulacaksınız, tüm kodların bir test tarafından motive edilmesi gerekir.

TDD testleri hem tasarımı hem de belgeyi yönlendirmeye ve tasarımı başkalarına açık bir dille açıklamaya yarar (bu nedenle testlerinizi nasıl adlandırdığınız çok önemlidir).

Bununla birlikte, bu karışıklığın hiçbiri doğrudan sorunuzu cevaplamıyor, bu yüzden sadece söyleyeceğim, özellikle trival olmayan mantığın olduğu yerlerde oldukça yüksek kod servis kapsamı (UI olmayan) kodunu hedeflemelisiniz ve hatta testler daha iyi ise önce yazılmış ;-). Daha fazla testin genellikle daha iyi olduğu gerçeği (bazıları buna katılmayabilir). Birçok yüksek kaliteli açık kaynak projesinde, çalışan koddan çok daha fazla test kodu bulunur.

Ayrıca, testler aşağıdaki durumlarda yazılmalıdır:

  1. Yeni kod yazıyorsunuz, testler tasarımınızı yönlendirmeli ve belgelemeli ve kodun ne yapması gerektiği konusundaki varsayımlarınızı açıklamalıdır. Kodlamadan önce yazılmalıdır.

  2. Bir hata buldunuz, başarısız bir test hatayı göstermelidir. Hata giderildiğinde test geçmelidir.

  3. Kodu, bir yöntemin veya sınıfın yapısının yapısını değiştirecek şekilde değiştirirsiniz (ancak kodun bir alanı değiştiğinde çok sayıda test başarısız olursa, bu kırılgan testleri gösterebilir). Bu, kodu doğru şekilde belgeleyen testleri tutar.

Şahsen, TDD öğrenmenin ilginç bir zorluk olduğunu gördüm ve bunun için iyi bir "bağırsak hissi" geliştirmek zaman alıyor. Pratik yap, pratik yap, pratik yap benim için öğrenmenin en iyi yolu oldu. Bu ve açık kaynak projelerinden test kodunu okumak ve şimdi de değişiklikleri ile yeni testler yazarken onlara katkıda bulunuyor.


+1 chris - pergelinizin kesilmesini seviyorum :-), ama daha da önemlisi, birim testi ve TDD arasındaki ayrımı işaret ediyorsunuz (ayrımı anladım). benim biraz melez bir model (yikes !!)
jim

Evet, muhtemelen aşina olduğunuz bir şey olduğunu düşündüm, ancak yine de bahsetmeye değer. Ayrıca hepimizin biraz melez bir modeli olduğunu düşünüyorum. Son zamanlarda kendimi çok daha fazla test yaparken buldum. MSpec ve spesifikasyon stili testlerine geçmenin yardımcı olduğunu hissediyorum. Hala bazı kod yazmak rağmen ben sadece ilk test için rahatsız olamaz.
Chris Nicola

... utanç verici bir şekilde son cümlede başımı salladım :)
jim

0

Bir yöntemin yalnızca dönüş değerini test etmenin, içindeki tüm dalları test etmekten daha az güçlü olduğu açıktır. Alternatif girişlerin doğru davranış garantisi verilmez.

Öte yandan, her şeyi test etmek için yeterli zamanınız veya sabrınız olmayabilir.

Yapabileceğiniz şey, kodun ne kadarını testlerle (% 80-90 veya daha fazla) kapsamak istediğinize karar vermek ve bunu doğrulayan otomatik araçlar kullanarak bunu uygulamaktır.
Yazma testlerinin "hiç bitmeyen bir döngüsü" yalnızca kod yazma döngüsü de hiç bitmezse ortaya çıkar :)


cosmin -özellikle kodumu görmedin. koşu bandına geri dönelim ... :-)
jim

0

Kodunuzun düzgün çalıştığından ne kadar emin olmak istiyorsunuz? Birim testi, uygulamanızın spesifikasyonun yapması gerekeni söylediklerini yaptığını doğrulamaya yardımcı olmak için programcının çantasındaki bir araçtır. Muhtemelen% 100 kapsama ihtiyacınız yoktur, ancak kodunuzun daha kritik kısımlarını kapsayacak şekilde birim testleri yazmalısınız. Yöntemlerinizin sadece yalnız değil, birlikte iyi çalıştığından emin olmak her zaman iyidir ve bu nedenle, daha kritik “mantık hatlarınızın” bazılarını kapsayan bazı testler yazmaya çalışmalısınız.


0

Visual Studio'da kod kapsamı açıkken birim sınamalarını yürütmek, kodunuzun ne kadar iyi kapsandığına dair iyi (ve grafiksel) bir gösterge vermelidir.

Dahili MSTest çerçevesini kullanmıyorsanız, NUnit ile çalışmak için bir üçüncü taraf kod kapsamı ürününe bakmanız veya şu talimatları uygulamanız gerekebilir: /programming/2665799/does-vs2010-code -coverage destek-nunit

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.