मैंने जंग की लाइब्रेरी के लिए कोड कवरेज प्राप्त करने के लिए 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
रिपोर्ट करें:
lib.rs
के लिए कवरेज सही है:
लेकिन subm.rs
के लिए कवरेज गलत है! नोट समारोह, सार्वजनिक है कि तो यह पुस्तकालय से बाहर अनुकूलित नहीं किया जा सकता है:
यहाँ हम, क्योंकि यह एक फ़ाइल के लिए कोड कवरेज की गणना करने में सक्षम है, पुष्टि कर सकते हैं कि kcov
काम कर रहा है, लेकिन यह है यह देखने में सक्षम नहीं है कि दूसरी फ़ाइल बिल्कुल कवर नहीं है।
यहां समस्या क्या है? शायद परीक्षण बाइनरी अप्रयुक्त कार्यों को तोड़ दें और kcov उन्हें नहीं देख सकता है?
* समारोह सार्वजनिक है, इसलिए यह पुस्तकालय * से बाहर अनुकूलित नहीं किया जा सकता है - यह पूरी तरह से किया जा सकता है। सब कुछ स्थिर रूप से संकलित है, इसलिए संकलक जानता है कि कौन से फ़ंक्शंस का उपयोग किया जाता है (और कैसे!) जब यह बाइनरी बनाता है। Monomorphization के कारण यह एक बड़ा लाभ है। – Shepmaster
@ शेमपस्टर अच्छा बिंदु, मैंने इसके बारे में नहीं सोचा था। – mbrt