2012-03-12 15 views
21

मेरे हेडर-केवल सी ++ लाइब्रेरी (टेम्पलेट्स आदि) के लिए मैं परीक्षण कवरेज जांचने के लिए जीसीओवी का उपयोग करता हूं। हालांकि, यह सभी शीर्षकों के लिए 100% कवरेज की रिपोर्ट करता है क्योंकि अप्रयुक्त फ़ंक्शंस पहले स्थान पर कंपाइलर द्वारा उत्पन्न नहीं होते हैं। अनदेखा कार्यों को मैन्युअल रूप से खोजना आसान है लेकिन निरंतर एकीकरण के उद्देश्य को हरा देता है ...हेडर-केवल पुस्तकालयों के लिए उपयोगी जीसीओवी परिणाम प्राप्त करना

कोई इसे स्वचालित रूप से कैसे हल करता है? क्या मुझे अपने कवरेज मीट्रिक के रूप में "लाइन हिट/एलओसी" का उपयोग करना चाहिए और फिर कभी 100% तक नहीं पहुंचना चाहिए?

+1

आपको लगता है कि सभी सार्वजनिक तरीकों और कार्यों कॉल इकाई परीक्षण सुनिश्चित कर सकते हैं कि आप अपने * .gcno फ़ाइलें आरंभ (ताकि lcov के लिए) बनाते हैं। आपको कवरेज के साथ-साथ परीक्षण भी मिलेगा कि यह एक ही समय में काम करता है। –

+2

हाँ, लेकिन अगर मैं किसी फ़ंक्शन को याद करता हूं तो मैं आसानी से स्पॉट करना चाहता हूं, और यह अच्छा होगा अगर मैं अपने सीडीएश से ब्राउज़ कर सकूं और <100% कवरेज के साथ हेडर देख सकूं। – pascal

+0

मैं इस प्रश्न के अच्छे जवाब के बाद भी हूं। 1. मैं मानता हूं कि अनचाहे तत्काल देखना अच्छा लगेगा। 2।मैंने सदस्य टेम्पलेट्स (टेम्पलेट कक्षाओं में) के लिए कोई परिणाम नहीं देखा है, जहां मुझे पूरी तरह से यकीन है कि ये तत्काल हैं और मेरे परीक्षण कोड के भीतर बुलाए गए हैं (जो थोड़ा अजीब है)। –

उत्तर

12

जीसीसी नियंत्रण में सामान्य झंडे के अलावा;

--coverage -fno-inline -fno-inline-small-functions -fno-default-inline 

आप अपनी यूनिट परीक्षण फ़ाइलों के शीर्ष पर अपने टेम्पलेट कक्षाओं को तुरंत चालू कर सकते हैं;

template class std::map<std::string, std::string>; 

यह उस टेम्पलेट वर्ग में प्रत्येक विधि के लिए कोड उत्पन्न करेगा जो कवरेज टूल को पूरी तरह से काम करता है।

इसके अलावा,

lcov -c -i -b ${ROOT} -d . -o Coverage.baseline 
<run your tests here> 
lcov -c -d . -b ${ROOT} -o Coverage.out 
lcov -a Coverage.baseline -a Coverage.out -o Coverage.combined 
genhtml Coverage.combined -o HTML 
1

मैं परीक्षण कवरेज (Google टेस्ट फ्रेमवर्क के साथ लिखे गए टेस्ट) की जांच करने के लिए जीसीओवी का भी उपयोग कर रहा हूं, इसके अतिरिक्त मैं एक्सेलिप्स जीसीओवी एकीकरण प्लगइन या एलसीओवी उपकरण का उपयोग करता हूं ताकि परीक्षण कवरेज परिणामों के विचारों का निरीक्षण करने में आसानी हो सके। कच्चे जीसीओवी आउटपुट का उपयोग करना बहुत कठिन है :-(

यदि आपके पास केवल टेम्पलेट लाइब्रेरी हैंडर हैं, तो आपको टेम्प्लेट क्लासेस और टेम्पलेट सदस्य फ़ंक्शंस को तत्काल करने वाले आपके परीक्षण कक्षाओं (जी ++ ध्वज - पुनर्प्राप्ति का उपयोग करके) भी उपकरण की आवश्यकता है इन के लिए उचित GCov आउटपुट को देखने के लिए।

उल्लेख उपकरण यह टेम्पलेट कोड है कि परीक्षण के मामले के साथ बिल्कुल instantiated नहीं किया गया था को पहचानना आसान है के साथ

है, क्योंकि यह कोई टिप्पणियां हैं।

मैं सेटअप एक नमूना है और एलसीओवी आउटपुट को एक ड्रॉपबॉक्स लिंक पर कॉपी किया गया है जिसका आप निरीक्षण कर सकते हैं।

नमूना कोड (टी

TemplateSample.hpp

template<typename T> 
class TemplateSample 
{ 

public: 
    enum CodePath 
    { 
     Path1 , 
     Path2 , 
     Path3 , 
    }; 

    TemplateSample(const T& value) 
    : data(value) 
    { 
    } 

    int doSomething(CodePath path) 
    { 
     switch(path) 
     { 
     case Path1: 
      return 1; 
     case Path2: 
      return 2; 
     case Path3: 
      return 3; 
     default: 
      return 0; 
     } 

     return -1; 
    } 

    template<typename U> 
    U& returnRefParam(U& refParam) 
    { 
     instantiatedCode(); 
     return refParam; 
    } 

    template<typename U, typename R> 
    R doSomethingElse(const U& param) 
    { 
     return static_cast<R>(data); 
    } 

private: 
    void instantiatedCode() 
    { 
     int x = 5; 
     x = x * 10; 
    } 

    void neverInstantiatedCode() 
    { 
     int x = 5; 
     x = x * 10; 
    } 
    T data; 
}; 

TemplateSampleTest.cpp

#include <string> 
#include "gtest/gtest.h" 
#include "TemplateSample.hpp" 

class TemplateSampleTest : public ::testing::Test 
{ 
public: 

    TemplateSampleTest() 
    : templateSample(5) 
    { 
    } 

protected: 
    TemplateSample<int> templateSample; 

private: 
}; 

TEST_F(TemplateSampleTest,doSomethingPath1) 
{ 
    EXPECT_EQ(1,templateSample.doSomething(TemplateSample<int>::Path1)); 
} 

TEST_F(TemplateSampleTest,doSomethingPath2) 
{ 
    EXPECT_EQ(2,templateSample.doSomething(TemplateSample<int>::Path2)); 
} 

TEST_F(TemplateSampleTest,returnRefParam) 
{ 
    std::string stringValue = "Hello"; 
    EXPECT_EQ(stringValue,templateSample.returnRefParam(stringValue)); 
} 

TEST_F(TemplateSampleTest,doSomethingElse) 
{ 
    std::string stringValue = "Hello"; 
    long value = templateSample.doSomethingElse<std::string,long>(stringValue); 
    EXPECT_EQ(5,value); 
} 

कोड कवरेज lcov यहाँ से उत्पन्न उत्पादन देखें: emplateSampleTest.cpp जी ++ --coverage विकल्प) का उपयोग कर instrumented है:

TemplateSample.hpp coverage

चेतावनी: 'कार्य' आंकड़े 100% के रूप में रिपोर्ट किए जाते हैं, जो तत्काल टेम्पलेट कार्यों के बारे में वास्तव में सच नहीं है।

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