#tags #tagging #test

test-tag

为 #[test] 测试提供方便的标记/分组属性 #[tag]

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

Download history 502/week @ 2024-05-31 748/week @ 2024-06-07 438/week @ 2024-06-14 38/week @ 2024-06-21 45/week @ 2024-06-28 78/week @ 2024-07-05 616/week @ 2024-07-12 586/week @ 2024-07-19 788/week @ 2024-07-26 422/week @ 2024-08-02 763/week @ 2024-08-09 583/week @ 2024-08-16

每月下载量 2,646
3 crates 中使用

Apache-2.0 或 MIT 协议

16KB
189

pipeline crates.io Docs

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