2012-04-12 14 views
5

प्रश्न: वास्तविक परीक्षण कवरेज का पता कैसे लगाएं?कवरेज बनाम पहुंच योग्य कोड

मैंने कोड कवरेज मीट्रिक और परीक्षण गुणवत्ता के साथ एक समस्या देखी है: 100% कोड कवरेज का मतलब यह नहीं है कि कोड वास्तव में परीक्षण किया जाता है।

कभी-कभी परीक्षण 100% कवरेज देता है, भले ही इसमें सब कुछ शामिल न हो। समस्या कवरेज परिभाषा में बताती है, हम कवरेज == पहुंच योग्य कोड मानते हैं।

लेकिन यह सच नहीं है, कोड 100% पहुंच योग्य हो सकता है लेकिन परीक्षण के साथ 100% कवर नहीं किया जा सकता है।

उदाहरण के लिए एक नज़र डालें, यह परीक्षण 100% कवरेज (ईएमएमए) देता है, लेकिन असल में इसमें मूल्यों को शामिल नहीं किया जाता है जो सेवा मॉक को पारित किया जाएगा। इसलिए, यदि मूल्य बदला जाएगा, परीक्षण विफल नहीं होगा।

उदाहरण:

public class User { 
    public static final int INT_VALUE = 1; 
    public static final boolean BOOLEAN_VALUE = false; 
    public static final String STRING_VALUE = ""; 
    private Service service; 

    public void setService(Service service) { 
     this.service = service; 
    } 

    public String userMethod() { 
     return service.doSomething(INT_VALUE, BOOLEAN_VALUE, STRING_VALUE); 
    } 
} 

और परीक्षण के लिए यह:

public class UserTest { 

    private User user; 
    private Service easyMockNiceMock; 

    @Before 
    public void setUp() throws Exception { 
     user = new User(); 
     easyMockNiceMock = EasyMock.createNiceMock(Service.class); 
    } 

    @Test 
    public void nonCoverage() throws Exception { 
     // given 
     user.setService(easyMockNiceMock); 
     expect(easyMockNiceMock.doSomething(anyInt(), anyBoolean(), (String) anyObject())).andReturn(""); 
     replay(easyMockNiceMock); 
     // when 
     user.userMethod(); 
     // then 
     verify(easyMockNiceMock); 
    } 
} 

उत्तर

4

Jester पर एक नज़र है, जो mutation testing प्रदर्शन करती है। साइट से:

जेस्टर को ऐसे कोड मिलते हैं जो परीक्षण द्वारा कवर नहीं होते हैं। जेस्टर कुछ आपके कोड में बदलता है, आपके परीक्षण चलाता है, और यदि परीक्षण जेस्टर पास करता है तो यह संदेश दिखाता है कि यह क्या बदल गया है। जेस्टर में वेब पेज बनाने के लिए एक स्क्रिप्ट शामिल है जो परिवर्तनों को दिखाता है जो विफल होने के परीक्षणों का कारण नहीं बनाते हैं।

जेस्टर कोड कवरेज टूल से अलग है, क्योंकि यह कोड कोड प्राप्त कर सकता है जिसे परीक्षण के चलते निष्पादित किया जाता है लेकिन वास्तव में परीक्षण नहीं किया जाता है। जेस्टर के दृष्टिकोण को उत्परिवर्तन परीक्षण या स्वचालित त्रुटि बीजिंग कहा जाता है। हालांकि, जेस्टर कोड कवरेज टूल के लिए एक पूरक दृष्टिकोण के रूप में प्रतिस्थापन के रूप में नहीं है।

+0

एक दयालुता यह .NET के वर्तमान संस्करण के लिए काम नहीं करती है। एक स्पिन के लिए इसे लेना पसंद करेंगे। – Gishu

+0

मैंने उत्परिवर्तन ढांचे के बारे में Google की कोशिश की है लेकिन उनमें से कोई भी आईडीई (अधिमानतः आईडीईए) के साथ एकीकरण नहीं है। –

+0

जेस्टर ने उत्परिवर्तन परीक्षण के लिए एक सुंदर बेवकूफ दृष्टिकोण लिया और इसलिए धीरे-धीरे धीमा था। यदि आप उत्परिवर्तन परीक्षण को देख रहे हैं तो आप http://pitest.org या javalanche – henry

2

100% कवरेज का 100% परीक्षण कभी नहीं हुआ है, और जिसने दावा किया है, वह कोई भी समझ में नहीं आता है, या आपसे झूठ बोल रहा है। कवरेज मापन केवल यह मापता है कि परीक्षण के दौरान कौन सा उत्पाद कोड निष्पादित किया गया है। परीक्षणों को लिखने के दर्जनों तरीके हैं जो 100% कवरेज उत्पन्न करते हैं, और फिर अपने कोड का पूर्ण परीक्षण नहीं करते हैं।

सबसे आसान तरीका एक परीक्षण लिखना है जो उत्पाद फ़ंक्शन को कॉल करता है, और उसके बाद वापसी मूल्य के बारे में कोई भी दावा नहीं करता है!

यहां एक ब्लॉग पोस्ट है जिसे मैंने इस विषय के बारे में लिखा था: Flaws in Coverage Measurement, यह पायथन केंद्रित है, लेकिन अवधारणाएं समान हैं।

+1

पर एक और आधुनिक प्रणाली को आजमा सकते हैं, कवरेज आपको बिल्कुल एक बात बताता है: क्या _isn't_ परीक्षण नहीं किया गया। कवरेज ग्राफ़ को देखते समय, मुझे परवाह नहीं है कि हरा क्या है, मुझे परवाह है कि लाल क्या है। –