Конфигурация cfg
Атрибут cfg управляет условной компиляцией кода.
Он принимает в качестве параметра одно или несколько условий,
которые проверяются во время компиляции. Если условие истинно,
код включается в сборку, иначе - исключается.
В контексте тестирования cfg чаще всего используется
с условием test, которое активируется только при запуске
команды cargo test. Параметром атрибут принимает
предикат конфигурации, например test, not(test)
или debug_assertions.
Синтаксис
#[cfg(predicate)]
// code
Пример
Давайте напишем функцию, которая доступна только
во время тестирования, используя условие test:
#[cfg(test)]
fn helper() -> i32
{
42
}
fn main()
{
println!("main function");
}
При обычной сборке функция helper не будет включена
в бинарный файл. Результат выполнения команды cargo run:
"main function"
Пример
Давайте используем условие not(test), чтобы код
выполнялся только вне тестов:
#[cfg(not(test))]
fn production_only() -> &'static str
{
"production"
}
fn main()
{
#[cfg(not(test))]
println!("{}", production_only());
}
Результат выполнения кода:
"production"
Пример
Давайте проверим работу условной компиляции в тестовом модуле,
комбинируя 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));
}
При запуске cargo test модуль tests будет скомпилирован,
а при cargo run - исключён. Результат выполнения cargo run:
5
Смотрите также
-
атрибут
cfg(test),
который включает код только при тестировании -
атрибут
cfg(not(test)),
который исключает код во время тестирования -
атрибут
mod tests,
который создаёт модуль с тестами -
атрибут
test,
который помечает функцию как тестовую