Есть ли простой способ условно включить или игнорировать все наборы тестов в Rust?
Самый простой - это даже не компилировать тесты:
#[cfg(test)]
mod test {
#[test]
fn no_device_needed() {}
#[cfg(feature = "test1")]
mod test1 {
fn device_one_needed() {}
}
#[cfg(feature = "test2")]
mod test2 {
fn device_two_needed() {}
}
}
Я должен дублировать это условие для каждого теста, и условия трудно читать и поддерживать.
- Можете ли вы представить желаемую функциональность в чистом Rust? да
- Является ли существующий синтаксис слишком многословным? да
Это кандидат на макрос.
macro_rules! device_test {
(no-device, $name:ident, {$($body:tt)+}) => (
#[test]
fn $name() {
$($body)+
}
);
(device1, $name:ident, {$($body:tt)+}) => (
#[test]
#[cfg_attr(not(feature = "test-type-one"), ignore)]
fn $name() {
$($body)+
}
);
(device2, $name:ident, {$($body:tt)+}) => (
#[test]
#[cfg_attr(not(feature = "test-type-two"), ignore)]
fn $name() {
$($body)+
}
);
}
device_test!(no-device, one, {
assert_eq!(2, 1+1)
});
device_test!(device1, two, {
assert_eq!(3, 1+1)
});
функциональность для типа 2 является расширенной функциональностью для типа 1
Отразите это в своих определениях функций, чтобы упростить код:
[features]
test1 = []
test2 = ["test1"]
Если вы сделаете это, вам не нужно иметь any
или all
в вашематрибуты конфигурации.
функция по умолчанию test-no-device
Это не кажется полезным;вместо этого используйте обычные тесты, защищенные обычной конфигурацией тестирования:
#[cfg(test)]
mod test {
#[test]
fn no_device_needed() {}
}
Если вы выполните это, вы можете удалить этот случай из макроса.
Я думаю, что если вы будете следовать обоим предложениям, вам даже не нужен макрос.