2013-01-25 43 views
11

Phạm vi tuyên bố được cho là đảm bảo rằng mọi câu lệnh trong mã được thực thi ít nhất một lần.
Phạm vi quyết định/chi nhánh được cho là để kiểm tra rằng mỗi chi nhánh/đầu ra của một quyết định được kiểm tra, tức là tất cả các câu lệnh trong cả hai nhánh sai/đúng sẽ được thực thi.
Nhưng có giống nhau không? Trong báo cáo bảo hiểm tôi cần phải thực hiện tất cả các báo cáo vì vậy tôi đoán nó chỉ có thể được thực hiện bằng cách chạy tất cả các cách có thể. Tôi biết tôi đang thiếu cái gì ở đây ..Sự khác biệt giữa tuyên bố và phạm vi quyết định

+0

Tôi đoán câu hỏi này là tốt hơn cho Programmers.StackExchange.com. Bằng cách quyết định và bảo hiểm chi nhánh không phải là điều tương tự! –

+0

@Adriano Có, wiki nói như vậy nhưng rất nhiều nguồn khác nói rằng nó là như nhau. – user970696

+0

Không chỉ wiki, định nghĩa chính thức cho "quyết định" là mỗi điều kiện để nhập đường dẫn mã của một nhánh (sau đó nhánh là toàn bộ điều kiện). Hãy tưởng tượng, ví dụ, các mạch ngắn trong C/C++. Bạn có thể _decide_ sử dụng chúng làm từ đồng nghĩa hay không. –

Trả lời

1

Bạn có thể có một tuyên bố như:

if(a || b || (c && d && !e)) { 
    test1 = true; 
} else { 
    test2 = false; 
} 

Nếu mã số bảo hiểm của bạn nói cả test1 và test2 đường được nhấn sau đó bạn có bảo hiểm tuyên bố, nhưng để có được đầy đủ chi nhánh bảo hiểm, bạn sẽ cần phải kiểm tra khi một là đúng, khi a là sai, nhưng b là đúng, khi a và b là sai, nhưng c và d là đúng và e là sai, vv

Chi nhánh bao gồm mọi kết hợp tiềm năng các lựa chọn chi nhánh và do đó khó đạt được mức độ phù hợp 100%.

+0

Không chắc chắn lý do tại sao điều này không bao giờ được bình chọn là câu trả lời. Lời giải thích hay! –

+3

Điều này là sai. Phạm vi chi nhánh chỉ cần bao gồm tất cả các cạnh trong biểu đồ luồng điều khiển. Các chi nhánh boolean đánh giá thành hai cạnh.Nhìn vào câu trả lời ở trên để có câu trả lời đúng. – Outlier

+1

@PaulRutland Những gì bạn mô tả là phạm vi điều kiện, không bao phủ chi nhánh. –

19

Câu trả lời của Paul không hoàn toàn đúng, ít nhất tôi nghĩ vậy (theo định nghĩa của ISTQB). Có sự khác biệt khá lớn giữa tuyên bố, quyết định/chi nhánh và điều kiện bảo hiểm. Tôi sẽ sử dụng mẫu từ câu trả lời khác nhưng sửa đổi một chút, vì vậy tôi có thể hiển thị tất cả ba ví dụ về phạm vi kiểm tra. Các bài kiểm tra được viết ở đây cho phép kiểm tra 100% cho mỗi loại.

if(a || b)) { 
    test1 = true; 
} 
else { 
    if(c) { 
     test2 = true 
    } 
} 

Chúng tôi có hai báo cáo ở đây - nếu (a || b) và if (c), để giải thích đầy đủ những khác biệt vùng phủ sóng:

  1. tuyên bố bảo hiểm phải kiểm tra từng tuyên bố ít nhất một lần, vì vậy chúng tôi chỉ cần hai bài kiểm tra:
    • một = true b = false - cung cấp cho chúng ta con đường nếu (a || b) đúng -> test1 = true
    • a = false, b = false và c = true - cho chúng ta đường dẫn: if (a || b) false -> else -> if (c) -> test2 = true.

