Cargo позволяет нам задать условия, при которых тесты должны выполняться. Это производится с помощью атрибута
#[cfg(all(test, feature = название_условия))]
Здесь параметру feature передается название условия в виде строки, при котором должен выполняться тест.
Перед использованием условий их надо указать в файле Cargo.toml. Так, добавим в конец этого файла следующий код:
[features] linux = [] windows = []
Секция [features] задает набор условий. Под этой секций на каждой строке указываем название условия и присваиваем ему пустые квадратные скобки. В данном случае у нас определено 2 условия: "linux" и "windows".
Далее определим тесты, которые используют эти условия. Для простоты пусть они будут находиться в файле main.rs:
fn main() {
println!("Hello, World");
}
fn add(a: i32, b: i32) -> i32 { // функция для тестирования
a + b
}
#[cfg(all(test, feature = "linux"))]
pub mod tests_linux {
use super::*;
#[test]
fn test_add_linux() {
let input_1 = 2;
let input_2 = 8;
let result = add(input_1, input_2);
assert_eq!(result, 10, "The addition result is incorrect.");
}
}
#[cfg(all(test, feature = "windows"))]
pub mod tests_windows {
use super::*;
#[test]
fn test_add_windows() {
let input_1 = 2;
let input_2 = 8;
let result = add(input_1, input_2);
assert_eq!(result, 10, "The addition result is incorrect.");
}
}
Здесь определено два модуля тестов, каждый из которых для примера содержит по одному тесту. Тесты из модуля tests_linux выполняются, если установлено условие "linux":
#[cfg(all(test, feature = "linux"))]
pub mod tests_linux {
........................
В этом случае выполняется функция test_add_linux()
А тест из модуля tests_windows (функция test_add_windows()) выполняется, если задано условие "windows".
Для установки условия при запуске тестов используется параметр --features, которому передается имя условия. Например, установим условие "linux":
eugene@Eugene:~/Documents/rust/unit$ cargo test --features linux
Finished `test` profile [unoptimized + debuginfo] target(s) in 0.00s
Running unittests src/main.rs (target/debug/deps/unit-919a61a1240c307a)
running 1 test
test tests_linux::test_add_linux ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
eugene@Eugene:~/Documents/rust/unit$
И мы видим, что в этом случае выполняется тест tests_linux::test_add_linux