Tôi đang tự hỏi liệu việc đo độ bao phủ mã có điều kiện bằng các công cụ hiện tại cho Java không bị lỗi thời kể từ khi Java 8 xuất hiện. Với Java 8 Optional
và Stream
chúng ta thường có thể tránh các nhánh / vòng mã, điều này giúp dễ dàng có được phạm vi điều kiện rất cao mà không cần kiểm tra tất cả các đường dẫn thực thi có thể. Hãy so sánh mã Java cũ với mã Java 8:
Trước Java 8:
public String getName(User user) {
if (user != null) {
if (user.getName() != null) {
return user.getName();
}
}
return "unknown";
}
Có 3 đường dẫn thực thi có thể trong phương thức trên. Để có được 100% bảo hiểm có điều kiện, chúng tôi cần tạo 3 bài kiểm tra đơn vị.
Java 8:
public String getName(User user) {
return Optional.ofNullable(user)
.map(User::getName)
.orElse("unknown");
}
Trong trường hợp này, các chi nhánh bị ẩn và chúng tôi chỉ cần 1 thử nghiệm để được bảo hiểm 100% và chúng tôi sẽ không kiểm tra trường hợp nào. Mặc dù vẫn còn 3 nhánh logic giống nhau nên được bảo vệ. Tôi nghĩ rằng nó làm cho số liệu thống kê bảo hiểm có điều kiện hoàn toàn không đáng tin cậy những ngày này.
Liệu nó có ý nghĩa để đo mức độ bao phủ có điều kiện cho mã Java 8? Có bất kỳ công cụ khác phát hiện mã được thực hiện?
getName
gì? Có vẻ như là nếu user
null, nó sẽ trả về "không xác định". Nếu user
không phải là null và user.getName()
là null, nó sẽ trả về "không xác định". Nếu user
không phải là null và user.getName()
không phải là null, nó sẽ trả về điều đó. Vì vậy, bạn sẽ kiểm tra đơn vị ba trường hợp đó bởi vì đó là những gì hợp đồng getName
nói về. Bạn dường như đang làm điều đó lạc hậu. Bạn không muốn xem các chi nhánh và viết các bài kiểm tra theo những điều đó, bạn muốn viết các bài kiểm tra của mình theo hợp đồng của bạn và đảm bảo hợp đồng được điền đầy đủ. Đó là khi bạn có phạm vi bảo hiểm tốt.