Bằng cách này, chúng tôi đã thực hiện từng câu lệnh.

  1. chi nhánh bảo hiểm/quyết định cần thêm một thử nghiệm:

    • a = false, b = false, c = false - dẫn chúng ta đến đó thứ hai nếu nhưng chúng tôi đang thực hiện chi nhánh sai từ tuyên bố đó, điều đó không được thực hiện trong phạm vi tuyên bố

    Bằng cách đó, chúng tôi đã trải qua tất cả các đường dẫn.

  2. bảo hiểm trạng cần một thử nghiệm:

    • a = false, b = true - dẫn qua con đường giống như thử nghiệm đầu tiên nhưng thực hiện các quyết định khác trong HOẶC statement (một || b) đi qua nó.

Bằng cách đó, chúng tôi đã đủ các điều kiện thử nghiệm, có nghĩa là chúng tôi đã đi qua tất cả các đường dẫn (chi nhánh) và kích hoạt nó với mỗi điều kiện chúng ta có thể - đầu tiên 'nếu' tuyên bố là sự thật trong thử nghiệm đầu tiên vì a = đúng kích hoạt nó và trong thử nghiệm cuối cùng bởi vì b = true kích hoạt nó. Tất nhiên ai đó có thể tranh luận rằng trường hợp với a = true và b = true cần được kiểm tra, nhưng khi chúng ta kiểm tra cách 'hoặc' hoạt động thì chúng ta có thể thấy nó không cần thiết và biến c có thể có giá trị bất kỳ trong các thử nghiệm đó, nó không được đánh giá.

Ít nhất tôi đã diễn giải nó theo cách này. Nếu ai đó vẫn quan tâm :)

EDIT: Trong hầu hết các nguồn tôi thấy điều khoản bảo hiểm/quyết định gần đây tương đương và thuật ngữ tôi mô tả là phạm vi quyết định trong phạm vi điều kiện thực tế do đó cập nhật câu trả lời.

+2

Tôi không nghĩ đó là chính xác. Theo bảng chú giải thuật ngữ ISTQB (http://astqb.org/glossary/): "độ che phủ của câu lệnh: Tỷ lệ các câu lệnh thực thi đã được thực hiện bởi một bộ kiểm thử." Trong ví dụ "bao hàm câu lệnh" của bạn, 'test1 = true ; 'không bao giờ được thực hiện, nhưng rõ ràng là một câu lệnh thi hành được. –

+0

Nhưng test1 không phải là tuyên bố, nó là biến mà trong trường hợp đó là cạnh chúng ta có thể đạt được. 'if' là câu lệnh (câu lệnh điều kiện là chính xác). Có lẽ tôi đang thiếu một cái gì đó ở đây, nhưng tôi hiểu nó theo cách này. – Faflok

+4

'test1 = true;' là một phép gán biến và do đó là một câu lệnh thi hành được. –

1

Tôi có thể thêm điều này vào phần trên mà tôi thấy bị thiếu, Nếu các thử nghiệm có phạm vi chi nhánh hoàn chỉnh thì chúng tôi có thể nói rằng nó cũng có phạm vi bảo hiểm đầy đủ, nhưng không ngược lại.

100% bảo hiểm chi nhánh => 100% bảo hiểm tuyên bố

100% bảo hiểm tuyên bố không bao hàm 100% bảo hiểm chi nhánh

lý do là trong phạm vi chi nhánh ngoài thực hiện tất cả những điều khoản, chúng tôi cũng nên xác minh xem các thử nghiệm có thực thi tất cả các chi nhánh hay không, có thể được hiểu là bao gồm tất cả các cạnh trong nhánh luồng kiểm soát

if(a){ 
    if(b){ 
    bool statement1 = true; 
    } 
} 

một = true, b = true sẽ cung cấp 100% bảo hiểm tuyên bố, nhưng không phải chi nhánh bảo hiểm

enter image description here

Trong bảo hiểm chi nhánh chúng ta cần phải bao gồm tất cả các cạnh, mà chúng tôi bỏ lỡ trong vùng phủ sóng tuyên bố thể hiện dưới dạng đường màu đỏ trong hình ảnh trên

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