2013-03-19 26 views

Trả lời

6

Một open issue trên repo github cho mẹ Eclemma của, jacoco, gợi ý rằng một tính năng như vậy sẽ thực sự là một chút khó khăn để bao gồm.

Tuy nhiên, ngay cả khi không có tính năng Eclemma, nếu mục tiêu chỉ là tìm ra các nhánh bị mất trong một trường hợp cụ thể, bạn có thể đặt mã của bạn để theo dõi. Ví dụ đơn giản nhất là báo cáo in lỗi thời cũ:

if (x || y) { 
    System.out.println("BRANCH: " + x + ", " + y); 
    // Do stuff 
} 

Sau đó nhìn vào sản lượng và xem những gì bạn thực sự chi nhánh nhấn (ví dụ java ... | grep "BRANCH:" | sort | uniq). (Không phải là terribly thỏa mãn, tôi biết.)

13

Điều gì có thể xy là?

  • true || trueđúng (Không bao trả vì JVM tối ưu hóa: nếu điều kiện đầu tiên là true, thứ hai sẽ không được đánh giá do đánh giá ngắn mạch)
  • false || trueđúng
  • true || falseđúng
  • false || falsefalse
+1

Câu hỏi đặt ra là, làm cách nào để biết những chi nhánh nào trong số này không được theo dõi? Tôi biết chắc chắn nó không phải là trường hợp giả/sai, vì trường hợp "khác" được thực hiện trong một số trường hợp. – tor

+7

Không phải là sự thật || trường hợp thực sự không được bảo hiểm? – Jason

+0

Tôi vừa vấp phải câu hỏi này - đã phải quay lại để nhớ các bảng chân lý logic kỹ thuật số cũ và các điều kiện "không quan tâm". –

0

Có thể có các chi nhánh tiềm ẩn hoặc từ các câu lệnh lồng nhau trong khối hoặc các câu lệnh if mở rộng các thuộc tính x hoặc y của bạn.

đọc này: http://emma.sourceforge.net/faq.html#q.fractional.examples

+0

Có, tôi đã tìm ra. Có 4 kết hợp khác nhau có thể có của các giá trị boolean x và y, và tôi đoán chỉ có ba trong số chúng được quan sát. Câu hỏi đặt ra là, làm cách nào tôi có thể biết trường hợp nào không xảy ra? Hay tương đương, những trường hợp nào đã được quan sát? – tor

+0

"1 trong 4 nhánh được che phủ" cho biết 3 nhánh không được che phủ. Tôi nghĩ rằng nó nên được rõ ràng (từ bảo hiểm nổi bật bên trong khối) mà đường dẫn mã không được bảo hiểm. –

+1

Xin lỗi, sai lầm của tôi hoàn toàn! Tin nhắn thực sự nói "1 trong số 4 chi nhánh đã bỏ lỡ". Tôi sẽ cập nhật ngay lập tức ... – tor

4

Câu trả lời được true|| true không được bảo hiểm.

Điều này là do một khi JVM đã tìm thấy điều kiện đầu tiên là đúng, sau đó nó sẽ không chạy điều kiện thứ hai (nó được tối ưu hóa) có nghĩa là phần mã không bao giờ chạy.

Như Maroun cho biết, 3 trong số 4 chi nhánh sẽ cho phép điều kiện vượt qua. Nếu bạn vẫn lo lắng về phạm vi mã, bạn có thể cấu trúc lại điều kiện là && thay vì ||.

(x || y) cũng giống như (!(!x && !y)) và điều này sẽ cho phép bạn kiểm tra tất cả các điều kiện vì hiện tại chỉ có ba nhánh.

Hình thức ban đầu của điều kiện thường được nhìn thấy trong báo cáo bảo vệ:

if (obj == null || obj.hasError()) 
{ 
    throw new RuntimeException(); 
} 

này sẽ không bao giờ cho phép bạn kiểm tra xem objnull VÀ có lỗi bởi vì nó sẽ ném một ngoại lệ Null Pointer.

Nếu mã số bảo hiểm là rất quan trọng, sau đó chỉ dùng biểu mẫu này:

if (!(obj != null && !obj.hasError())) 
{ 
    throw new RuntimeException(); 
} 
+1

hoặc có thể sử dụng toán tử mong muốn '|' hoặc '&' trừ khi bạn cố tình cắt ngắn các hoạt động, trong trường hợp đó bạn không bao giờ có thể nhận được toàn bộ chi nhánh. – tkokasih

+0

@BrettPyke tại sao có ba nhánh trong trường hợp '&&'? – ishan3243

+5

@BrettPyke nếu bạn chuyển đổi (x || y) thành! (! X &&! Y), bạn có cùng một vấn đề về lối tắt chung với biểu thức! (False && false). –

3

Có một woarkaround khá dễ dàng - chỉ cần đưa từng vị ngữ logic trong dòng riêng, như thế này:

if (x 
    || y) { 
    System.out.println("BRANCH: " + x + ", " + y); 
    // Do stuff 
} 

Bây giờ khi bạn sẽ chạy analisys, các điểm đánh dấu sẽ trỏ thẳng vào nhánh bị bỏ qua. Sau khi bạn sẽ bao gồm nó, bạn có thể định dạng lại mã của bạn đúng cách.

HTH

Các vấn đề liên quan