testx is a universal test runner that auto-detects your project's language and framework, runs your tests, and displays clean, unified output. Zero configuration required.
Why testx?
| Without testx | With testx | |
|---|---|---|
| Rust | cargo test |
testx |
| Python | uv run pytest -v |
testx |
| Go | go test -v ./... |
testx |
| JavaScript | npx vitest run / npx jest |
testx |
| Java | mvn test / gradle test |
testx |
| Output | Different per language | Unified, beautiful |
| CI sharding | Manual config | --partition slice:1/4 |
| Flaky detection | Custom scripts | testx stress |
Features
- Auto-detection — Identifies language and test framework from project files
- 11 languages — Rust, Go, Python, JavaScript/TypeScript, Java, C/C++, Ruby, Elixir, PHP, .NET, Zig
- Multiple output formats — Pretty (default), JSON, JUnit XML, TAP
- CI sharding — Split tests across CI nodes with
--partition slice:1/4orhash:2/3 - Stress testing — Run tests N times to find flaky tests with
testx stress - Impact analysis — Only run tests affected by recent git changes with
--affected - Smart caching — Skip re-running tests when nothing changed with
--cache - Interactive picker — Fuzzy-search and pick specific tests with
testx pick - Watch mode — Re-run tests on file changes
- Retry logic — Automatically retry failing tests
- Parallel execution — Run multiple test suites concurrently
- Coverage integration — LCOV, Cobertura, JaCoCo, Go coverage
- Plugin system — Custom adapters, reporter plugins, shell hooks
- History tracking — Track test health scores, flaky tests, and trends over time
- Monorepo support — Scan and test all projects in a workspace with
testx workspace
Supported Languages
| Language | Frameworks | Package Managers |
|---|---|---|
| Rust | cargo test | — |
| Go | go test | — |
| Python | pytest, unittest, Django | uv, poetry, pdm, venv |
| JavaScript / TypeScript | Jest, Vitest, Mocha, AVA, Bun | npm, pnpm, yarn, bun |
| Java / Kotlin | Maven Surefire, Gradle | mvn, gradle |
| C / C++ | Google Test, CTest, Meson | cmake, meson |
| Ruby | RSpec, Minitest | bundler |
| Elixir | ExUnit | mix |
| PHP | PHPUnit | composer |
| C# / .NET / F# | dotnet test | dotnet |
| Zig | zig build test | — |
Installation
From crates.io
From source
From releases
Download a prebuilt binary from the releases page.
Shell completions
# Bash
# Zsh
# Fish
# PowerShell
Quick Start
# Run tests in the current directory
# Run tests in a specific project
# Detect framework without running tests
# Pass extra arguments to the underlying runner
Usage
Output formats
CI sharding
Split tests across parallel CI jobs:
# Slice-based (deterministic, ordered)
# Hash-based (stable across test additions)
GitHub Actions example:
jobs:
test:
strategy:
matrix:
shard:
steps:
- run: testx --partition slice:${{ matrix.shard }}/4
Flaky test detection
# Run tests 10 times (default)
# Run 50 iterations, stop on first failure
# Cap total time at 60 seconds
Output:
Stress Test Report: 10/10 iterations in 5.23s
Flaky Tests Detected:
test_network_call (7/10 passed, 70.0% pass rate, avg 12ms)
Impact analysis
Only run tests when relevant source files changed:
# Skip tests if only docs changed
# Analyze what changed without running
# Compare against a branch
Smart caching
# Skip re-running if source files haven't changed
# Clear the cache
Monorepo / workspace
Scan a monorepo and run tests across all detected projects:
# Discover and test all projects
# List projects without running
# Only test Rust and Python projects
# Include directories normally skipped (e.g., packages/)
# Run sequentially instead of in parallel
Test history & analytics
Track test health over time:
# Quick overview
# Flaky test report
# Slowest tests trend
# Health score dashboard (A–F grading)
# Last 50 runs
Interactive test picker
Fuzzy-search through all discovered tests, select one or more, and run only those.
Other options
Configuration
Create a testx.toml in your project root (or run testx init):
# Override detected adapter
# adapter = "python"
# Extra arguments for the test runner
= ["-v", "--no-header"]
# Timeout in seconds (0 = no timeout)
= 60
# Environment variables
[]
= "true"
CLI flags always override config file values.
Plugin System
Custom adapters
Define custom test commands in testx.toml:
[[]]
= "my-framework"
= ["my-config.json"]
= "my-test-runner"
= ["--reporter", "json"]
= "json"
Reporter plugins
Built-in reporters:
- Markdown — Generate markdown test reports
- GitHub Actions — Annotations with
::error::/::warning:: - HTML — Standalone HTML report
- Desktop notifications — System notification on completion
Building from Source
Running the test suite
Stats
| Metric | Value |
|---|---|
| Languages supported | 11 |
| Test frameworks | 20+ |
| Source lines | ~34,700 |
| Test count | 1,134 (1,080 unit + 33 CLI + 21 integration) |
| Binary size (release) | 3.8 MB |
| Framework detection | ~5ms |
| Rust source files | 55 |
| Dependencies | minimal (clap, serde, colored, toml, anyhow, notify) |
| Clippy warnings | 0 |
Documentation
Full documentation is available at testx-cli.readthedocs.io.
Contributing
We welcome contributions! Please read these before getting started:
- Contributing Guide — Setup, workflow, and PR process
- Coding Guidelines — Architecture, code style, and module design
- Bug Report Template — Report a bug
- Feature Request Template — Suggest a feature
Pull requests are reviewed against the PR template checklist.