2015-11-05 8 views
5

समस्या बयानकोई गलती के साथ 100% शाखा कवरेज के लिए टेस्ट केस?

एक विधि एक शून्य गलती है कि आप उस के लिए टेस्ट स्वीट लिख सकते है कि 100% बयान कवरेज है लेकिन गलती और एक अन्य टेस्ट स्वीट कि 100% शाखा कवरेज है नहीं मिल रहा है कि गलती प्रकट करता है?

यहाँ विधि मैं एक ही

public faultyMethod1(int x, int y) { 
    int X =x; 
    int Y = y; 

    if (Y !=0){ 
    Z = X/Y; 
    } else { 
    System.out.println("Sorry. That's an DiviDeByZeroException"); 
    } 
} 

faultyMethod1 (1,2); 
faultyMethod1 (2,0); 

ऊपर कोड के लिए लिखा था टेस्ट स्वीट कि 100% शाखा कवरेज के लिए गलती "

के बारे में क्या टेस्ट स्वीट को उजागर करती है कि है प्राप्त करने के लिए है कि 100% बयान कवरेज है लेकिन गलती?

+2

गलती कहां है? (इसके अलावा 'जेड' कभी घोषित नहीं किया जाता है और कभी भी इसका उपयोग नहीं किया जाता है।) – 5gon12eder

+0

जो सिर्फ एक psuedo कोड है :-) गलती x/y है। जो शून्य से विभाजन फेंक सकता है। –

+2

लेकिन आपके पास इसके लिए एक चेक है। कोड शून्य से कभी विभाजित नहीं होगा। – 5gon12eder

उत्तर

5

चलो एक और उदाहरण करते हैं नहीं मिल रहा है ...

// The method, according to our imaginary specification, should do: 
// return x * y, IF x is less than 2 
// return x + y, in any other case 
public int doSomething(int x, int y) { 

if (x < 2) { 
    return x * x; // this is our bug, it SHOULD be x * y 
} 

return x + y; 

} 

अब कल्पना हम दो परीक्षणों है:

assertEquals(0, doSomething(0, 12)); // works, as 0 * 0 == 0 * 12 
assertEquals(20, doSomething(10, 10)); // works fine 

तो, अब हम 100% परीक्षण कवरेज (क्योंकि एक्स < 2 शाखा कवर किया गया है, साथ ही एक दूसरे के रूप में)। लेकिन हमें बग नहीं मिला, क्योंकि x का उपयोग शून्य के मान के रूप में करता है (क्योंकि 0 * कुछ हमेशा 0 होता है, y अप्रासंगिक है)। हम कुछ इस तरह की जरूरत है | ...

assertEquals(12, doSomething(1, 12)); // fails, because it will be 1*1 == 1 

एक ही समस्या, किसी भी अन्य स्थिति के लिए हो सकता है शून्य से एक प्रभाग भी शामिल है। एक अच्छा उदाहरण कल्पना नहीं कर सकता, लेकिन मुझे लगता है कि आपको बुनियादी विचार मिलता है कि 100% कवरेज का मतलब सभी बगों का 100% क्यों नहीं है। (उन्हें खोजने का एक अच्छा तरीका उत्परिवर्तन परीक्षण होगा, लेकिन यह एक सुंदर उन्नत विषय है।)

+0

हालांकि यह उदाहरण वास्तव में एक बग दिखाता है जो पूर्ण कथन कवरेज के साथ एक परीक्षण सूट द्वारा पकड़ा नहीं जाता है, यह सीधे सवाल का जवाब नहीं देता है क्योंकि निम्न परीक्षण सूट में पूर्ण शाखा कवरेज भी है। – 5gon12eder

+0

क्षमा करें, बिंदु प्राप्त न करें, उदाहरण में पूर्ण शाखा कवरेज भी है क्योंकि प्रत्येक संभावना (केवल एक ही है) के माध्यम से चलाया जाता है ...? –

+0

हां, और यही बात है। यह पूर्ण कथन कवरेज के साथ एक परीक्षण सूट का उदाहरण नहीं है, लेकिन अधूरा शाखा कवरेज जो एक बग को याद करता है जो पाया गया था कि शाखा कवरेज पूरा हो गया था। यह प्रश्न (मेरी संभवतः गलत) इस सवाल की समझ थी कि इस तरह के उदाहरण की मांग की गई थी। – 5gon12eder

1

लॉजिकल और एक OR के साथ भ्रमित करने के बारे में कैसे?

// This method must never throw; on error, it shall return -1. 
int foo(final String s, final int n) { 
    if (s != null || n != 0) { 
     return s.length()/n; 
    } else { 
     return -1; 
    } 
} 

निम्नलिखित परीक्षण इनपुट 100% कथन कवरेज प्राप्त करते हैं और बग का अनावरण नहीं करते हैं।

assert foo("everything is fine", 6) == 3; // happy path, ok 
assert foo(null, 0) == -1;     // error path, ok 

वजह से एक साथ ored दो भाव प्रत्येक मामले में एक ही मूल्य का मूल्यांकन परीक्षण सूट नहीं foll शाखा-कवरेज, तथापि, है। निम्नलिखित दो परीक्षण मामलों को जोड़ना शाखा कवरेज पूरा करता है और बग का खुलासा करता है।

assert foo("bingo", 0) == -1; // ArithmeticException 
assert foo(null, 4) == -1;  // NullPointerException 

तथ्य की बात के रूप में, इन चार आदानों एक साथ भी पथ कवरेज जो शाखा कवरेज से भी मजबूत आवश्यकता है प्राप्त।

संबंधित मुद्दे