Я попытался использовать kcov, чтобы получить покрытие кода для библиотеки Rust. Я следил за этот учебник для создания и использования kcov. Покрытие, похоже, работает, однако я столкнулся с странным высоким охватом. Некоторые файлы в проекте получают 100% -ый охват, даже если они на самом деле не покрыты вообще!
Это минимальный проект, воспроизводящий проблему:
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 их не видит?