การใช้ 'ล้มเหลว' จริงในกรณีทดสอบ JUnit คืออะไร?
การใช้ 'ล้มเหลว' จริงในกรณีทดสอบ JUnit คืออะไร?
คำตอบ:
บางกรณีที่ฉันพบว่ามีประโยชน์:
try{ // do stuff... fail("Exception not thrown"); }catch(Exception e){ assertTrue(e.hasSomeFlag()); }
บันทึก:
ตั้งแต่ JUnit4 มีวิธีที่สวยงามกว่าในการทดสอบว่ามีการโยนข้อยกเว้น: ใช้คำอธิบายประกอบ @Test(expected=IndexOutOfBoundsException.class)
fail()
แต่นี้จะไม่ทำงานหากคุณยังต้องการที่จะตรวจสอบข้อยกเว้นแล้วคุณยังคงต้อง
สมมติว่าคุณกำลังเขียนกรณีทดสอบสำหรับโฟลว์เชิงลบซึ่งโค้ดที่กำลังทดสอบควรมีข้อยกเว้น
try{
bizMethod(badData);
fail(); // FAIL when no exception is thrown
} catch (BizException e) {
assert(e.errorCode == THE_ERROR_CODE_U_R_LOOKING_FOR)
}
ฉันคิดว่ากรณีการใช้งานปกติคือการเรียกใช้เมื่อไม่มีข้อยกเว้นเกิดขึ้นในการทดสอบเชิงลบ
บางอย่างเช่นรหัสหลอกต่อไปนี้:
test_addNilThrowsNullPointerException()
{
try {
foo.add(NIL); // we expect a NullPointerException here
fail("No NullPointerException"); // cause the test to fail if we reach this
} catch (NullNullPointerException e) {
// OK got the expected exception
}
}
ฉันเคยใช้มันในกรณีที่มีบางอย่างผิดปกติในเมธอด @Before ของฉัน
public Object obj;
@Before
public void setUp() {
// Do some set up
obj = new Object();
}
@Test
public void testObjectManipulation() {
if(obj == null) {
fail("obj should not be null");
}
// Do some other valuable testing
}
@Before
วิธีการนี้ประสบความสำเร็จคุณควรตรวจสอบโดยตรงในวิธีนั้น เป็นโบนัสอย่างน้อย JUnit และ TestNG จะรายงานความล้มเหลวที่แตกต่างกันสำหรับข้อผิดพลาดจาก@Before
/ @After
วิธีการดังนั้นจะเห็นได้ว่าปัญหาไม่ได้อยู่ในการทดสอบเอง
นี่คือวิธีที่ฉันใช้วิธี Fail
มีสามสถานะที่กรณีทดสอบของคุณสามารถจบลงได้
ตั้งใจ (ไม่เหมือนกรณีทดสอบเชิงลบที่คาดว่าจะมีข้อยกเว้นเกิดขึ้น)
หากคุณใช้ eclipse จะมีสามสถานะที่ระบุด้วยเครื่องหมายสีเขียวสีน้ำเงินและสีแดงตามลำดับ
ฉันใช้การดำเนินการที่ล้มเหลวสำหรับสถานการณ์ที่สาม
เช่น: public Integer add (จำนวนเต็ม a, Integer b) {return new Integer (a.intValue () + b.intValue ())}
fail()
ของคุณจะเห็นว่ายืนยันการใช้งาน
ตัวอย่างเช่นฉันใช้fail()
เพื่อระบุการทดสอบที่ยังไม่เสร็จสิ้น (เกิดขึ้น) มิฉะนั้นจะแสดงว่าประสบความสำเร็จ
นี่อาจเป็นเพราะฉันไม่ทราบถึงฟังก์ชันการทำงานที่ไม่สมบูรณ์ () บางประเภทซึ่งมีอยู่ใน NUnit
ในการตั้งค่าพร้อมกันและ / หรือไม่ตรงกันคุณอาจต้องการตรวจสอบว่าวิธีการบางอย่าง (ผู้ได้รับมอบหมายเช่นฟังเหตุการณ์ไสตอบสนองคุณชื่อมัน) จะไม่ได้เรียกว่า นอกเหนือจากกรอบการเยาะเย้ยแล้วคุณสามารถเรียกใช้fail()
วิธีการเหล่านั้นเพื่อให้การทดสอบล้มเหลว การหมดเวลาที่หมดอายุเป็นอีกหนึ่งเงื่อนไขความล้มเหลวตามธรรมชาติในสถานการณ์ดังกล่าว
ตัวอย่างเช่น:
final CountDownLatch latch = new CountDownLatch(1);
service.asyncCall(someParameter, new ResponseHandler<SomeType>() {
@Override
public void onSuccess(SomeType result) {
assertNotNull(result);
// Further test assertions on the result
latch.countDown();
}
@Override
public void onError(Exception e) {
fail(exception.getMessage());
latch.countDown();
}
});
if ( !latch.await(5, TimeUnit.SECONDS) ) {
fail("No response after 5s");
}
กรณีการใช้งานที่สำคัญที่สุดคือการตรวจสอบข้อยกเว้น
ในขณะที่ junit4 รวมองค์ประกอบที่คาดไว้สำหรับการตรวจสอบว่ามีข้อยกเว้นเกิดขึ้นหรือไม่ แต่ดูเหมือนว่าจะไม่ได้เป็นส่วนหนึ่งของ junit5 ที่ใหม่กว่า ข้อดีอีกอย่างของการใช้fail()
มากกว่าexpected
คือคุณสามารถใช้ร่วมกับการfinally
อนุญาตให้ล้างกรณีทดสอบได้
dao.insert(obj);
try {
dao.insert(obj);
fail("No DuplicateKeyException thrown.");
} catch (DuplicateKeyException e) {
assertEquals("Error code doesn't match", 123, e.getErrorCode());
} finally {
//cleanup
dao.delete(obj);
}
ตามที่ระบุไว้ในความคิดเห็นอื่น. การมีการทดสอบล้มเหลวจนกว่าคุณจะสามารถนำไปใช้งานได้เสร็จสิ้นมันก็ฟังดูสมเหตุสมผลเช่นกัน