ฉันสงสัยว่าการวัดการครอบคลุมโค้ดตามเงื่อนไขด้วยเครื่องมือปัจจุบันสำหรับ Java นั้นไม่ล้าสมัยหรือไม่นับตั้งแต่ Java 8 ออกมา ด้วย Java 8's Optional
และStream
เราสามารถหลีกเลี่ยงโค้ดย่อย / ลูปได้ซึ่งทำให้ง่ายต่อการได้รับความคุ้มครองตามเงื่อนไขสูงมากโดยไม่ต้องทดสอบพา ธ การประมวลผลที่เป็นไปได้ทั้งหมด ลองเปรียบเทียบโค้ด Java เก่ากับโค้ด Java 8:
ก่อน Java 8:
public String getName(User user) {
if (user != null) {
if (user.getName() != null) {
return user.getName();
}
}
return "unknown";
}
มี 3 เส้นทางการประมวลผลที่เป็นไปได้ในวิธีการข้างต้น เพื่อให้ได้ความคุ้มครองตามเงื่อนไข 100% เราจำเป็นต้องสร้างการทดสอบ 3 ชุด
Java 8:
public String getName(User user) {
return Optional.ofNullable(user)
.map(User::getName)
.orElse("unknown");
}
ในกรณีนี้สาขาถูกซ่อนไว้และเราต้องการเพียง 1 การทดสอบเพื่อให้ได้ความคุ้มครอง 100% และไม่สำคัญว่าเราจะทดสอบกรณีใด แม้ว่าฉันจะยังคงมี 3 สาขาตรรกะเดียวกันซึ่งฉันควรจะครอบคลุม ฉันคิดว่ามันทำให้สถิติความครอบคลุมตามเงื่อนไขไม่น่าเชื่อถืออย่างสมบูรณ์ในทุกวันนี้
มันสมเหตุสมผลหรือไม่ที่จะวัดความครอบคลุมตามเงื่อนไขสำหรับโค้ด Java 8? มีเครื่องมืออื่น ๆ ที่จำรหัสได้หรือไม่?
getName
อะไร มันน่าจะเป็นว่าถ้าuser
เป็นโมฆะก็ควรกลับ "ไม่ทราบ" หากuser
ไม่ใช่โมฆะและuser.getName()
เป็นโมฆะมันควรกลับ "ไม่ทราบ" หากuser
ไม่ใช่โมฆะและuser.getName()
ไม่เป็นโมฆะก็ควรคืนค่านั้น ดังนั้นคุณจะทดสอบหน่วยทั้งสามกรณีเพราะนั่นคือสัญญาที่getName
เกี่ยวข้อง คุณดูเหมือนจะทำมันย้อนหลัง คุณไม่ต้องการเห็นสาขาและเขียนการทดสอบตามที่คุณต้องการที่จะเขียนการทดสอบของคุณตามสัญญาของคุณและให้แน่ใจว่าสัญญาเต็ม นั่นคือเมื่อคุณมีความคุ้มครองที่ดี