Rumah >Java >javaTutorial >Apakah perangkap biasa ujian fungsi Java?
Perangkap biasa yang perlu diketahui apabila unit menguji fungsi Java termasuk: Mengabaikan keadaan sempadan seperti input kosong, nilai maksimum atau minimum. Input diandaikan sah dan input yang tidak sah tidak disahkan. Penumbunan tidak dilakukan apabila bergantung pada perpustakaan pihak ketiga, mengakibatkan ujian tidak stabil. Lupakan tentang pengecualian ujian yang mungkin dilemparkan oleh fungsi.
Apabila unit menguji fungsi Java, anda perlu memberi perhatian khusus kepada beberapa perangkap biasa, yang mungkin membawa kepada ujian yang tidak lengkap atau tidak boleh dipercayai.
Ujian keadaan sempadan merujuk kepada ujian kelakuan input dan output fungsi di bawah nilai ekstrem. Terlupa untuk menguji keadaan sempadan, seperti input kosong, nilai maksimum atau minimum, boleh menyebabkan kecacatan yang belum ditemui.
Kes praktikal:
@Test public void testMax() { assertTrue(Math.max(2, 5) == 5); }
Ujian ini tidak meliputi kes fungsi Math.max
dengan nombor negatif atau 0
sebagai input. Ujian yang lebih komprehensif akan kelihatan seperti ini: Math.max
函数与负数或 0
作为输入的情况。一个更全面的测试应该如下所示:
@Test public void testMax() { assertTrue(Math.max(2, 5) == 5); assertTrue(Math.max(0, -5) == 0); }
测试不应该假设输入总是有效的。开发人员应该考虑无效输入的可能性,并在必要时验证输入。
实战案例:
@Test public void testSqrt() { assertTrue(Math.sqrt(4) == 2.0); }
该测试没有考虑 Math.sqrt
接受负数输入的情况,这会导致 IllegalArgumentException
。一个更健壮的测试应该如下所示:
@Test public void testSqrt() { assertTrue(Math.sqrt(4) == 2.0); try { Math.sqrt(-4); fail("Expected IllegalArgumentException"); } catch (IllegalArgumentException e) {} }
当测试函数依赖于第三方库时,如果不进行打桩,就可能导致测试失败或不稳定。打桩允许模拟第三方库的行为,以控制测试环境。
实战案例:
@Test public void testSendMail() { assertTrue(MailSender.sendMail("to@example.com", "subject", "body")); }
该测试没有打桩 MailSender
类,因此测试依赖于实际发送邮件的行为。这可能导致测试失败,或者在邮件发送失败时导致 flakiness。
函数可能抛出异常,而忘记测试这些异常可能会导致错误或不完整的测试覆盖率。
实战案例:
@Test public void testDivide() { assertTrue(Divider.divide(10, 2) == 5); }
该测试没有测试 Divider
类在输入为 0
时抛出的 ArithmeticException
@Test public void testDivide() { assertTrue(Divider.divide(10, 2) == 5); try { Divider.divide(10, 0); fail("Expected ArithmeticException"); } catch (ArithmeticException e) {} }2. Anggap input adalah sah 🎜🎜Pengujian seharusnya tidak menganggap bahawa input sentiasa sah. Pembangun harus mempertimbangkan kemungkinan input tidak sah dan mengesahkan input jika perlu. 🎜🎜🎜Kes praktikal: 🎜🎜rrreee🎜Ujian ini tidak mengambil kira kes di mana
Math.sqrt
menerima input negatif, yang akan menghasilkan IllegalArgumentException
. Ujian yang lebih mantap sepatutnya kelihatan seperti ini: 🎜rrreee🎜3 Tiada stub apabila bergantung pada perpustakaan pihak ketiga🎜🎜Apabila fungsi ujian bergantung pada perpustakaan pihak ketiga, jika stub tidak dilakukan, ujian mungkin gagal atau tidak stabil. . Stubbing membolehkan simulasi gelagat perpustakaan pihak ketiga untuk mengawal persekitaran ujian. 🎜🎜🎜Kes praktikal: 🎜🎜rrreee🎜Ujian ini tidak mencantas kelas MailSender
, jadi ujian bergantung pada tingkah laku sebenar menghantar e-mel. Ini boleh menyebabkan ujian gagal, atau menyebabkan kekeliruan jika e-mel gagal dihantar. 🎜🎜4 Lupa untuk menguji pengecualian 🎜🎜 Fungsi boleh membuang pengecualian, dan terlupa untuk menguji pengecualian ini boleh membawa kepada pepijat atau liputan ujian yang tidak lengkap. 🎜🎜🎜Kes praktikal: 🎜🎜rrreee🎜Ujian ini tidak menguji ArithmeticException
yang dilemparkan oleh kelas Divider
apabila input adalah 0
. Ujian yang lebih komprehensif akan kelihatan seperti ini: 🎜rrreeeAtas ialah kandungan terperinci Apakah perangkap biasa ujian fungsi Java?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!