2015-09-11 22 views
11

私は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レポートこの:

coverage summary

lib.rsのカバレッジが正しい:

coverage1

しかしsubm.rsのカバレッジが間違っています!それは、ライブラリから最適化することができないので、関数は、公開されていることに注意してください。一つのファイルのコードカバレッジを計算することが可能であるため、ここで

coverage2

たちは、kcovが機能していることを確認することができますが、それは、 2番目のファイルがまったくカバーされていないことはわかりません。

ここで問題は何ですか?おそらく、テストバイナリは未使用の関数を取り除き、kcovはそれらを見ることができないでしょうか?

+2

*関数はpublicであるため、ライブラリから最適化することはできません。すべてが静的にコンパイルされているので、バイナリの作成時にコンパイラはどの関数が使用されているかを知っています。これは単形化のために大きな利点です。 – Shepmaster

+0

@Shepmaster良い点、私はそれについて考えなかった。 – mbrt

答えて

5

あなたは正しい:完全に使用されていない関数は現時点では削除されているので、kcovのようなカバレッジツールは、使用されている関数(少なくともそのようなツールのサマリー機能)内のブランチカバレッジにのみ有効です。これは、テスト/デバッグビルドではデフォルトでは発生しないようにすることについてはsome discussionです。

+0

"カバレッジ"スイッチがオンになっても、少なくとも機能は残っているはずです。 @MatthieuM。 –

+0

問題は、私が見る限り、そうではないということです。 – mbrt

+1

@brt:確かに、これはかなり面白いです。 –

10

回避方法があります:RUSTFLAGS='-C link-dead-code'環境変数です。構築中にそれを使用し、Rustコンパイラはデッドコードもリンクします:

RUSTFLAGS='-C link-dead-code' cargo test 
関連する問題