mirror of
https://github.com/oven-sh/bun
synced 2026-02-12 11:59:00 +00:00
## Summary Adds a new `concurrentTestGlob` configuration option to bunfig.toml that allows test files matching a glob pattern to automatically run with concurrent test execution enabled. This provides granular control over which tests run concurrently without modifying test files or using the global `--concurrent` flag. ## Problem Currently, enabling concurrent test execution in Bun requires either: 1. Using the `--concurrent` flag (affects ALL tests) 2. Manually adding `test.concurrent()` to individual test functions (requires modifying test files) This creates challenges for: - Large codebases wanting to gradually migrate to concurrent testing - Projects with mixed test types (unit tests that need isolation vs integration tests that can run in parallel) - CI/CD pipelines that want to optimize test execution without code changes ## Solution This PR introduces a `concurrentTestGlob` option in bunfig.toml that automatically enables concurrent execution for test files matching a specified glob pattern: ```toml [test] concurrentTestGlob = "**/concurrent-*.test.ts" ``` ### Key Features - ✅ Non-breaking: Completely opt-in via configuration - ✅ Flexible: Use glob patterns to target specific test files or directories - ✅ Override-friendly: `--concurrent` flag still forces all tests to run concurrently - ✅ Zero code changes: No need to modify existing test files ## Implementation Details ### Code Changes 1. Added `concurrent_test_glob` field to `TestOptions` struct (`src/cli.zig`) 2. Added parsing for `concurrentTestGlob` from bunfig.toml (`src/bunfig.zig`) 3. Added `concurrent_test_glob` field to `TestRunner` (`src/bun.js/test/jest.zig`) 4. Implemented `shouldFileRunConcurrently()` method that checks file paths against the glob pattern 5. Updated test execution logic to apply concurrent mode based on glob matching (`src/bun.js/test/ScopeFunctions.zig`) ### How It Works - When a test file is loaded, its path is checked against the configured glob pattern - If it matches, all tests in that file run concurrently (as if `--concurrent` was passed) - Files not matching the pattern run sequentially as normal - The `--concurrent` CLI flag overrides this behavior when specified ## Usage Examples ### Basic Usage ```toml # bunfig.toml [test] concurrentTestGlob = "**/integration/*.test.ts" ``` ### Multiple Patterns ```toml [test] concurrentTestGlob = [ "**/integration/*.test.ts", "**/e2e/*.test.ts", "**/concurrent-*.test.ts" ] ``` ### Migration Strategy Teams can gradually migrate to concurrent testing: 1. Start with integration tests: `"**/integration/*.test.ts"` 2. Add stable unit tests: `"**/fast-*.test.ts"` 3. Eventually migrate most tests except those requiring isolation ## Testing Added comprehensive test coverage in `test/cli/test/concurrent-test-glob.test.ts`: - ✅ Tests matching glob patterns run concurrently (verified via execution order logging) - ✅ Tests not matching patterns run sequentially (verified via shared state and execution order) - ✅ `--concurrent` flag properly overrides the glob setting - Tests use file system logging to deterministically verify concurrent vs sequential execution ## Documentation Complete documentation added: - `docs/runtime/bunfig.md` - Configuration reference - `docs/test/configuration.md` - Test configuration details - `docs/test/examples/concurrent-test-glob.md` - Comprehensive example with migration guide ## Performance Considerations - Glob matching happens once per test file during loading - Uses Bun's existing `glob.match()` implementation - Minimal overhead: simple string pattern matching - Future optimization: Could cache match results per file path ## Breaking Changes None. This is a fully backward-compatible, opt-in feature. ## Checklist - [x] Implementation complete and building - [x] Tests passing - [x] Documentation updated - [x] No breaking changes - [x] Follows existing code patterns ## Related Issues This addresses common requests for more granular control over concurrent test execution, particularly for large codebases migrating from other test runners. 🤖 Generated with [Claude Code](https://claude.ai/code) --------- Co-authored-by: Claude Bot <claude-bot@bun.sh> Co-authored-by: Claude <noreply@anthropic.com> Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
127 lines
4.1 KiB
Markdown
127 lines
4.1 KiB
Markdown
Configure `bun test` via `bunfig.toml` file and command-line options. This page documents the available configuration options for `bun test`.
|
|
|
|
## bunfig.toml options
|
|
|
|
You can configure `bun test` behavior by adding a `[test]` section to your `bunfig.toml` file:
|
|
|
|
```toml
|
|
[test]
|
|
# Options go here
|
|
```
|
|
|
|
### Test discovery
|
|
|
|
#### root
|
|
|
|
The `root` option specifies a root directory for test discovery, overriding the default behavior of scanning from the project root.
|
|
|
|
```toml
|
|
[test]
|
|
root = "src" # Only scan for tests in the src directory
|
|
```
|
|
|
|
### Reporters
|
|
|
|
#### reporter.junit
|
|
|
|
Configure the JUnit reporter output file path directly in the config file:
|
|
|
|
```toml
|
|
[test.reporter]
|
|
junit = "path/to/junit.xml" # Output path for JUnit XML report
|
|
```
|
|
|
|
This complements the `--reporter=junit` and `--reporter-outfile` CLI flags.
|
|
|
|
### Memory usage
|
|
|
|
#### smol
|
|
|
|
Enable the `--smol` memory-saving mode specifically for the test runner:
|
|
|
|
```toml
|
|
[test]
|
|
smol = true # Reduce memory usage during test runs
|
|
```
|
|
|
|
This is equivalent to using the `--smol` flag on the command line.
|
|
|
|
### Test execution
|
|
|
|
#### concurrentTestGlob
|
|
|
|
Automatically run test files matching a glob pattern with concurrent test execution enabled. This is useful for gradually migrating test suites to concurrent execution or for running specific test types concurrently.
|
|
|
|
```toml
|
|
[test]
|
|
concurrentTestGlob = "**/concurrent-*.test.ts" # Run files matching this pattern concurrently
|
|
```
|
|
|
|
Test files matching this pattern will behave as if the `--concurrent` flag was passed, running all tests within those files concurrently. This allows you to:
|
|
|
|
- Gradually migrate your test suite to concurrent execution
|
|
- Run integration tests concurrently while keeping unit tests sequential
|
|
- Separate fast concurrent tests from tests that require sequential execution
|
|
|
|
The `--concurrent` CLI flag will override this setting when specified, forcing all tests to run concurrently regardless of the glob pattern.
|
|
|
|
### Coverage options
|
|
|
|
In addition to the options documented in the [coverage documentation](./coverage.md), the following options are available:
|
|
|
|
#### coverageSkipTestFiles
|
|
|
|
Exclude files matching test patterns (e.g., \*.test.ts) from the coverage report:
|
|
|
|
```toml
|
|
[test]
|
|
coverageSkipTestFiles = true # Exclude test files from coverage reports
|
|
```
|
|
|
|
#### coverageThreshold (Object form)
|
|
|
|
The coverage threshold can be specified either as a number (as shown in the coverage documentation) or as an object with specific thresholds:
|
|
|
|
```toml
|
|
[test]
|
|
# Set specific thresholds for different coverage metrics
|
|
coverageThreshold = { lines = 0.9, functions = 0.8, statements = 0.85 }
|
|
```
|
|
|
|
Setting any of these enables `fail_on_low_coverage`, causing the test run to fail if coverage is below the threshold.
|
|
|
|
#### coveragePathIgnorePatterns
|
|
|
|
Exclude specific files or file patterns from coverage reports using glob patterns:
|
|
|
|
```toml
|
|
[test]
|
|
# Single pattern
|
|
coveragePathIgnorePatterns = "**/*.spec.ts"
|
|
|
|
# Multiple patterns
|
|
coveragePathIgnorePatterns = [
|
|
"**/*.spec.ts",
|
|
"**/*.test.ts",
|
|
"src/utils/**",
|
|
"*.config.js"
|
|
]
|
|
```
|
|
|
|
Files matching any of these patterns will be excluded from coverage calculation and reporting. See the [coverage documentation](./coverage.md) for more details and examples.
|
|
|
|
#### coverageIgnoreSourcemaps
|
|
|
|
Internally, Bun transpiles every file. That means code coverage must also go through sourcemaps before they can be reported. We expose this as a flag to allow you to opt out of this behavior, but it will be confusing because during the transpilation process, Bun may move code around and change variable names. This option is mostly useful for debugging coverage issues.
|
|
|
|
```toml
|
|
[test]
|
|
coverageIgnoreSourcemaps = true # Don't use sourcemaps for coverage analysis
|
|
```
|
|
|
|
When using this option, you probably want to stick a `// @bun` comment at the top of the source file to opt out of the transpilation process.
|
|
|
|
### Install settings inheritance
|
|
|
|
The `bun test` command inherits relevant network and installation configuration (registry, cafile, prefer, exact, etc.) from the `[install]` section of bunfig.toml. This is important if tests need to interact with private registries or require specific install behaviors triggered during the test run.
|