JUnit บทช่วยสอนคำอธิบายประกอบพร้อมตัวอย่าง: @Test และ @After คืออะไร
⚡ สรุปอย่างชาญฉลาด
JUnit คำอธิบายประกอบเป็นรูปแบบหนึ่งของเมตาเดตาเชิงไวยากรณ์ที่เพิ่มเข้ามา Java โค้ดต้นฉบับจะช่วยให้โปรแกรมทดสอบทราบว่าต้องเรียกใช้เมธอดใด เมื่อใดจึงจะเรียกใช้ และแต่ละเมธอดใช้เวลานานเท่าใด

ความหมายของ JUnit คำอธิบายประกอบ?
JUnit คำอธิบายประกอบ เป็นรูปแบบพิเศษของเมตาเดตาเชิงไวยากรณ์ที่สามารถเพิ่มเข้าไปได้ Java โค้ดต้นฉบับช่วยให้การอ่านและการจัดโครงสร้างโค้ดดีขึ้น ตัวแปร พารามิเตอร์ แพ็กเกจ เมธอด และคลาสสามารถใส่คำอธิบายประกอบได้ คำอธิบายประกอบถูกนำมาใช้ใน JUnit 4 ซึ่งทำให้ Java โค้ดอ่านง่ายและเรียบง่ายขึ้น นี่คือความแตกต่างที่สำคัญระหว่าง JUnit 3 และ JUnit 4: JUnit 4 คือแบบอิงตามคำอธิบายประกอบ
ด้วยความรู้พื้นฐานเกี่ยวกับคำอธิบายประกอบเหล่านี้ ทำให้สามารถเรียนรู้และนำไปใช้ได้อย่างง่ายดาย JUnit ทดสอบ. ด้านล่างนี้คือสิ่งสำคัญและใช้บ่อย JUnit รายการคำอธิบายประกอบ พร้อมด้วย JUnit 5 (ดาวพฤหัสบดี) เทียบเท่าข้างๆ แต่ละรายการ:
| S.No. | คำอธิบายประกอบ | Descriptไอออน | JUnit เทียบเท่า 5 |
|---|---|---|---|
| 1. | @ทดสอบ | คำอธิบายประกอบนี้ใช้แทน junit.framework.TestCase และระบุว่าเมธอดสาธารณะแบบ void ที่แนบมาด้วยนั้นสามารถเรียกใช้เป็นกรณีทดสอบได้ | @Test (org.junit.jupiter.api) |
| 2. | @ก่อน | คำอธิบายประกอบนี้ถูกใช้หากคุณต้องการดำเนินการคำสั่งบางอย่าง เช่น เงื่อนไขเบื้องต้น ก่อนกรณีทดสอบแต่ละกรณี | @ก่อนแต่ละ |
| 3. | @บีฟอร์คลาส | คำอธิบายประกอบนี้ใช้ในกรณีที่คุณต้องการเรียกใช้คำสั่งบางอย่างก่อนเริ่มกรณีทดสอบทั้งหมด ตัวอย่างเช่น การเชื่อมต่อทดสอบที่ต้องเปิดก่อนเริ่มกรณีทดสอบทั้งหมด | @ก่อนทั้งหมด |
| 4. | @หลังจาก | คำอธิบายประกอบนี้สามารถใช้ได้หากคุณต้องการดำเนินการคำสั่งบางคำสั่งหลังจากนั้น กรณีทดสอบเช่น การรีเซ็ตตัวแปร หรือการลบไฟล์ชั่วคราว | @AfterEach |
| 5. | @หลังเลิกเรียน | คำอธิบายประกอบนี้สามารถใช้ได้หากคุณต้องการเรียกใช้คำสั่งบางอย่างหลังจากทดสอบเสร็จสิ้นทุกกรณีแล้ว ตัวอย่างเช่น การปล่อยทรัพยากรหลังจากทดสอบเสร็จสิ้นทุกกรณี | @AfterAll |
| 6. | @ไม่สนใจ | คำอธิบายประกอบนี้สามารถใช้ได้หากคุณต้องการละเว้นคำสั่งบางคำสั่งระหว่างการดำเนินการทดสอบ ตัวอย่างเช่น การปิดใช้งานกรณีทดสอบบางกรณีระหว่างการดำเนินการทดสอบ | @พิการ |
| 7. | @ ทดสอบ (หมดเวลา = 500) | คำอธิบายประกอบนี้สามารถใช้ได้หากคุณต้องการตั้งค่าการหมดเวลาในระหว่างการดำเนินการทดสอบ ตัวอย่างเช่น หากคุณทำงานภายใต้ SLA (ข้อตกลงระดับบริการ) และการทดสอบต้องเสร็จสิ้นภายในเวลาที่กำหนด | @Timeout หรือ assertTimeout |
| 8. | @Test (คาดหวัง = IllegalArgumentException.class) | คำอธิบายประกอบนี้สามารถใช้ได้หากคุณต้องการจัดการกับข้อยกเว้นบางอย่างระหว่างการดำเนินการทดสอบ ตัวอย่างเช่น หากคุณต้องการตรวจสอบว่าเมธอดใดเมธอดหนึ่งกำลังส่งข้อยกเว้นที่ระบุหรือไม่ | assertThrows |
JUnit ตัวอย่างคำอธิบายประกอบ
มาสร้างคลาสที่ครอบคลุมเรื่องสำคัญกันเถอะ JUnit คำอธิบายประกอบด้วยคำสั่งการพิมพ์อย่างง่ายและดำเนินการกับคลาสตัวทดสอบ:
ขั้นตอน 1) พิจารณาสิ่งต่อไปนี้ Java คลาสที่มีเมธอดต่างๆ ซึ่งเชื่อมโยงกับคำอธิบายประกอบที่ระบุไว้ข้างต้น:
ตัวอย่าง JunitAnnotations.java
package guru99.junit; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import java.util.ArrayList; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; public class JunitAnnotationsExample { private ArrayList<String> list; @BeforeClass public static void m1() { System.out.println("Using @BeforeClass , executed before all test cases "); } @Before public void m2() { list = new ArrayList<String>(); System.out.println("Using @Before annotations ,executed before each test cases "); } @AfterClass public static void m3() { System.out.println("Using @AfterClass ,executed after all test cases"); } @After public void m4() { list.clear(); System.out.println("Using @After ,executed after each test cases"); } @Test public void m5() { list.add("test"); assertFalse(list.isEmpty()); assertEquals(1, list.size()); } @Ignore public void m6() { System.out.println("Using @Ignore , this execution is ignored"); } @Test(timeout = 10) public void m7() { System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case"); } @Test(expected = NoSuchMethodException.class) public void m8() { System.out.println("Using @Test(expected) ,it will check for specified exception during its execution"); } }
ขั้นตอน 2) เรามาสร้างคลาสสำหรับรันการทดสอบเพื่อเรียกใช้การทดสอบข้างต้นกัน:
TestRunner.java
package guru99.junit; import org.junit.runner.JUnitCore; import org.junit.runner.Result; import org.junit.runner.notification.Failure; public class TestRunner { public static void main(String[] args) { Result result = JUnitCore.runClasses(JunitAnnotationsExample.class); for (Failure failure : result.getFailures()) { System.out.println(failure.toString()); } System.out.println("Result=="+result.wasSuccessful()); } }
ผลลัพธ์ที่คาดหวัง
- ระบบจะดำเนินการทดสอบทีละกรณี และสามารถดูผลลัพธ์ทั้งหมดได้ในคอนโซล
- ตามที่ได้กล่าวไว้ในตารางด้านบน @Before และ @BeforeClass ใน JUnit [เมธอด m2() และ m1()] จะถูกเรียกใช้ก่อนแต่ละกรณีทดสอบและก่อนทุกกรณีทดสอบตามลำดับ
- ในทำนองเดียวกัน @After และ @AfterClass ใน JUnit เมธอด m4() และ m3() จะถูกเรียกใช้หลังจากแต่ละกรณีทดสอบและหลังจากทุกกรณีทดสอบตามลำดับ @Ignore (เมธอด m6()) จะถือว่าเป็นการละเว้นการทดสอบ
เรามาวิเคราะห์กรณีทดสอบที่ใช้ในข้างต้นกัน Java รายละเอียดของคลาส:
- พิจารณาวิธี m5() ดังแสดงด้านล่าง:
@Test
public void m5() {
list.add("test");
assertFalse(list.isEmpty());
assertEquals(1, list.size());
}
ในวิธีการข้างต้น คุณกำลังเพิ่มสตริงลงในตัวแปร "list":
- รายการ.isEmpty() จะกลับมาเป็นเท็จ
- assertFalse (รายการ isEmpty ()) จะต้องกลับมาเป็นจริง
- เป็นผลให้กรณีทดสอบจะ ส่ง.
เนื่องจากคุณเพิ่มสตริงลงในรายการเพียงสตริงเดียว ขนาดของรายการจึงเป็นหนึ่ง
- รายการ.ขนาด() ต้องส่งค่าจำนวนเต็ม "1" กลับมา
- So assertEquals(1, list.size()) จะต้องกลับมาเป็นจริง
- เป็นผลให้กรณีทดสอบจะ ส่ง.
- พิจารณาวิธี m7() ดังแสดงด้านล่าง:
@Test(timeout = 10)
public void m7() {
System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case");
}
ตามที่กล่าวไว้ข้างต้น @ ทดสอบ (หมดเวลา = 10) ใช้เพื่อบังคับใช้การหมดเวลาในกรณีทดสอบ ค่าที่ระบุเป็นมิลลิวินาที ดังนั้นฟังก์ชัน m7() ต้องทำงานให้เสร็จภายใน 10 มิลลิวินาที
- พิจารณาวิธี m8() ดังแสดงด้านล่าง:
@Test(expected = NoSuchMethodException.class) public void m8() { System.out.println("Using @Test(expected) ,it will check for specified exception during its execution"); }
ตามที่กล่าวไว้ข้างต้น @ทดสอบ(คาดหวัง) เมธอด m8() จะตรวจสอบข้อยกเว้นที่ระบุไว้ในระหว่างการทำงาน ดังนั้นเมธอด m8() จะโยนข้อยกเว้น “No Such Method Exception” ส่งผลให้การทดสอบจะดำเนินการโดยมีข้อยกเว้นเกิดขึ้น
หมายเหตุความถูกต้อง: ฟังก์ชัน m8() จะพิมพ์เพียงบรรทัดเดียว ดังนั้นข้อยกเว้นที่ประกาศไว้จึงไม่ถูกโยนออกมาจริง ๆ และ JUnit 4 รายงานว่าการทดสอบล้มเหลว ปรับประเภทที่คาดหวังให้ตรงกับสิ่งที่เมธอดส่งออกมาจริง JUnit 5 เขียนข้อความนี้ด้วย assertThrows.
เมื่อผ่านกรณีทดสอบทั้งหมดแล้ว จึงส่งผลให้ดำเนินการทดสอบได้สำเร็จ
ผลลัพธ์ที่แท้จริง
เนื่องจากในตัวอย่างข้างต้นมีกรณีทดสอบสามกรณี ดังนั้นกรณีทดสอบทั้งหมดจะถูกดำเนินการทีละกรณี โปรดดูภาพหน้าจอคอนโซลด้านล่าง:

ดูคำสั่งการพิมพ์ด้านล่างซึ่งสามารถเห็นได้บนคอนโซล:
ใช้ @BeforeClass ดำเนินการก่อนกรณีทดสอบทั้งหมด
การใช้ @Before คำอธิบายประกอบ ดำเนินการก่อนแต่ละกรณีทดสอบ
ใช้ @After ดำเนินการหลังจากแต่ละกรณีทดสอบ
การใช้ @Before คำอธิบายประกอบ ดำเนินการก่อนแต่ละกรณีทดสอบ
การใช้ @Test(timeout) สามารถใช้เพื่อบังคับใช้การหมดเวลาได้ JUnit4 กรณีทดสอบ
ใช้ @After ดำเนินการหลังจากแต่ละกรณีทดสอบ
การใช้ @Before คำอธิบายประกอบ ดำเนินการก่อนแต่ละกรณีทดสอบ
เมื่อใช้ @Test(expected) มันจะตรวจสอบข้อยกเว้นที่ระบุระหว่างการดำเนินการ
ใช้ @After ดำเนินการหลังจากแต่ละกรณีทดสอบ
ใช้ @AfterClass ดำเนินการหลังจากกรณีทดสอบทั้งหมด
JUnit ยืนยันคลาส
คำอธิบายประกอบจะเป็นตัวกำหนดว่าเมธอดจะทำงานเมื่อใด ส่วนเมธอด assert จะเป็นตัวกำหนดว่าเมธอดนั้นผ่านหรือไม่
คลาสนี้มีเมธอดตรวจสอบความถูกต้องมากมายซึ่งมีประโยชน์ในการเขียนกรณีทดสอบ หากเงื่อนไขการตรวจสอบความถูกต้องทั้งหมดผ่าน การทดสอบจะประสบความสำเร็จ หากเงื่อนไขการตรวจสอบความถูกต้องใด ๆ ล้มเหลว การทดสอบจะล้มเหลว (ส่วนนี้เป็นส่วนเฉพาะของคลาส) JUnit ยืนยัน คู่มือนี้จะอธิบายแต่ละวิธีอย่างละเอียด
ดังที่คุณได้เห็นไปแล้ว ตารางด้านล่างนี้อธิบายถึงวิธีการ Assert ที่สำคัญและคำอธิบายของแต่ละวิธี:
| S.No. | วิธี | Descriptไอออน |
|---|---|---|
| 1. | เป็นโมฆะ assertEquals (บูลีนที่คาดหวัง, บูลีนจริง) | ฟังก์ชันนี้ตรวจสอบว่าค่าสองค่าเท่ากันหรือไม่ คล้ายกับเมธอด equals ของคลาส Object |
| 2. | เป็นโมฆะ assertFalse (เงื่อนไขบูลีน) | หน้าที่การทำงานคือการตรวจสอบว่าเงื่อนไขนั้นเป็นเท็จ |
| 3. | เป็นโมฆะ assertNotNull (วัตถุวัตถุ) | ฟังก์ชั่น “assertNotNull” คือการตรวจสอบว่าวัตถุไม่เป็นโมฆะ |
| 4. | เป็นโมฆะ assertNull (วัตถุวัตถุ) | ฟังก์ชั่น "assertNull" คือการตรวจสอบว่าวัตถุนั้นเป็นโมฆะ |
| 5. | เป็นโมฆะ assertTrue (เงื่อนไขบูลีน) | ฟังก์ชั่น assertTrue คือการตรวจสอบว่าเงื่อนไขเป็นจริง |
| 6. | เป็นโมฆะล้มเหลว () | หากคุณต้องการโยนข้อผิดพลาดการยืนยัน (assertion error) ฟังก์ชัน fail() จะส่งผลให้ได้ผลลัพธ์เป็น fail เสมอ |
| 7. | เป็นโมฆะ assertSame ([ข้อความสตริง] | ฟังก์ชั่น "assertSame" คือการตรวจสอบว่าวัตถุทั้งสองอ้างอิงถึงวัตถุเดียวกัน |
| 8. | เป็นโมฆะ assertNotSame ([ข้อความสตริง] | ฟังก์ชั่น "assertNotSame" คือการตรวจสอบว่าทั้งสองวัตถุไม่ได้อ้างถึงวัตถุเดียวกัน |
JUnit คลาสกรณีทดสอบ
ในการทำการทดสอบหลายครั้ง สามารถใช้คลาส TestCase ได้ เฟรมเวิร์กจูนิท แพ็คเกจ คำอธิบายประกอบ @Test บอกว่า JUnit เมธอดสาธารณะแบบ void นี้ (ซึ่งเป็นกรณีทดสอบในที่นี้) ที่แนบมาด้วย สามารถเรียกใช้เป็นกรณีทดสอบได้
หมายเหตุเกี่ยวกับเวอร์ชัน: กรณีทดสอบ, ผลการทดสอบ และ ชุดทดสอบ เป็นมรดก เฟรมเวิร์กจูนิท แพคเกจจาก JUnit 3. ถึงแม้ว่าการทดสอบแบบใช้คำอธิบายประกอบ (annotation-based tests) จะยังคงถูกจัดส่งมาพร้อมกับอาร์ติแฟกต์ JUnit 4.x แต่ก็ไม่ได้ขยายขอบเขตการใช้งาน TestCase
ตารางด้านล่างแสดงวิธีการสำคัญบางส่วนที่มีอยู่ใน จูนิท เฟรมเวิร์ก กรณีทดสอบ ระดับ:
| S.No. | วิธี | Descriptไอออน |
|---|---|---|
| 1. | int นับ TestCases () | วิธีการนี้ใช้สำหรับนับจำนวนเคสทดสอบที่ถูกดำเนินการโดยระบบ วิ่ง (TestResult tr) วิธี |
| 2. | TestResult สร้างผลลัพธ์ () | วิธีการนี้ใช้ในการสร้าง ผลการทดสอบ วัตถุ. |
| 3. | สตริง getName() | เมธอดนี้ส่งคืนสตริงซึ่งไม่ใช่อะไรเลยนอกจากก กรณีทดสอบ ชื่อ |
| 4. | เรียกใช้ผลการทดสอบ () | วิธีนี้ใช้ในการดำเนินการทดสอบ ซึ่งจะส่งค่ากลับมาเป็น ผลการทดสอบ วัตถุ. |
| 5. | ถือเป็นโมฆะ (ผลการทดสอบ) | วิธีการนี้ใช้ในการดำเนินการทดสอบที่มี ผลการทดสอบ วัตถุที่ไม่ส่งค่าใดๆ กลับมา |
| 6. | เป็นโมฆะ setName (ชื่อสตริง) | วิธีนี้ใช้สำหรับกำหนดชื่อของ กรณีทดสอบ |
| 7. | การตั้งค่าเป็นโมฆะ() | วิธีการนี้ใช้ในการเขียนโค้ดสำหรับการเชื่อมโยงทรัพยากร เช่น การสร้างการเชื่อมต่อฐานข้อมูล |
| 8. | โมฆะการฉีกขาด () | วิธีการนี้ใช้ในการเขียนโค้ดเพื่อปล่อยทรัพยากร เช่น การปล่อยการเชื่อมต่อฐานข้อมูลหลังจากดำเนินการธุรกรรมเสร็จสิ้น |
JUnit คลาสผลการทดสอบ
เมื่อคุณทำการทดสอบ ระบบจะส่งผลลัพธ์กลับมา (ในรูปแบบของ ผลการทดสอบ อ็อบเจ็กต์ TestResult นี้สามารถใช้วิเคราะห์อ็อบเจ็กต์ผลลัพธ์ได้ ผลการทดสอบนี้อาจเป็นความล้มเหลวหรือความสำเร็จก็ได้
โปรดดูตารางด้านล่างสำหรับวิธีการสำคัญที่ใช้ในคลาส junit.framework.TestResult:
| S.No. | วิธี | Descriptไอออน |
|---|---|---|
| 1. | เป็นโมฆะ addError (ทดสอบการทดสอบ Throwable t) | วิธีนี้ใช้ในกรณีที่คุณต้องการเพิ่มข้อผิดพลาดลงในการทดสอบ |
| 2. | addFailure เป็นโมฆะ (ทดสอบการทดสอบ AssertionFailedError t) | วิธีนี้ใช้ในกรณีที่คุณต้องการเพิ่มความล้มเหลวลงในรายการความล้มเหลว |
| 3. | โมฆะ endTest (ทดสอบทดสอบ) | วิธีการนี้ใช้เพื่อแจ้งให้ทราบว่าการทดสอบได้ดำเนินการแล้ว (เสร็จสมบูรณ์) |
| 4. | int errorCount () | วิธีการนี้ใช้เพื่อตรวจสอบข้อผิดพลาดที่ตรวจพบระหว่างการทดสอบ |
| 5. | การแจกแจง ข้อผิดพลาด() | เมธอดนี้จะส่งคืนชุดข้อผิดพลาด (ในที่นี้คือ Enumeration) |
| 6. | int ความล้มเหลวนับ() | วิธีการนี้ใช้เพื่อนับจำนวนข้อผิดพลาดที่ตรวจพบระหว่างการดำเนินการทดสอบ |
| 7. | การรันเป็นโมฆะ (การทดสอบ TestCase) | วิธีการนี้ใช้เพื่อดำเนินการกรณีทดสอบ |
| 8. | int runCount () | วิธีการนี้จะนับจำนวนการทดสอบที่ดำเนินการไปแล้ว |
| 9. | โมฆะ startTest (ทดสอบการทดสอบ) | วิธีการนี้ใช้เพื่อแจ้งว่าการทดสอบเริ่มต้นแล้ว |
| 10. | โมฆะหยุด () | วิธีนี้ใช้เพื่อหยุดการทดสอบ |
JUnit คลาสชุดทดสอบ
หากคุณต้องการเรียกใช้การทดสอบหลายรายการตามลำดับที่กำหนด คุณสามารถทำได้โดยการรวมการทดสอบทั้งหมดไว้ในที่เดียว สถานที่นี้เรียกว่าชุดทดสอบ และ JUnit ชุดทดสอบ คู่มือนี้จะอธิบายตัวอย่างโดยละเอียด
โปรดดูตารางด้านล่างสำหรับวิธีการสำคัญที่ใช้ใน จูนิท เฟรมเวิร์ก ชุดทดสอบ ระดับ:
| S.No. | วิธี | Descriptไอออน |
|---|---|---|
| 1. | เป็นโมฆะ addTest (ทดสอบการทดสอบ) | วิธีการนี้ใช้ถ้าคุณต้องการเพิ่มการทดสอบลงในชุดโปรแกรม |
| 2. | เป็นโมฆะ addTestSuite (Class คลาสทดสอบ) | วิธีการนี้ใช้ถ้าคุณต้องการระบุคลาสในขณะที่เพิ่มการทดสอบลงในชุดโปรแกรม |
| 3. | int นับ TestCases () | วิธีการนี้ใช้ถ้าคุณต้องการนับจำนวนกรณีทดสอบ |
| 4. | สตริง getName() | วิธีนี้ใช้เพื่อรับชื่อของชุดทดสอบ |
| 5. | ถือเป็นโมฆะ (ผลการทดสอบ) | วิธีการนี้ใช้ในการดำเนินการทดสอบและรวบรวมผลการทดสอบในรูปแบบไฟล์ ผลการทดสอบ วัตถุ. |
| 6. | เป็นโมฆะ setName (ชื่อสตริง) | วิธีนี้ใช้สำหรับกำหนดชื่อของ ชุดทดสอบ. |
| 7. | ทดสอบ testAt (ดัชนี int) | วิธีนี้ใช้ในกรณีที่คุณต้องการส่งคืนค่าการทดสอบที่ดัชนีที่กำหนด |
| 8. | int testCount () | วิธีนี้ใช้ในกรณีที่คุณต้องการส่งคืนจำนวนการทดสอบในชุดทดสอบ |
| 9. | คำเตือนการทดสอบแบบคงที่ (ข้อความสตริง) | วิธีนี้จะส่งคืนการทดสอบซึ่งจะล้มเหลวและบันทึกข้อความเตือน |
