Ich habe versucht, kcov zu verwenden, um Codeabdeckung für eine Rust-Bibliothek zu erhalten. Ich habe this tutorial gefolgt, um kcov zu bauen und zu verwenden. Die Berichterstattung scheint zu funktionieren, allerdings habe ich eine merkwürdig hohe Abdeckung. Einige Dateien im Projekt erhalten eine 100% ige Abdeckung, auch wenn sie gar nicht abgedeckt sind!Warum berechnet kcov falsche Code Coverage-Statistiken für Rust-Programme?
Dies ist ein minimal-Projekt reproduzieren das Problem:
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() {
}
}
Es gibt zwei identische Funktionen, eine im Stamm der Kiste und eine andere in einem Submodul. Der einzige Unterschied ist, dass der erste Test eine Funktion stimuliert und der andere gar nichts tut. In diesem Fall würde ich eine Abdeckung von nicht mehr als 50% erwarten.
jedoch kcov
meldet dies:
Aber die Abdeckung für subm.rs
ist falsch:
Die Abdeckung für lib.rs
korrekt ist! Beachten Sie, dass die Funktion der Öffentlichkeit ist, so dass er nicht aus der Bibliothek optimiert werden kann aus:
Hier können wir überprüfen, ob kcov
funktionieren, weil es in der Lage ist, Codeabdeckung für eine Datei zu berechnen, aber es ist nicht in der Lage zu sehen, dass die zweite Datei überhaupt nicht abgedeckt ist.
Was ist das Problem hier? Vielleicht entfernen Test-Binärdateien nicht verwendete Funktionen und kcov kann sie nicht sehen?
* Die Funktion ist öffentlich, so dass es nicht aus der Bibliothek * optimiert werden kann - es kann absolut sein. Alles ist statisch kompiliert, daher weiß der Compiler, welche Funktionen (und wie!) Beim Erstellen der Binärdatei verwendet werden. Dies ist aufgrund der Monomorphisierung ein großer Vorteil. – Shepmaster
@Shempmaster Guter Punkt, ich habe nicht darüber nachgedacht. – mbrt