Apa sebenarnya penggunaan 'gagal' dalam kasus uji JUnit?

Jawaban:

138

Beberapa kasus yang menurut saya berguna:

  • tandai tes yang belum selesai, jadi gagal dan memperingatkan Anda sampai Anda bisa menyelesaikannya
  • memastikan pengecualian dilemparkan:
try{
  // do stuff...
  fail("Exception not thrown");
}catch(Exception e){
  assertTrue(e.hasSomeFlag());
}

catatan:

Sejak JUnit4, ada cara yang lebih elegan untuk menguji pengecualian yang dilemparkan: Gunakan anotasi @Test(expected=IndexOutOfBoundsException.class)

Namun, ini tidak akan berhasil jika Anda juga ingin memeriksa pengecualian, maka Anda masih perlu fail().

sleske
sumber
5
Pertimbangkan posting blog ini tentang manfaat relatif anotasi gagal vs yang diharapkan: blog.jooq.org/2016/01/20/…
lbalazscs
4
@sleske "jika Anda juga ingin memeriksa pengecualian, maka Anda masih perlu fail ()" - tidak. ExpectedException adalah caranya, lihat github.com/junit-team/junit4/wiki/exception-testing
kraxor
@kraxor: Benar, saya tidak mengetahuinya ketika saya menulis jawabannya (mungkin bahkan belum saat itu).
sleske
14

katakanlah Anda menulis kasus uji untuk aliran a -ve di mana kode yang sedang diuji harus memunculkan pengecualian

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

Saya pikir kasus penggunaan yang biasa adalah memanggilnya ketika tidak ada pengecualian yang dilemparkan dalam tes negatif.

Sesuatu seperti pseudo-code berikut:

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
    }
}
dermawan
sumber
3
Jika Anda tidak memeriksa sesuatu di blok catch, Anda dapat menggunakan anotasi metode @ExpectedException (NullNullPointerException.class) untuk menyatakan bahwa Anda mengharapkan pengecualian (dari jenis khusus).
FrVaBe
8

Saya telah menggunakannya dalam kasus di mana ada sesuatu yang salah dalam metode @Before saya.

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
}
Ryan D
sumber
1
Ya, pengujian prasyarat itu bagus. Namun, jika Anda ingin memastikan bahwa @Beforemetode tersebut berhasil, mungkin lebih baik untuk memeriksanya secara langsung di metode tersebut. Sebagai bonus, setidaknya JUnit dan TestNG bahkan akan melaporkan kegagalan yang berbeda untuk kesalahan dari @Before/ @Aftermetode, jadi dapat dilihat bahwa masalahnya tidak ada dalam pengujian itu sendiri.
sleske
4

Beginilah cara saya menggunakan metode Gagal.

Ada tiga status tempat uji kasus Anda dapat berakhir

  1. Lulus: Fungsi yang diuji berhasil dijalankan dan mengembalikan data seperti yang diharapkan
  2. Tidak Lulus: Fungsi yang sedang diuji berhasil dijalankan tetapi data yang dikembalikan tidak seperti yang diharapkan
  3. Gagal: Fungsi tidak berhasil dijalankan dan ini tidak

dimaksudkan (Tidak seperti kasus uji negatif yang mengharapkan pengecualian terjadi).

Jika Anda menggunakan gerhana, ada tiga status yang masing-masing ditunjukkan oleh penanda Hijau, Biru, dan merah.

Saya menggunakan operasi gagal untuk skenario ketiga.

contoh: public Integer add (integer a, Integer b) {return new Integer (a.intValue () + b.intValue ())}

  1. Passed Case: a = new Interger (1), b = new Integer (2) dan fungsi mengembalikan 3
  2. Kasus Tidak Lulus: a = new Interger (1), b = new Integer (2) dan fungsi mengembalikan nilai soem selain 3
  3. Kasus Gagal: a = null, b = null dan fungsi menampilkan NullPointerException
pengguna3044364
sumber
1
Jika Anda melihat kode sumber JUnit, Anda akan melihat bahwa pernyataan digunakan fail().
Daniel C. Sobral
3

Saya, misalnya, menggunakan fail() untuk menunjukkan tes yang belum selesai (itu terjadi); jika tidak, mereka akan tampil sebagai sukses.

Ini mungkin karena fakta bahwa saya tidak mengetahui beberapa jenis fungsi yang tidak lengkap (), yang ada di NUnit.

Alen Siljak
sumber
2

Dalam pengaturan bersamaan dan / atau asynchronous, Anda mungkin ingin memverifikasi bahwa metode tertentu (misalnya delegasi, event listener, penangan respons, sebut saja) tidak dipanggil. Kerangka mengolok-olok samping, Anda dapat meneleponfail() metode tersebut untuk gagal dalam pengujian. Batas waktu kedaluwarsa adalah kondisi kegagalan alami lainnya dalam skenario semacam itu.

Sebagai contoh:

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");
}
Raphael
sumber
0

Kasus penggunaan yang paling penting mungkin adalah pemeriksaan pengecualian.

Meskipun junit4 menyertakan elemen yang diharapkan untuk memeriksa jika terjadi pengecualian, sepertinya ini bukan bagian dari junit5 yang lebih baru. Keuntungan lain menggunakan fail()over the expectedadalah Anda dapat menggabungkannya dengan finallymengizinkan pembersihan kasus uji.

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);
}

Sebagaimana dicatat dalam komentar lain. Menguji gagal sampai Anda dapat menyelesaikan penerapannya juga terdengar masuk akal.

Udo Dimiliki
sumber