我正在编写集成测试来处理数据库.在每个测试开始时,我清除存储并创建一些数据.

我希望测试按顺序运行,以确保使用的是空数据库.但集成测试似乎是并行运行的,因为有时我会在清理数据库后获取现有文档.

我判断了数据库,发现在不同测试中创建的文档具有大致相同的创建时间,即使我 for each 测试添加延迟(std::thread::sleep_ms(10000)).

您能否澄清集成测试是如何运行的,以及是否可以按顺序运行它们?

推荐答案

默认情况下,内置测试框架同时运行.它旨在为测试提供有用但简单的支持,这涵盖了许多需求,并且许多功能可以在每个测试独立于其他测试的情况下进行测试.(独立意味着它们可以并行运行.)

也就是说,它确实会监听RUST_TEST_THREADS环境变量,例如RUST_TEST_THREADS=1 cargo test将在单个线程上运行测试.然而,如果您希望在测试中始终使用此功能,您可能对不使用#[test]感兴趣,或者至少不直接使用#[test]感兴趣.

最灵活的方式是通过cargo对完全定义自己框架的测试的支持,通过Cargo.toml中的以下内容:

[[test]]
name = "foo"
harness = false

这样,cargo test将编译并以二进制形式运行tests/foo.rs.这样可以确保操作顺序正确/复位.

或者,也许像stainless这样的框架具有您需要的功能.(我没用过,所以我不确定.)

Rust相关问答推荐

通用池类型xsx

如何在Rust中为具有多个数据持有者的enum变体编写文档 comments ?

将JSON密钥转换为Polars DataFrame

交叉术语未正确清除屏幕

关于如何初始化弱 struct 字段的语法问题

在文件链实施中绕过borrow 判断器

你能在Rust中弃用一个属性吗?

有没有一种方法可以创建一个闭包来计算Rust中具有随机系数的n次多项式?

为什么 Rust 需要可变引用的显式生命周期而不是常规引用?

仅发布工作区的二进制 crate

Rust FFI 和 CUDA C 性能差异

Rust中如何实现一个与Sized相反的负特性(Unsized)

为什么带有生命周期指定的方法不能被调用两次?

如果不满足条件,如何在 Rust 中引发错误

在 Rust 中如何将值推送到枚举 struct 内的 vec?

为什么拥有 i32 所有权的函数需要它是可变的?

如何在 Rust 中编写修改 struct 的函数

为什么可以从闭包中返回私有 struct

为什么我不能为 Display+Debug 的泛型类型实现 std::error::Error 但有一个不是泛型参数的类型?

为什么 Bevy 的 Trait 边界不满足 Rapier 物理插件?