5 个版本
新版本 0.1.4 | 2024 年 8 月 20 日 |
---|---|
0.1.3 | 2024 年 6 月 7 日 |
0.1.2 | 2024 年 6 月 6 日 |
0.1.1 | 2024 年 6 月 5 日 |
0.1.0 | 2024 年 6 月 5 日 |
在 测试 类别中排名 #198
每月下载量 2,646 次
在 3 crates 中使用
16KB
189 行
test-tag
test-tag 是一个可以用于标记测试的 crate。用户可以执行匹配特定标记的测试。
问题
Rust 使得在应用程序/库的所有层定义测试变得非常容易。但并非所有测试都平等,有时需要突出某些属性并使相应的测试以不同方式处理。
一个常见的例子是使用 Miri 进行测试:它可以运行某些测试,但一旦测试执行文件 I/O 或跨越 FFI 边界,它就不再适合在 Miri 下运行。因此,在任何一个非平凡的 crate 上运行 cargo miri test
很可能不会工作,因为至少有一些测试可能违反这些约束。
解决方案包括,例如,在测试名称中包含 miri
,然后在调用级别过滤测试;例如,cargo miri test -- _miri_
。但这不是一种特别明显的约定,因此有贡献者意外地重命名了一个测试,使其不再符合运行条件。当有多个属性“特殊”时,它也会很快变得复杂。
请注意,Miri 的使用只是一个例子(如果大多数测试都是 Miri 兼容的,您可以使用 #[cfg_attr(miri, ignore)]
作为一种备选方案)。然而,标记对于其他属性也可能很有用,例如,某些测试需要降低权限(需要以管理员权限运行)或那些适合在部分支持(可能即将加入)的操作系统上运行。
使用方法
这个crate提供了#[test_tag::tag(...)]
属性,用于引入一阶标记的方式。对于Miri
示例
use test_tag::tag;
#[tag(miri)]
#[test]
fn test1() {}
然后可以通过以下方式运行它
$ cargo miri test -- :miri:
也可以根据标记排除测试。比如说有些测试耗时较长,你不想在Miri
和本地运行它们。你可以轻松地通过以下方式排除所有Miri
测试
$ cargo test -- --skip :miri:
多个标记
可以提供一组标记,可以是逗号分隔的形式,也可以通过多次提供属性来实现
use test_tag::tag;
#[tag(tag1, tag2)]
#[test]
fn test1() {}
// The above is equivalent to:
#[tag(tag1)]
#[tag(tag2)]
#[test]
fn test1() {}
限制
然而,请注意,Rust测试框架的限制可能意味着您可能无法对标记表达任意的约束。例如,标准的单元测试不允许您指定两个标记的合取
$ cargo test -- :tag1: :tag2:
上述内容将被解释为“运行所有具有:tag1:
或 :tag2:
(或两者)的测试”。
依赖
~265–710KB
~17K SLoC