内置集成测试是并发还是顺序运行的?

13
我正在编写针对数据库的集成测试。在每次测试开始时,我都会清空存储并创建一些数据。
我希望我的测试按顺序运行,以确保使用空数据库。但是似乎集成测试是并发运行的,因为有时在清空数据库后仍然会得到现有文档。
我检查了数据库,并发现不同测试中创建的文档具有近似的创建时间,即使我为每个测试添加延迟(使用std::thread::sleep_ms(10000))。
您能否澄清集成测试的运行方式,并说明是否可以按顺序运行它们?
2个回答

20

内置的测试框架默认并发运行。它旨在为测试提供有用但简单的支持,涵盖了许多需求,很多功能应该独立于其他测试进行测试(独立意味着它们可以并行运行)。

尽管如此,它确实会监听 RUST_TEST_THREADS 环境变量,例如:RUST_TEST_THREADS=1 cargo test 将在单个线程上运行测试。然而,如果您希望始终为测试使用此功能,您可能不想使用 #[test] 或者至少不要直接使用。

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

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

因此,cargo test 将编译并运行 tests/foo.rs 作为二进制文件。这可以确保操作被适当排序/重置。

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


禁用并发的另一个用例是在调试器中运行测试时。 - Justin Raymond

2

除了环境变量外,另一种选择是使用--test-threads标志。将其设置为单线程以按顺序运行测试。

cargo test -- --test-threads 1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接