2015-09-11 6 views
11

मैंने जंग की लाइब्रेरी के लिए कोड कवरेज प्राप्त करने के लिए kcov का उपयोग करने का प्रयास किया है। मैंने kcov बनाने और उपयोग करने के लिए this tutorial का पालन किया है। कवरेज काम करता प्रतीत होता है, हालांकि मुझे एक अजीब उच्च कवरेज का सामना करना पड़ रहा है। परियोजना में कुछ फाइलें 100% कवरेज प्राप्त करती हैं, भले ही वे वास्तव में बिल्कुल कवर न हों!kcov जंग प्रोग्राम के लिए गलत कोड कवरेज आंकड़ों की गणना क्यों करता है?

यह एक कम से कम समस्या उत्पन्न होने परियोजना है:

Cargo.toml

[package] 
name = "mypackage" 
version = "0.1.0" 
authors = ["mbrt"] 

src/lib.rs

pub mod subm; 

pub fn coverage1(i : bool) -> bool { 
    if i { 
     true 
    } 
    else { 
     false 
    } 
} 

#[cfg(test)] 
mod test { 
    use super::coverage1; 

    #[test] 
    fn test_coverage1() { 
     assert!(coverage1(true)); 
    } 
} 

src/subm.rs

pub fn coverage2(i : bool) -> bool { 
    if i { 
     true 
    } 
    else { 
     false 
    } 
} 

#[cfg(test)] 
mod test { 
    #[test] 
    fn test_coverage2() { 
    } 
} 

दो समान कार्य हैं, एक क्रेट की जड़ में, और दूसरा एक सबमिशन में। केवल अंतर यह है कि पहला परीक्षण एक समारोह को उत्तेजित करता है, और दूसरा कुछ भी नहीं करता है। इस मामले में मैं 50% से अधिक नहीं होने वाला कवरेज की अपेक्षा करता हूं।

हालांकि kcov रिपोर्ट करें:

coverage summary

lib.rs के लिए कवरेज सही है:

coverage1

लेकिन subm.rs के लिए कवरेज गलत है! नोट समारोह, सार्वजनिक है कि तो यह पुस्तकालय से बाहर अनुकूलित नहीं किया जा सकता है:

coverage2

यहाँ हम, क्योंकि यह एक फ़ाइल के लिए कोड कवरेज की गणना करने में सक्षम है, पुष्टि कर सकते हैं कि kcov काम कर रहा है, लेकिन यह है यह देखने में सक्षम नहीं है कि दूसरी फ़ाइल बिल्कुल कवर नहीं है।

यहां समस्या क्या है? शायद परीक्षण बाइनरी अप्रयुक्त कार्यों को तोड़ दें और kcov उन्हें नहीं देख सकता है?

+2

* समारोह सार्वजनिक है, इसलिए यह पुस्तकालय * से बाहर अनुकूलित नहीं किया जा सकता है - यह पूरी तरह से किया जा सकता है। सब कुछ स्थिर रूप से संकलित है, इसलिए संकलक जानता है कि कौन से फ़ंक्शंस का उपयोग किया जाता है (और कैसे!) जब यह बाइनरी बनाता है। Monomorphization के कारण यह एक बड़ा लाभ है। – Shepmaster

+0

@ शेमपस्टर अच्छा बिंदु, मैंने इसके बारे में नहीं सोचा था। – mbrt

उत्तर

5

आप सही हैं: इस समय पूरी तरह से अप्रयुक्त फ़ंक्शंस छीन दिए जाते हैं, इसलिए केकोव जैसे कवरेज टूल केवल प्रयुक्त कार्यों (जैसे कम से कम, इस तरह के टूल की सारांश कार्यक्षमता) के भीतर शाखा कवरेज के लिए अच्छे होते हैं। परीक्षण/डीबग बिल्ड के लिए डिफ़ॉल्ट रूप से ऐसा नहीं होने के बारे में some discussion है।

+0

मुझे लगता है कि कम से कम कार्य तब तक रहना चाहिए जब "कवरेज" स्विच चालू हो। –

+0

@MatthieuM। समस्या यह है कि यह मामला नहीं है, जहां तक ​​मैं देख सकता हूं। – mbrt

+1

@brt: दरअसल, जो काफी मनोरंजक है। –

10

एक कामकाज है: RUSTFLAGS='-C link-dead-code' पर्यावरण चर। इसका इस्तेमाल करते हुए निर्माण और जंग संकलक भी लिंक कर दिया जाएगा मृत कोड:

RUSTFLAGS='-C link-dead-code' cargo test 
संबंधित मुद्दे