Test yöntemlerimde try catch kullanmalı mıyım?


18

Birim testi yapıyorum.

Bir işlevi test etmeye çalışıyorum.

Test bileşenimden çağırıyorum. Ancak uzak işlev istisnayı işleyemezse, test cihazımın bileşeni de istisna alacaktır, sanırım.

Test cihazı bileşenimde istisna hakkında endişelenmeli miyim?

Teşekkürler.

DÜZENLE:

Not:

Bir hata atmak iyidir, ancak son seçenek olana kadar son kullanıcılara değil, sadece diğer işlevler için!

OMG Bir programlama teklifi yazdım !!


Sınama konusunda yeniyim ve yalnızca işlevin davranışını sınamam gerekir. Bence kara kutu ve beyaz kutu testi deniyor. Ah hatırlıyorum. Bunu üniversitede okudum!
Vikas

Özellikle hangi dili ve xUnit çerçevesini kullanıyorsunuz? Bazı durumlarda evet iddia ediyorum.
Greg K

ColdFusion dili için MockBox ve ColdBox ile MXUnit kullanıyorum .
Vikas

Yanıtlar:


23

Kısa cevap: HAYIR.

Birim testlerinde istisnaları yakalamayın. İstisnaların ortaya çıktığı hataları ve durumları bulmak için birim test yapıyorsunuz.

Birim test çerçevesi istisnaları akılcı bir şekilde ele almalıdır. Çoğu (hepsi değilse de) xUnit çerçevelerinin, test edilen sistemdeki belirli bir istisna koşulunu başlatmak istediğinizde kullandığınız belirli istisnaları bekleyecek ve beklenen istisna yükselirse bir test geçişine sahip olacak, ancak başarısız değilse başarısız olacak bir yapıya sahiptir .


Bence gelişmiş test çerçevesi istisnayı çok iyi işleyebilir, hatta Visual Studio'da "beklenen istisna" dediğiniz gibi istisnalara karşı test yapabileceğimizi fark ettim. Yani bilmek ve paylaşmak güzel. Teşekkürler ..
Vikas

Bazen, iyi bir testin sadece vakaların işe yaradığı değil, aynı zamanda başarısız oldukları durumlarda da test edildiğinden, bir İstisna atılıp atılmadığını kontrol etmek istersiniz.
deadalnix

1
İstisnaları yakalamak, İstisnaların meydana geldiği durumları (özellikle kendi istisnalarınızı) test etmek istersiniz. Belirli koşullar altında bir istisna dışında başarısız olacak şekilde tasarlanmış bir kod yazarsanız, bu koşullar test takımınızın bir parçası olmalı ve bu nedenle sınanmalıdır. Bu testler altında, bu istisnalar yakalanmalı ve analiz edilmelidir.
jwenting

1
@Jwenting İkinci paragrafı okuyun - Ünite test çerçeveleri istisnaları yakalar ve belirli istisnalar ortaya çıkarsa testlerin geçmesine izin verir ve yapılmazsa başarısız olur
11:33

5

(Mcottle'ın cevabının aksine) Uzun cevap: HAYIR ... çoğu zaman

Bir testin belirli bir istisnayı yükseltmesini beklediğinizi söylediğinizde, o testteki HERHANGİ bir satırın bu istisnayı ne zaman yükselttiğini bilirsiniz.

Bu, test edilen yöntemin istisnayı attığını bilmekle aynı şey değildir.

Testiniz bir nesne veya bağlam kurmayı içeriyorsa (testin içinde, çerçevenizin sürümü dahilinde değil SetUp), gerçekten denemek / yakalamak için test etmek istediğiniz tek satırı, muhtemelen bir yardımcıyla sarmak daha iyi olabilir.

Örneğin,

public static class AssertHelper {
    public delegate void Thunk();

    public static void DoesNotThrow<T>(Thunk thunk, string message = "")
        where T: Exception {
        try {
            thunk.Invoke();
        } catch(T) {
            Assert.Fail(message);
        }
    }
}

ve sonra

[TestMethod]
public void assertHelperInAction() {
    // Random setup stuff here that's too annoying to put in my SetUp
    // method.
    AssertHelper.DoesNotThrow<IllegalArgumentException>(() =>
        {/* My random method under test */})
}

Bu test başarısız olursa, test edilen yöntemimin rastgele kurulum öğelerinde bir şey değil istisna attığını biliyorum.

(Rastgele kurulum öğelerinden kaçınmalısınız. Bazen, testte bazı kurulum kodlarına sahip olmak daha kolaydır.)


İyi örnek! "Test" aşamasını sadece kesin testle sınırlamak konusunda çok dikkatli olmaya çalışıyorum, ancak bunu yapmanın bir yolunu bulamadığım zaman (örneğin, bir yarış koşulu için test yaparken) ve koşula ulaşmak için "test" e yakın "kurulum" gerekir).
Ethel Evans

1

Genel olarak, istisnanın dışarı çıkmasına izin vermelisiniz ve test çerçevesi size ihtiyacınız olan tüm bilgileri içeren güzel bir rapor verecektir.


Ancak TDD metodolojisinde şu adımları izlememiz bekleniyor:

  1. Bir test yazın
  2. Başarısız olduğunu izleyin ve hatayı anlaşılabilir yapın
  3. Kodu düzeltin
  4. Kodu ve testi yeniden düzenleyin

Bir istisnayı dışarıda bıraktığınızda, hata açıksa sorun yoktur. Ancak bazen istisna belirsiz veya hatta yanlış yönlendiricidir. Bunun kodunuzda olmasına nasıl izin verebilirsiniz (daha sonra unutmuş olacağınız için veya sorunu çözmek için büyük zaman kaybedecek bir ekip üyesi için)? Dolayısıyla politikam: " Bir hatayı netleştirmek gerekirse, istisnayı yakalamanız gerekir ".

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.