gpt4 book ai didi

unit-testing - 有没有一种简单的方法可以有条件地启用或忽略 Rust 中的整个测试套件?

转载 作者:行者123 更新时间:2023-11-29 08:07:33 33 4
gpt4 key购买 nike

我正在开发一个提供对某些硬件设备的访问的 Rust 库。有两种设备类型,1 和 2,类型 2 的功能是类型 1 功能的超集。

我想针对不同的情况提供不同的测试套件:

  • 在没有连接设备的情况下进行测试(基本的健全性检查,例如 CI 服务器)
  • 测试共享功能(需要类型 1 或 2 的设备)
  • 测试 2 类独有功能(需要 2 类设备)

我正在使用功能来表示此行为:默认功能 test-no-device 和可选功能 test-type-onetest-type -两个。然后我使用 cfg_attr 属性忽略基于所选功能的测试:

#[test]
#[cfg_attr(not(feature = "test-type-two"), ignore)]
fn test_exclusive() {
// ...
}

#[test]
#[cfg_attr(not(any(feature = "test-type-two", feature = "test-type-one")), ignore)]
fn test_shared() {
// ...
}

这相当麻烦,因为我必须为每个测试复制这个条件,而且条件很难阅读和维护。

有没有更简单的方法来管理测试套件?

我试图在声明模块时设置 ignore 属性,但显然它只能为每个 test 函数设置。我想我可以通过在模块上使用 cfg 来禁用排除的测试的编译,但是由于测试应该始终编译,所以我想避免这种情况。

最佳答案

Is there a simple way to conditionally enable or ignore entire test suites in 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() {}
}
}

I have to duplicate this condition for every test and the conditions are hard to read and maintain.

  1. 您能用纯 Rust 表示所需的功能吗?
  2. 现有语法是否过于冗长?

这是宏的候选。

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)
});

the functionality for type 2 is a superset of the functionality for type 1

在您的功能定义中反射(reflect)这一点以简化代码:

[features]
test1 = []
test2 = ["test1"]

如果你这样做,你不需要在你的配置属性中有 anyall

a default feature test-no-device

这似乎没什么用;而是使用由普通测试配置保护的普通测试:

#[cfg(test)]
mod test {
#[test]
fn no_device_needed() {}
}

如果你遵循这个,你可以从宏中删除这个案例。


我认为如果您遵循这两个建议,您甚至不需要宏。

关于unit-testing - 有没有一种简单的方法可以有条件地启用或忽略 Rust 中的整个测试套件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50565893/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com