Cut your test time to the minimum.
Run 5 tests instead of 500.
testless statically analyzes your code down to the function level and picks exactly the tests a change could break. It reads your code, not your coverage.
Install
Pick your ecosystem
testless ships a single Rust binary with native entry points for every ecosystem it supports. All three are equal citizens.
JS / TS
npm i -D testless-cli Go
curl -fsSL https://testless.itaywol.tools/install.sh | sh
brew install itaywol/testless/testless Rust
cargo binstall testless Prefer a prebuilt binary? Grab one from the releases page.
Demo
See it pick the tests
testless indexes the repo into a graph of functions, tests, and imports.
A changed function is diffed structurally, comments and formatting are free.
The reverse impact walk prints only the tests that could break, ready to run.
Scale checked on real repos: astro (6,121 tests, indexed in 3.1s), gin (677 tests, 0.3s), openclaw (106,594 tests across 22,797 files, 86s).
How it works
Three steps, one guarantee
Parse
tree-sitter builds a graph of every function, test, and import across your codebase.
Diff
A structural AST diff finds what actually changed. Comments and formatting are free.
Walk
A reverse impact walk finds every test that can reach the change and prints your runner's own CLI invocation.
Selection is always a superset of the truly impacted tests. testless widens instead of guessing, and never silently skips a test that could fail.