6.1 ยืนยัน
การยืนยันคือการตรวจสอบพิเศษที่สามารถแทรกในตำแหน่งต่างๆ ในโค้ดได้ หน้าที่ของพวกเขาคือพิจารณาว่ามีบางอย่างผิดพลาด หรือเพื่อตรวจสอบว่าทุกอย่างเป็นไปตามที่ควร นี่คือ "ตามต้องการ" และอนุญาตให้คุณตั้งค่าได้หลายวิธี
คุณได้พบการยืนยันบางอย่างในโค้ดด้านบนแล้ว สิ่งแรกคือการตรวจสอบวัตถุเพื่อความเท่าเทียมกัน หากวัตถุไม่เท่ากัน จะเกิดข้อยกเว้นและการทดสอบจะล้มเหลว
ลำดับของการเปรียบเทียบมีความสำคัญที่นี่เนื่องจาก JUnit ในรายงานขั้นสุดท้ายจะเขียนบางอย่างเช่น "มูลค่า 1 ได้รับ แต่คาดหวัง 3" รูปแบบทั่วไปสำหรับการตรวจสอบดังกล่าวคือ:
assertEquals(standard , meaning)
ตัวอย่าง:
@Test
public void whenAssertingEquality () {
String expected = "3.1415";
String actual = "3";
assertEquals(expected, actual);
}
6.2 เมธอด assertEquals, assertTrue, assertFalse
ด้านล่างนี้ฉันจะแสดงวิธีการยอดนิยม - การยืนยัน จากชื่อของพวกเขามันค่อนข้างเป็นไปได้ที่จะเดาว่ามันทำงานอย่างไร แต่ฉันจะเขียนคำอธิบายสั้น ๆ ต่อไป:
ยืนยันเท่ากับ | ตรวจสอบว่าวัตถุสองชิ้นมีค่าเท่ากัน |
---|---|
assertArrayEquals | ตรวจสอบว่าสองอาร์เรย์มีค่าเท่ากันหรือไม่ |
ยืนยันไม่ใช่ Null | ตรวจสอบว่าอาร์กิวเมนต์ไม่เป็นโมฆะหรือไม่ |
ยืนยันเป็นโมฆะ | ตรวจสอบว่าอาร์กิวเมนต์เป็นโมฆะหรือไม่ |
ยืนยันว่าไม่เหมือนกัน | ตรวจสอบว่าอาร์กิวเมนต์ทั้งสองไม่ใช่วัตถุเดียวกัน |
ยืนยันเหมือนกัน | ตรวจสอบว่าอาร์กิวเมนต์ทั้งสองเป็นวัตถุเดียวกัน |
ยืนยันจริง | ตรวจสอบว่าอาร์กิวเมนต์เป็นจริง หรือไม่ |
ยืนยันเท็จ | ตรวจสอบว่าอาร์กิวเมนต์เป็นเท็จหรือไม่ |
วิธีการเหล่านี้บางส่วนดูเหมือนซ้ำซ้อน เหตุใดจึงต้องใช้assertSame(a, b)เมื่อคุณสามารถเขียนassertTrue(a == b)ได้
ประเด็นก็คือการยืนยันเป็นวิธีที่ฉลาดมาก มันทำสิ่งที่มีประโยชน์มากมาย รวมทั้ง เขียนข้อมูลข้อ ผิดพลาดลงในบันทึก ในกรณีแรก จะเขียนว่าคาดหวังวัตถุ A แต่ได้รับวัตถุ B ในกรณีที่ สองจะเขียนว่า คาดว่าจะเป็นจริง
เมื่อคุณมีการทดสอบหลายร้อยรายการ โดยเฉพาะอย่างยิ่งการทดสอบที่ทำงานบนเซิร์ฟเวอร์ทดสอบโดยเฉพาะ การมีบันทึกโดยละเอียดจะเป็นประโยชน์อย่างมาก ฉันคิดว่าคุณเข้าใจสิ่งที่ฉันหมายถึง
ตัวอย่างการเปรียบเทียบอาร์เรย์:
@Test
public void whenAssertingArraysEquality() {
char[] expected = {'J','u','n','i','t'};
char[] actual = "Junit".toCharArray();
assertArrayEquals(expected, actual);
}
6.3 วิธียืนยันทั้งหมด
ดังที่ได้กล่าวไว้ข้างต้นassert method ไม่เพียงแต่ทำการตรวจสอบเท่านั้น แต่ยังเขียนข้อมูลจำนวนมากเกี่ยวกับวัตถุที่เทียบเคียงได้ลงในบันทึกอีกด้วย
มาทำการเปรียบเทียบ:
Address address = unitUnderTest.methodUnderTest();
assertEquals("Washington", address.getCity());
assertEquals("Oracle Parkway", address.getStreet());
assertEquals("500", address.getNumber());
แต่ถ้าพารามิเตอร์ตัวใดตัวหนึ่งไม่ตรงกัน ส่วนที่เหลือจะไม่ถูกตรวจสอบ แต่ฉันต้องการให้พวกเขายังคงเกิดขึ้นและผลลัพธ์ของพวกเขาจะถูกบันทึกไว้ในบันทึก แต่ในเวลาเดียวกัน หากการตรวจสอบอย่างน้อยหนึ่งครั้งล้มเหลว แสดงว่าการทดสอบยังคงล้มเหลว
มีวิธีการพิเศษสำหรับสิ่งนี้ - assertAll () ในฐานะที่เป็นอาร์กิวเมนต์แรก จะต้องมีความคิดเห็นที่จะเขียนลงในบันทึก จากนั้นจึงใช้ฟังก์ชันยืนยันจำนวนเท่าใดก็ได้
นี่คือวิธีที่ตัวอย่างของเราจะถูกเขียนใหม่ด้วย:
Address address = unitUnderTest.methodUnderTest();
assertAll("Complex address comparison script",
() -> assertEquals("Washington", address.getCity()),
() -> assertEquals("Oracle Parkway", address.getStreet()),
() -> assertEquals("500", address.getNumber())
);
จากนั้นหากที่อยู่ไม่ถูกต้อง สิ่งนี้จะถูกเขียนลงในบันทึก:
Complex scenario comparison address (3 failures)
expected: <Washington> but was: <Seattle>
expected: <Oracle Parkway> but was: <Main Street>
expected: <500> but was: <5772>
6.4 วิธี assertTimeout
จำคำ อธิบายประกอบ @Timeoutได้ไหม อนุญาตให้ควบคุมเวลาดำเนินการของวิธีการทั้งหมด แต่บางครั้งการตั้งข้อจำกัดในการทำงานของโค้ดบางส่วนภายในเมธอดก็มีประโยชน์ คุณสามารถใช้assertTimeout() สำหรับ สิ่ง นี้
เวลาจะถูกส่งผ่านเป็นพารามิเตอร์แรก และรหัส (ฟังก์ชัน) ที่ต้องดำเนินการภายในเวลาที่กำหนดจะถูกส่งผ่านเป็นวินาที ตัวอย่าง:
@Test
public void whenAssertingTimeout() {
assertTimeout(
ofSeconds(2),
() -> {
// pause for one second
Thread.sleep(1000);
}
);
}
คลาสAssertมี 12 ตัวแปรของassertTimeout() วิธี การ หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับพวกเขา ยินดีต้อนรับสู่เอกสาร อย่างเป็นทางการ
6.5 วิธีการยืนยันการโยน
บ่อยครั้งที่มีบางสถานการณ์ที่คุณจำเป็นต้องตรวจสอบให้แน่ใจว่าในบางสถานการณ์ โค้ดแสดงข้อยกเว้นที่ถูกต้อง: ตรวจพบข้อผิดพลาดและส่งข้อยกเว้นที่ถูกต้อง นี่เป็นสถานการณ์ที่พบบ่อยมาก
ในกรณีนี้ มี วิธี การยืนยัน ที่มีประโยชน์อีกวิธีหนึ่ง นั่นคือassertThrows( ) รูปแบบทั่วไปของการโทรคือ:
assertThrows(exception , code)
โดยพื้นฐานแล้ว จะคล้ายกับassertTimeout() method มาก แต่จะตรวจสอบว่าโค้ดที่ระบุส่งข้อยกเว้นที่ถูกต้องหรือไม่ ตัวอย่าง:
@Test
void whenAssertingException() {
Throwable exception = assertThrows(
IllegalArgumentException.class,
() -> {
throw new IllegalArgumentException("Exception message");
}
);
assertEquals("Exception message", exception.getMessage());
}
GO TO FULL VERSION