2015-09-11 7 views
11

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:

coverage1

Aber die Abdeckung für subm.rs ist falsch:

coverage summary

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:

coverage2

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?

+2

* 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

+0

@Shempmaster Guter Punkt, ich habe nicht darüber nachgedacht. – mbrt

Antwort

5

Sie haben Recht: Funktionen, die gerade nicht genutzt werden, sind im Moment nicht verfügbar, daher sind Coverage-Tools wie kcov nur für die Zweigabdeckung in den verwendeten Funktionen geeignet (zumindest die Zusammenfassung dieser Tools). Es gibt some discussion darüber, dass dies nicht standardmäßig für Test/Debug-Builds geschieht.

+0

Ich nehme an, dass mindestens die Funktionen bleiben sollten, wenn der "Coverage" -Schalter eingeschaltet ist. –

+0

@MatthieuM. Das Problem ist, dass dies nicht der Fall ist, soweit ich das beurteilen kann. – mbrt

+1

@bt: In der Tat, das ist ziemlich amüsant. –

10

Es gibt eine Problemumgehung: die Umgebungsvariable RUSTFLAGS='-C link-dead-code'. Verwenden Sie es beim Erstellen und der Rust-Compiler wird auch toten Code verknüpfen:

Verwandte Themen