test: consolidate 25 integration crates into one it binary
Each top-level tests/*.rs was its own crate → its own binary, each statically linking the bundled engine + every dep. 26 of them, so an edit to the lib relinked all 26. Moved the 25 standalone files into tests/it/ under one tests/it/main.rs (the pattern typing_surface already uses); cargo auto-detects it as the `it` target. End state: 2 integration-test binaries instead of 26. Result: target/debug/deps 1.5 GB → 629 MB (-58%). Build time barely moved (clean 22.9s→22.4s, lib-edit relink 13.3s→12.4s) — wall-clock is dominated by compiling, not linking, so this is a disk win, not a speed win (see docs/plans/20260602-test-consolidation.md). Tests unchanged at 2151/0/1; clippy clean; no fixups needed. typing_surface_matrix stays its own already-consolidated binary. Tradeoff: the 25 files now share one crate (a compile error fails the whole `it` binary; module-scoped namespaces, no clashes) — negligible for a solo project.
This commit is contained in:
@@ -0,0 +1,88 @@
|
|||||||
|
# Plan: consolidate integration tests into one binary
|
||||||
|
|
||||||
|
**Date:** 2026-06-02 · **Status:** done
|
||||||
|
|
||||||
|
## Outcome (measured)
|
||||||
|
|
||||||
|
| Metric | Before | After |
|
||||||
|
|---|---|---|
|
||||||
|
| `target/debug/deps` | 1.5 GB | **629 MB** (−58%) |
|
||||||
|
| Integration-test binaries | 26 | **2** (`it` + `typing_surface_matrix`) |
|
||||||
|
| Clean test build | 22.9 s | 22.4 s |
|
||||||
|
| Lib-edit relink | 13.3 s | 12.4 s |
|
||||||
|
| Tests | 2151/0/1 | 2151/0/1 (identical) |
|
||||||
|
|
||||||
|
cargo auto-detected `tests/it/main.rs` as the `it` target — no
|
||||||
|
`[[test]]` entry, no fixups, no warnings.
|
||||||
|
|
||||||
|
**Correction to the build-time hypothesis:** the expected relink
|
||||||
|
speed-up (≈13 s → ≈5 s) did *not* materialise. Wall-clock is dominated
|
||||||
|
by *compiling* (the lib + ~290 deps + the test code's
|
||||||
|
codegen/monomorphisation), not by *linking*. Consolidation collapses 26
|
||||||
|
link steps into 2 — which is why **disk** drops 58 % (each link emits a
|
||||||
|
whole standalone binary) — but compile work is unchanged, so build time
|
||||||
|
barely moves. **The real, durable win is disk, not speed.** Minor cost:
|
||||||
|
editing a single test file now recompiles the whole `it` module set
|
||||||
|
(test-only edits marginally slower; lib edits marginally faster — a
|
||||||
|
wash). Kept for the disk benefit, which is exactly the concern that
|
||||||
|
prompted it.
|
||||||
|
|
||||||
|
## Why
|
||||||
|
|
||||||
|
Each top-level `tests/*.rs` is a separate integration-test *crate* →
|
||||||
|
its own binary, each statically linking the bundled engine + every
|
||||||
|
dependency + debug info. There are **26** of them. With incremental
|
||||||
|
disabled (build-hygiene change, commit `42f9553`), an edit to the lib
|
||||||
|
forces **all 26 to relink**.
|
||||||
|
|
||||||
|
**Measured baseline:**
|
||||||
|
- Lib-edit relink (touch `src/app.rs`, `cargo test --no-run`): **13.3 s**
|
||||||
|
- Clean build of all test targets (`cargo clean && cargo test --no-run`): **22.9 s**
|
||||||
|
- `target/debug/deps`: **1.5 GB**
|
||||||
|
|
||||||
|
Collapsing to one binary turns 26 links into 1 — the dominant cost in
|
||||||
|
both numbers.
|
||||||
|
|
||||||
|
## Approach
|
||||||
|
|
||||||
|
The pattern already used by `tests/typing_surface_matrix.rs` (one
|
||||||
|
binary that `mod`-includes the `tests/typing_surface/` modules). Apply
|
||||||
|
it to the other 25 standalone files.
|
||||||
|
|
||||||
|
Feasibility pre-checks (done, all clear):
|
||||||
|
- **No top-level integration test uses insta** → moving files causes
|
||||||
|
no snapshot-path churn.
|
||||||
|
- **No crate-level `#![…]` attributes** to hoist.
|
||||||
|
- **No shared `mod common;` helpers** to relocate; the 25 files are
|
||||||
|
self-contained (`use rdbms_playground::…`), no inter-file `mod`.
|
||||||
|
|
||||||
|
## Steps
|
||||||
|
|
||||||
|
1. `mkdir tests/it`.
|
||||||
|
2. `git mv` the 25 standalone `tests/*.rs` → `tests/it/<name>.rs`
|
||||||
|
(everything except `typing_surface_matrix.rs`, which stays as its
|
||||||
|
own already-consolidated binary).
|
||||||
|
3. Create `tests/it/main.rs` = `mod <name>;` for all 25.
|
||||||
|
4. Confirm cargo builds it as one target (`tests/it/main.rs`
|
||||||
|
auto-detection; add an explicit `[[test]] name="it"` only if not).
|
||||||
|
5. Fix anything the combined build surfaces (expected minimal): a
|
||||||
|
stray `use crate::` self-ref, or a clippy `dead_code`/unused-import
|
||||||
|
the per-crate split had hidden.
|
||||||
|
|
||||||
|
**End state: 2 integration-test binaries (`it` + `typing_surface_matrix`)
|
||||||
|
instead of 26.**
|
||||||
|
|
||||||
|
## Verification / go-no-go gate
|
||||||
|
|
||||||
|
- Full `cargo test` → identical **2151 / 0 / 1**.
|
||||||
|
- `cargo clippy --all-targets -- -D warnings` clean.
|
||||||
|
- Re-measure relink + clean build; record before/after in the commit.
|
||||||
|
- If the after-numbers aren't materially better, **revert** (all
|
||||||
|
`git mv`, trivially reversible).
|
||||||
|
|
||||||
|
## Tradeoff (accepted)
|
||||||
|
|
||||||
|
Lose per-crate isolation: a compile error fails the whole `it` binary,
|
||||||
|
and the 25 files share one crate namespace (module-scoped — no name
|
||||||
|
clashes). Negligible for a solo teaching project; the build-speed win
|
||||||
|
is the priority.
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
//! Consolidated integration-test binary (see
|
||||||
|
//! `docs/plans/20260602-test-consolidation.md`).
|
||||||
|
//!
|
||||||
|
//! Each former top-level `tests/*.rs` is now a module here, so the
|
||||||
|
//! whole suite links into **one** binary instead of 26 — turning an
|
||||||
|
//! edit-the-lib-then-test cycle from 26 separate links into one.
|
||||||
|
//! `tests/typing_surface_matrix.rs` stays a separate binary (it is
|
||||||
|
//! already a consolidated `mod`-based target).
|
||||||
|
|
||||||
|
mod case_insensitive_names;
|
||||||
|
mod column_op_guards;
|
||||||
|
mod engine_vocabulary_audit;
|
||||||
|
mod friendly_enrichment;
|
||||||
|
mod iteration2_persistence;
|
||||||
|
mod iteration3_rebuild;
|
||||||
|
mod iteration4a_rebuild_command;
|
||||||
|
mod iteration4b_lifecycle_commands;
|
||||||
|
mod iteration5_export_import;
|
||||||
|
mod iteration6_resume_history;
|
||||||
|
mod parse_error_pedagogy;
|
||||||
|
mod project_lifecycle;
|
||||||
|
mod replay_command;
|
||||||
|
mod sql_alter_table;
|
||||||
|
mod sql_create_index;
|
||||||
|
mod sql_create_table;
|
||||||
|
mod sql_delete;
|
||||||
|
mod sql_dml_e2e;
|
||||||
|
mod sql_drop_index;
|
||||||
|
mod sql_drop_table;
|
||||||
|
mod sql_insert;
|
||||||
|
mod sql_select;
|
||||||
|
mod sql_update;
|
||||||
|
mod undo_snapshots;
|
||||||
|
mod walking_skeleton;
|
||||||
Reference in New Issue
Block a user