JUnit test durumunda "başarısız" nın gerçek kullanımı nedir?


Yanıtlar:


138

Yararlı bulduğum bazı durumlar:

  • tamamlanmamış bir testi işaretleyin, böylece siz bitirene kadar başarısız olur ve sizi uyarır
  • bir istisna atıldığından emin olmak:
try{
  // do stuff...
  fail("Exception not thrown");
}catch(Exception e){
  assertTrue(e.hasSomeFlag());
}

Not:

JUnit4'ten bu yana, bir istisna atıldığını test etmenin daha zarif bir yolu var: @Test(expected=IndexOutOfBoundsException.class)

Ancak, istisnayı da incelemek istiyorsanız bu işe yaramaz, o zaman yine de ihtiyacınız vardır fail().


5
Başarısızlığın ve beklenen ek açıklamanın göreceli yararları hakkındaki bu blog gönderisini bir düşünün: blog.jooq.org/2016/01/20/…
lbalazscs

4
@sleske "İstisnayı da incelemek istiyorsanız, o zaman hala başarısız () gerekir" - hayır. ExpectedException yoldur, bkz. Github.com/junit-team/junit4/wiki/exception-testing
kraxor

@kraxor: Doğru, cevabı yazarken bunu bilmiyordum (muhtemelen o zamanlar bile değildi).
2017

14

Test edilen kodun bir istisna oluşturması gereken bir negatif akış için bir test senaryosu yazdığınızı varsayalım.

try{
   bizMethod(badData);
   fail(); // FAIL when no exception is thrown
} catch (BizException e) {
   assert(e.errorCode == THE_ERROR_CODE_U_R_LOOKING_FOR)
}

10

Bence olağan kullanım durumu, olumsuz bir testte hiçbir istisna atılmadığında çağırmaktır.

Aşağıdaki sözde kod gibi bir şey:

test_addNilThrowsNullPointerException()
{
    try {
        foo.add(NIL);                      // we expect a NullPointerException here
        fail("No NullPointerException");   // cause the test to fail if we reach this            
     } catch (NullNullPointerException e) {
        // OK got the expected exception
    }
}

3
Yakalama bloğundaki bir şeyi kontrol etmezseniz, bir istisna beklediğinizi (özel bir türden) bildirmek için @ExpectedException (NullNullPointerException.class) yöntem ek açıklamasını kullanabilirsiniz.
FrVaBe

8

@Before yöntemimde bir şeylerin ters gitmesi durumunda kullandım.

public Object obj;

@Before
public void setUp() {
    // Do some set up
    obj = new Object();
}

@Test
public void testObjectManipulation() {
    if(obj == null) {
        fail("obj should not be null");
     }

    // Do some other valuable testing
}

1
Evet, ön koşulları test etmek iyidir. Ancak, @Beforeyöntemin başarılı olduğundan emin olmak istiyorsanız , muhtemelen bu yöntemde doğrudan kontrol etmek daha iyidir. Bonus olarak, en azından JUnit ve TestNG, @Before/ @Aftermethodlardan gelen hatalar için farklı bir başarısızlık bile rapor edecek , böylece sorunun testin kendisinde olmadığını görebilir.
sleske

4

Başarısız yöntemini böyle kullanıyorum.

Test durumunuzun sonuçlanabileceği üç eyalet vardır

  1. Başarılı: Test edilen işlev başarıyla yürütüldü ve beklendiği gibi verileri döndürdü
  2. Geçmedi: Test edilen işlev başarıyla yürütüldü, ancak döndürülen veriler beklendiği gibi değildi
  3. Başarısız: İşlev başarıyla yürütülemedi ve bu

amaçlanan (Bir istisna olmasını bekleyen negatif test durumlarının aksine).

Tutulma kullanıyorsanız, sırasıyla Yeşil, Mavi ve kırmızı işaretçilerle gösterilen üç durum vardır.

Üçüncü senaryo için başarısız işlemi kullanıyorum.

ör: public Tamsayı toplama (tamsayı a, Tamsayı b) {yeni Tamsayı döndür (a.intValue () + b.intValue ())}

  1. Geçen Durum: a = new Interger (1), b = new Integer (2) ve fonksiyon 3 döndürdü
  2. Geçmedi Durum: a = new Interger (1), b = new Integer (2) ve fonksiyon 3'ten farklı bir soem değeri döndürdü
  3. Başarısız Durum: a = null, b = null ve işlev bir NullPointerException oluşturur

1
JUnit'in kaynak koduna bakarsanız, iddiaların kullandığını göreceksiniz fail().
Daniel C. Sobral

3

Örneğin, fail()henüz bitmemiş testleri belirtmek için kullanıyorum (oluyor); aksi takdirde başarılı görünürlerdi.

Bu belki de NUnit'te var olan bir çeşit tamamlanmamış () işlevselliğin farkında olmamamdan kaynaklanıyor olabilir.


2

Eşzamanlı ve / veya asenkron ayarlarında, vardır (siz söyleyin, örneğin delegeler, olay dinleyicileri, tepki işleyicileri) arasında söz konusu yöntemler doğrulamak isteyebilirsiniz değil denir. Alaycı çerçeveler bir yana, fail()testlerde başarısız olmak için bu yöntemleri çağırabilirsiniz . Süresi dolan zaman aşımları, bu tür senaryolarda başka bir doğal arıza durumudur.

Örneğin:

final CountDownLatch latch = new CountDownLatch(1);

service.asyncCall(someParameter, new ResponseHandler<SomeType>() {
    @Override
    public void onSuccess(SomeType result) {
        assertNotNull(result);
        // Further test assertions on the result
        latch.countDown();
    }

    @Override
    public void onError(Exception e) {
        fail(exception.getMessage());
        latch.countDown();
    }
});

if ( !latch.await(5, TimeUnit.SECONDS) ) {
    fail("No response after 5s");
}

0

En önemli kullanım durumu muhtemelen istisna kontrolüdür.

Junit4, bir istisna olup olmadığını kontrol etmek için beklenen öğeyi içerirken, yeni junit5'in bir parçası değilmiş gibi görünüyor. Kullanmanın bir diğer avantajı fail()üzerine expectedBunu, birleştirmek olmasıdır finallytest case temizleme sağlanır.

dao.insert(obj);
try {
  dao.insert(obj);
  fail("No DuplicateKeyException thrown.");
} catch (DuplicateKeyException e) {
  assertEquals("Error code doesn't match", 123, e.getErrorCode());
} finally {
  //cleanup
  dao.delete(obj);
}

Başka bir yorumda belirtildiği gibi. Uygulamayı bitirene kadar başarısız olacak bir teste sahip olmak da mantıklı geliyor.

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.