Haruskah saya menggunakan try catch dalam metode pengujian saya?


18

Saya sedang melakukan pengujian unit.

Saya mencoba menguji satu fungsi.

Saya menyebutnya dari komponen pengujian saya. Tetapi jika fungsi jarak jauh tidak dapat menangani pengecualian maka komponen tester saya juga akan mendapatkan pengecualian, saya kira.

Jadi haruskah saya khawatir tentang mendapatkan pengecualian dalam komponen tester saya?

Terima kasih.

EDIT:

PS:

Melempar kesalahan itu baik, tetapi hanya untuk fungsi lain, tidak untuk mengakhiri pengguna sampai opsi terakhir!

OMG Saya menulis kutipan pemrograman !!


Saya baru menguji, dan haruskah saya hanya menguji perilaku fungsi. Saya pikir ini disebut pengujian blackbox dan whitebox. Oh, aku ingat itu. Saya mempelajarinya di perguruan tinggi!
Vikas

Kerangka bahasa dan xUnit apa yang Anda gunakan secara khusus? Saya berpendapat ya dalam beberapa kasus.
Greg K

Saya menggunakan MXUnit dengan MockBox dan ColdBox untuk bahasa ColdFusion.
Vikas

Jawaban:


23

Jawaban singkat: TIDAK.

Jangan menangkap pengecualian dalam tes unit. Anda sedang menguji unit untuk menemukan kesalahan dan situasi di mana pengecualian muncul.

Kerangka uji unit harus menangani pengecualian dengan cara yang waras. Sebagian besar (jika tidak semua) kerangka kerja xUnit memiliki konstruksi untuk mengharapkan pengecualian tertentu yang Anda gunakan ketika Anda ingin menginduksi kondisi pengecualian tertentu dalam sistem yang sedang diuji dan memiliki lulus tes jika pengecualian yang diharapkan dinaikkan tetapi gagal jika tidak.


Saya pikir kerangka pengujian lanjutan dapat menangani pengecualian dengan sangat baik, bahkan saya menemukan bahwa di Visual studio kita dapat menguji terhadap pengecualian seperti yang Anda katakan "pengecualian yang diharapkan". Jadi itu baik untuk diketahui dan dibagikan. Terima kasih ..
Vikas

Kadang-kadang, Anda ingin memeriksa apakah Pengecualian dilontarkan, karena pengujian yang baik tidak menguji hanya kasus yang berfungsi, tetapi juga kasus ketika mereka gagal.
deadalnix

1
Anda ingin menangkap pengecualian, karena Anda ingin menguji situasi di mana pengecualian terjadi (terutama pengecualian Anda sendiri). Jika Anda menulis kode yang dirancang untuk gagal dengan pengecualian dalam kondisi tertentu, kondisi tersebut harus menjadi bagian dari rangkaian pengujian Anda, dan karenanya harus diuji. Di bawah tes itu, pengecualian itu harus ditangkap dan dianalisis.
jwenting

1
@Jwenting Baca paragraf kedua - Kerangka kerja pengujian unit menangkap pengecualian dan memungkinkan tes untuk lulus jika pengecualian tertentu dinaikkan dan gagal jika tidak
mcottle

5

(Berbeda dengan jawaban mcottle) Jawaban panjang: TIDAK ... sebagian besar waktu

Ketika Anda mengatakan bahwa Anda mengharapkan tes untuk meningkatkan pengecualian tertentu, Anda akan tahu kapan garis APAPUN dalam tes tersebut menimbulkan pengecualian tertentu.

Itu tidak sama dengan mengetahui bahwa metode yang diuji melempar pengecualian.

Jika pengujian Anda melibatkan pengaturan objek atau konteks (dalam pengujian, bukan dalam versi kerangka kerja Anda SetUp), Anda mungkin lebih baik membungkus satu baris yang sebenarnya ingin Anda uji dalam percobaan / tangkapan, mungkin dengan helper.

Contohnya,

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

lalu

[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 */})
}

Jika tes ini gagal, saya tahu bahwa metode saya yang diuji melemparkan pengecualian, dan bukan sesuatu dalam pengaturan acak.

(Anda harus mencoba dan menghindari hal-hal pengaturan acak. Kadang-kadang, lebih mudah untuk memiliki beberapa kode pengaturan dalam pengujian.)


Contoh yang baik! Saya mencoba untuk sangat berhati-hati tentang membatasi fase "tes" hanya untuk tes yang tepat, tetapi saya akan mengingat trik ini ketika saya tidak bisa menemukan cara untuk melakukan itu (misalnya, ketika menguji kondisi lomba dan perlu 'setup' dekat dengan 'test' untuk mencapai kondisi).
Ethel Evans

1

Secara umum, Anda harus membiarkan pengecualian keluar, dan kerangka kerja pengujian akan memberi Anda laporan yang bagus dengan semua informasi yang Anda butuhkan.


Namun dalam metodologi TDD, kami diharapkan untuk mengikuti langkah-langkah itu:

  1. Tulis ujian
  2. Tonton itu gagal, dan buat kesalahannya bisa dimengerti
  3. Perbaiki kode
  4. Perbaiki kode dan tes

Saat Anda mengeluarkan pengecualian, jika kesalahannya jelas, maka itu baik-baik saja. Namun terkadang pengecualiannya tidak jelas, atau bahkan salah arah. Bagaimana Anda bisa membiarkan itu ada dalam kode Anda (untuk Anda nanti ketika Anda akan lupa, atau untuk anggota tim yang akan kehilangan waktu besar untuk mencari tahu masalahnya)? Jadi kebijakan saya adalah: " Jika perlu untuk membuat kegagalan jelas, Anda perlu menangkap pengecualian ".

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.