问题 内置集成测试是同时还是顺序运行?


我正在编写集成测试以使用数据库。在每次测试开始时,我清除存储并创建一些数据。

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

我检查了数据库,发现在不同测试中创建的文档具有大致相同的创建时间,即使我为每个测试添加延迟(使用 std::thread::sleep_ms(10000))。

你能说明集成测试是如何运行的,是否可以按顺序运行它们?


11331
2018-06-04 09:23


起源



答案:


内置测试框架默认同时运行。它旨在为测试提供有用但简单的支持,满足许多需求,并且许多功能可以/应该 每次测试都要独立测试。 (独立意味着它们可以并行运行。)

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

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

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

接着就,随即, cargo test 将编译并运行 tests/foo.rs 作为二进制。然后,这可以确保对操作进行适当的排序/重置。

或者,可能是一个类似的框架 stainless 拥有您需要的功能。 (我没用过,所以我不确定。)


15
2018-06-04 09:28



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


答案:


内置测试框架默认同时运行。它旨在为测试提供有用但简单的支持,满足许多需求,并且许多功能可以/应该 每次测试都要独立测试。 (独立意味着它们可以并行运行。)

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

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

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

接着就,随即, cargo test 将编译并运行 tests/foo.rs 作为二进制。然后,这可以确保对操作进行适当的排序/重置。

或者,可能是一个类似的框架 stainless 拥有您需要的功能。 (我没用过,所以我不确定。)


15
2018-06-04 09:28



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