Buna yanlış yaklaşıyorsun. Sadece işlevselliğinizi test edin: bir istisna atılırsa test otomatik olarak başarısız olur. Herhangi bir istisna yapılmazsa, testlerinizin hepsi yeşile döner.
Bu sorunun zaman zaman ilgisini çektiğini fark ettim, bu yüzden biraz genişleyeceğim.
Birim testinin arka planı
Birim testi yaparken, kendiniz için bir iş birimi olarak neyi düşündüğünüzü tanımlamak önemlidir. Temel olarak: kod tabanınızın tek bir işlevsellik parçasını temsil eden birden çok yöntem veya sınıf içerebilen veya içermeyen bir çıkarma.
Veya Roy Osherove'nin Birim Testi sanatı, 2. Baskı'da tanımlandığı gibi , sayfa 11:
Bir birim test sonra kontroller birimin tek bir son sonuç hakkında bazı varsayım işin birimi, test edilen çağırır ve kod otomatik bir parçasıdır. Birim testi neredeyse her zaman birim test çerçevesi kullanılarak yazılır. Kolayca yazılabilir ve hızlı çalışır. Güvenilir, okunabilir ve bakımı kolaydır. Üretim kodu değişmediği sürece sonuçlarında tutarlıdır.
Fark edilmesi gereken önemli olan, bir iş biriminin genellikle sadece bir yöntem değil, aynı zamanda en temel düzeyde bir yöntem olmasıdır ve bundan sonra diğer iş birimleri tarafından kapsüllenir.
İdeal olarak, her bir ayrı iş birimi için bir test yönteminiz olmalıdır, böylece her şeyin nerede ters gittiğini hemen görebilirsiniz. Bu örnekte getUserById()
kullanıcı döndürecek temel bir yöntem vardır ve toplam 3 birim çalışma vardır.
İlk iş birimi, geçerli ve geçersiz giriş durumunda geçerli bir kullanıcının iade edilip edilmediğini test etmelidir.
Veri kaynağı tarafından atılan tüm istisnalar burada ele alınmalıdır: kullanıcı yoksa, kullanıcı bulunamadığında bir istisnanın atıldığını gösteren bir test olmalıdır. Buna bir örnek ek açıklama IllegalArgumentException
ile yakalanmış olabilir @Test(expected = IllegalArgumentException.class)
.
Bu temel iş birimi için tüm kullanımlarınızı ele aldıktan sonra, bir seviye yukarı çıkmış olursunuz. Burada tam olarak aynı şeyi yaparsınız, ancak yalnızca geçerli olanın hemen altındaki düzeyden gelen istisnaları ele alırsınız. Bu, test kodunuzu iyi yapılandırılmış tutar ve her yerde atlamak yerine, işlerin yanlış gittiğini bulmak için mimariyi hızla çalıştırmanıza olanak tanır.
Bir testin geçerli ve hatalı girdisini işleme
Bu noktada, bu istisnaları nasıl ele alacağımız açık olmalıdır. 2 tür giriş vardır: geçerli giriş ve hatalı giriş (giriş kesin anlamda geçerlidir, ancak doğru değildir).
Geçerli girdilerle çalıştığınızda, yazdığınız herhangi bir testin işe yarayacağına ilişkin örtük beklentiyi belirlersiniz.
Böyle bir yöntem çağrısı şöyle olabilir: existingUserById_ShouldReturn_UserObject
. Bu yöntem başarısız olursa (örn: bir istisna atılır), bir şeyin yanlış gittiğini bilirsiniz ve kazmaya başlayabilirsiniz.
Hatalı girdiyi nonExistingUserById_ShouldThrow_IllegalArgumentException
kullanan ve bir istisna bekleyen başka bir test ( ) ekleyerek , yönteminizin yanlış girdi ile yapması gerekeni yapıp yapmadığını görebilirsiniz.
TL; DR
Testinizde iki şey yapmaya çalışıyordunuz: geçerli ve hatalı giriş olup olmadığını kontrol edin. Bunu, her birinin bir şey yaptığı iki yönteme bölerek, çok daha net testlere ve işlerin yanlış gittiği yere daha iyi bir genel bakışa sahip olacaksınız.
Katmanlı iş birimini akılda tutarak, hiyerarşide daha yüksek bir katman için ihtiyacınız olan test miktarını da azaltabilirsiniz, çünkü alt katmanlarda yanlış giden her şeyi hesaba katmanız gerekmez: geçerli katmanın altındaki katmanlar bağımlılıklarınızın işe yaradığına dair sanal bir garantidir ve bir şeyler ters giderse, geçerli katmanınızdadır (alt katmanların herhangi bir hata atmadığını varsayarsak).