Why are builds of my crate's test not consistent (cargo build vs cargo test vs VSCode-Test-Explorer)
⚓ Rust 📅 2026-04-17 👤 surdeus 👁️ 2TL/TR
Why are build results of my crate's test not consistent - I see rebuilds happen for combinations of these without changes in between?
cargo build --all-targetscargo test -p create_a- VSCode Test Explorer building tests for create_a
Background:
- we use a rust workspace ~40 creates as members
- cargo build --all-targets would build ~600 individual crates (i.e. dependencies + workspace crates)
- one of the crates in workspace "crate_a" would build ~300 individual creates (i.e. dev-dependencies + the crate's test itself)
- we have equivalent observation (see blow) no matter whether or not we use [workspace.dependencies] consistently (same versions and feature sets) for all creates in our workspace (including their dev-dependencies). (we tested for both cases)
Development practice
-
We use VSCode with rust-analyzer extension as development tool on windows workstations.
-
We use .vscode/settings.json having "rust-analyzer.testExplorer": true,
-
we use any of these when we want to verify/debug test cases:
- from terminal: {workspace_root} cargo test (for complete workspace)
- from terminal: {workspace_root}/create_a cargo test (for individual crate in workspace)
- CodeLens: run individual test cases with or without debug triggered from inside source code editor
- Testing view (Test Explorer): run all or individual test cases triggered
-
we usually do a {workspace_root} cargo build --all-targets before we run tests hoping for both:
- a) quick feedback if your change compiles and doesn't break compilation of other test cases
- b) have build results ready for running any number or selection of tests
We suffer from un-expected rebuilds (even without source code changes) in these scenarios. This way we suffer from slow turnaround times.
Observation
Here comes a scenario (Note: no changes to workspace happen in between)
- cargo clean
- cargo build --all-targets
-> creates (among others) \target\debug\deps\crate_a-<hash_a>.exe - cargo test -p crate_a
-> (unexpected) rebuilds some dependencies and creates
target\debug\deps\crate_a-<hash_b>.exe - using test-lens to run a test case
-> no rebuild (as expected), uses
target\debug\deps\crate_a-<hash_b>.exe - using test explorer
-> (unexpected) rebuild some deps + *.exe
-> seems to re-create
(target\debug\deps\crate_a-<hash_b>.exe) - using test-lens to run a test case
-> (unexpected) rebuild some deps + *.exe
-> seems to re-create
(target\debug\deps\crate_a-<hash_b>.exe) - cargo test -p dicom-bridge-poc-converters
-> (as expected) no rebuild
-> uses target\debug\deps\crate_a-<hash_b>.exe - cd .crate_a
- cargo test
-> no rebuild (as expected)
-> uses target\debug\deps\crate_a-<hash_b>.exe - using test lens
-> (as expected) no rebuild
-> uses target\debug\deps\crate_a-<hash_b>.exe - using test explorer
-> (unexpected) rebuild some deps + *.exe
-> uses target\debug\deps\crate_a-<hash_b>.exe
Fazit
It seems there is an (for us) unexpected inconsistency/rebuild happening between
a) cargo build --all-targets (workspace) and the building/running crate_a's test
b) VS Code Test Explorer doesn't seem to 'accept' build result of create_a's test and re-creates it when alredy previously been build.
So for me it comes down to two questions
- Why does
cargo build --all-targetsand individual builds viacargo test -p crate_adon't create/re-use the same build result? - Why does VS Codes's "Test Explorer" and the other ways to create build result for crate_a's do re-builds, even though thy apparently use the same build result?
1 post - 1 participant
🏷️ Rust_feed