Junit adalah kerangka kerja pengujian regresi yang ditulis oleh Erich Gamma dan Kent Beck. Tes Junit adalah tes programmer, mis. Tes kotak putih. Beranda Proyek: http://www.junit.org/
Saat menggunakan JUnit, Anda terutama menulis kasus tes dengan mewarisi kategori testcase, dan menggunakan nama testxxx () untuk menulis tes unit.
Ada tiga hal yang benar -benar perlu menulis tes dengan junit:
1. Pernyataan impor memperkenalkan semua kelas di bawah junit.framework.*.
2. Pernyataan Extends memungkinkan kelas Anda untuk mewarisi dari testcase.
3. Konstruktor yang menyebut super (string).
Mathtool fungsional
Paket com.zj.c01; kelas publik Mathtool {public static int gcd (int num1, int num2) {int r = 0; while (num2! = 0) {r = num1 % num2; num1 = num2; num2 = r; } return num1; }}Kelas Tes MathtoolTest
paket com.zj.c01; import junit.framework.testcase; kelas publik MathtoolTest memperluas testcase {public mathtoolTest (nama string) {super (name); } public void testGCD () {assertequals (5, Mathtool.gcd (10, 5)); }} Ketika kita menggunakan JUnit untuk menguji pengecualian, cara termudah untuk dipikirkan adalah dengan menggunakan mencoba ... menangkap untuk menangkap pengecualian. Kita perlu menegaskan kondisi berikut:
1. Pengecualian yang memang dilemparkan 2. Kelas jenis pengecualian yang dilemparkan 3. Jenis spesifik dari pengecualian dilemparkan. Secara umum, periksa penentuan string yang terkandung dalam atribut pesan pengecualian. Jadi Anda dapat menulis kode umum seperti ini:
@Test public void testBizException () {coba {password.validate ("123"); gagal ("Tidak ada pengecualian yang dilemparkan."); } catch (Exception ex) {asserttrue (ex instance dari BizException); asserttrue (ex.getMessage (). berisi ("kesalahan")); }} Metode yang diuji di sini adalah apakah metode kata sandi.validate () melempar pengecualian yang sesuai. Harap dicatat bahwa gagal ("Tidak ada pengecualian yang dilemparkan.") Dalam percobaan tidak terlewatkan di sini.
Garis kode, jika tidak jika metode yang diuji tidak melempar pengecualian, kasus penggunaan ini akan lewat, dan apa yang Anda harapkan adalah melempar pengecualian.
Di Junit 4, tidak perlu menguji pengecualian metode seperti ini. Meskipun ini juga dapat menentukan apakah pengecualian yang diharapkan dieksekusi, ia masih memiliki kelemahan. Anda akan tahu setelah membandingkannya. JUnit tidak dapat menunjukkan kepada Anda alasan terperinci untuk kegagalan pernyataan dalam metode TRY ... Catch.
Jadi mari kita lihat cara menguji pengecualian sejak Junit 4? Cukup gunakan anotasi @test (exected = exception.class), lihat kode berikut:
@Test (diharapkan = BizException.class) public void testBizException () {password.validate (null); }
Jika metode yang diuji memiliki tipe BizException yang dilemparkan, pernyataan itu berhasil. Ngomong -ngomong, @test (diharapkan = BizException.class) hanya dapat menentukan jenis pengecualian, dan tidak ada anotasi yang sesuai untuk menegaskan informasi yang lebih spesifik tentang pengecualian, yaitu, tidak dapat menentukan atribut pesan dari pengecualian yang dilemparkan.
Kemudian, kadang -kadang kita akan melemparkan pengecualian dari satu jenis beberapa kali dalam suatu metode, tetapi alasannya berbeda, yaitu, informasi pesan dari pengecualian berbeda. Misalnya, ketika Bizexception terjadi, akan ada dua pengecualian berikut:
BizException baru ("Kata sandi harus berisi setidaknya 6 huruf.") BizException baru ("Panjang Kata Sandi Kurang dari 15 huruf") Ini membutuhkan cara untuk menegaskan pesan pengecualian. Untuk alasan ini, sejak JUnit 4.7, kami telah memberikan pilihan yang lebih sempurna, yang merupakan kode berikut:
@Rule public diharapkan ExpectedEx = diharapkan exception.none (); @Test public void testBizException () melempar InvalidPasswordException {diharapkan.Expect (BizException.class); diharapkan. ExpectMessage ("wajib"); Kata sandi.validate (""); } Kode di atas perlu difokuskan pada:
1. @Rule Deklarasi Variabel yang Diharapkan Diperkirakan, Itu Harus Umum
2. Di @test, tidak dapat ditulis sebagai @test (diharapkan = BizException.class), jika tidak, ia tidak dapat diuji dengan benar. Artinya, metode @test (diharapkan = BizException.class) dan yang diharapkan. 3. Parameter dalam diharapkan. ExpectMessage () adalah pencocokan atau substring, yang berarti bahwa ekspresi reguler dapat digunakan untuk menentukan, atau menentukan apakah substring disertakan. 4. Hal lain sangat berat, tulis metode yang diuji di balik metode yang diharapkan. Seperti yang disebutkan sebelumnya, menggunakan metode Coba ... Catch juga dapat menguji pengecualian dengan benar. Apa manfaat membandingkan @test (diharapkan = ...) atau @rule dan coba ... metode tangkap? Jelas, metode yang direkomendasikan oleh Junit 4 ringkas dan jelas. Mari kita lihat Junit apa yang akan meminta Anda ketika tes gagal?
Prompt yang Anda dapatkan saat tes gagal secara tidak normal:
Saat tidak ada pengecualian:
Java.lang.assertionerror: Tidak ada pengecualian yang dilemparkan. di org.junit.assert.fail (assert.java:91) di cc.unmi.passwordtest.passwordlengthlesstHan6lettersThrowsException (passwordTest.java:20)
Ketika jenis pengecualian salah atau pesan pengecualian salah:
java.lang.assertionerror: di org.junit.assert.fail (assert.java:91) di org.junit.assert.asserttrue (assert.java:43) di org.junit.asserttrue (assert.java:54) di cc.unmi.passwordtest.passwordlengthlessthan6lettersThrowsException (kata sanditest.java:22)
Bantuan di atas untuk kesalahan penentuan posisi tidak terlalu bagus. Lihatlah petunjuk saat tes gagal saat @test (diharapkan = BizException.class):
java.lang.assertionerror: Exception yang diharapkan: cc.test.bizexception di org.junit.internal.runners.statements.expectException.evaluate (diharapkan ExpectedException.java:32) di org.junit.rules.expecpectException $ yang diharapkan: org.junit.rules.expecpecpection $
Gunakan @Rules diharapkan Exception untuk menguji pengecualian. Tips saat gagal:
java.lang.AssertionError: Expected: (exception with message a string containing “YES. required” and an instance of java.lang.NullPointerException) got: at org.junit.Assert.assertThat(Assert.java:778) at org.junit.Assert.assertThat(Assert.java:736) at org.junit.rules.ExpectedException $ diharapkan exceptionstatement.evaluate (diharapkan Exception.java:114)
Terutama metode @Rules yang diharapkan dengan jelas mengetahui mengapa tes gagal. Pengecualian apa yang diharapkan, string apa yang terkandung dalam pesan pengecualian, jenis pengecualian apa yang sebenarnya diperoleh, dan apa pesan dalam pengecualian. Dengan ini, Anda akan tahu cara memperbaiki program Anda segera setelah Anda melihatnya.