Атрибут #[cfg(test)]
Атрибут #[cfg(test)] - это условный атрибут компиляции, который указывает компилятору включать помеченный код только тогда, когда проект собирается в режиме тестирования. Параметров атрибут не принимает. Чаще всего он используется для объявления модуля с тестами через mod tests, чтобы тестовый код не попадал в итоговую сборку программы.
Синтаксис
#[cfg(test)]
mod tests
{
// тестовый код
}
Пример
Давайте объявим функцию сложения и модуль с тестом, помеченный атрибутом #[cfg(test)]:
fn add(a: i32, b: i32) -> i32
{
a + b
}
#[cfg(test)]
mod tests
{
use super::*;
#[test]
fn test_add()
{
assert_eq!(add(2, 3), 5);
}
}
fn main()
{
println!("{}", add(2, 3));
}
Результат выполнения кода:
5
Пример
Давайте проверим, что при обычной сборке модуль с тестами не компилируется. Для этого поместим внутрь модуля намеренно ошибочный код:
#[cfg(test)]
mod tests
{
fn broken() -> i32
{
"not a number"
}
}
fn main()
{
println!("program works");
}
Результат выполнения кода:
"program works"
При запуске cargo test этот же код вызовет ошибку компиляции, потому что модуль tests будет включён в сборку.
Пример
Атрибут #[cfg(test)] можно применять не только к модулю, но и к отдельным функциям или импортам:
#[cfg(test)]
use std::collections::HashMap;
fn main()
{
let res = 2 + 2;
println!("{}", res);
}
#[cfg(test)]
fn helper_for_tests() -> bool
{
true
}
Результат выполнения кода:
4
Смотрите также
-
атрибут
cfg,
который управляет условной компиляцией кода -
атрибут
cfg(not(test)),
который включает код только вне режима тестирования -
модуль
mod tests,
который conventionally содержит тестовые функции -
макрос
assert_eq!,
который проверяет равенство двух значений в тестах