Встроенные тесты в Rust
Проверку логики можно держать рядом с
функциями, которые тестируют. Для этого
пишут отдельные функции, которые сборщик
запускает только по команде тестирования,
а не при обычном cargo run.
Тестовый блок оборачивают атрибутом
#[cfg(test)], чтобы он не попадал
в обычную сборку. Внутри функцию помечают
#[test]:
fn twice(n: i32) -> i32 {
n * 2
}
#[cfg(test)]
mod tests {
#[test]
fn adds() {
assert_eq!(2 + 2, 4);
}
}
fn main() {
println!("{}", twice(2));
}
Команда assert_eq! сравнивает
два значения. Если они не совпали,
тест не проходит и команда тестирования
завершится с ошибкой. Успешный прогон
покажет имя функции adds среди
пройденных.
Запуск из корня проекта:
cargo test
Можно проверить и свою функцию, а не только арифметику:
pub fn twice(n: i32) -> i32 {
n * 2
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn doubles() {
assert_eq!(twice(3), 6);
}
}
Дана функция:
fn triple(n: i32) -> i32 {
n * 3
}
Добавьте блок tests с одним
тестом, который проверяет triple(2)
через assert_eq!, и запустите
cargo test.
Дан следующий код:
#[cfg(test)]
mod tests {
#[test]
fn wrong() {
assert_eq!(1 + 1, 3);
}
}
Скажите, пройдет ли cargo test
и что сообщит assert_eq! при
несовпадении.
Объясните, зачем блок тестов помечают
#[cfg(test)], если точка входа
и так не вызывает эти функции.