私はkcovを使ってRustライブラリのコードカバレッジを取得しようとしました。私はthis tutorialに続いてkcovをビルドして使用しました。カバレッジはうまくいくようですが、私は奇妙な高いカバレッジに直面しています。実際にはまったくカバーされていなくても、プロジェクトの一部のファイルは100%のカバレッジを取得します。kcovがRustプログラムのコードカバレッジ統計情報を正しく計算しないのはなぜですか?
これは、問題を再現する最小限のプロジェクトです:
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() {
}
}
同じ機能が2つあります.1つはクレートのルートにあり、もう1つはサブモジュールにあります。唯一の違いは、最初のテストが1つの機能を刺激し、もう1つのテストがまったく機能しないことです。この場合、私はカバレッジが50%を超えないことを期待しています。
しかしkcov
レポートこの:
lib.rs
のカバレッジが正しい:
しかしsubm.rs
のカバレッジが間違っています!それは、ライブラリから最適化することができないので、関数は、公開されていることに注意してください。一つのファイルのコードカバレッジを計算することが可能であるため、ここで
たちは、kcov
が機能していることを確認することができますが、それは、 2番目のファイルがまったくカバーされていないことはわかりません。
ここで問題は何ですか?おそらく、テストバイナリは未使用の関数を取り除き、kcovはそれらを見ることができないでしょうか?
*関数はpublicであるため、ライブラリから最適化することはできません。すべてが静的にコンパイルされているので、バイナリの作成時にコンパイラはどの関数が使用されているかを知っています。これは単形化のために大きな利点です。 – Shepmaster
@Shepmaster良い点、私はそれについて考えなかった。 – mbrt