What’s changing
Starting September 14, 2026, CircleCI will enforce that all testsuites using Smarter Testing produce valid JUnit output from their test runs. This is required for Test Impact Analysis (TIA) and Dynamic Test Splitting to work correctly.If you are not using Test Impact Analysis (TIA) or Dynamic Test Splitting you can ignore this.
If your testsuite does not produce valid JUnit output by this date, TIA will not work as expected. Test selection and splitting will not have the timing and result data they need to function reliably.
Why we’re making this change
Smarter Testing features like TIA and Dynamic Test Splitting rely on JUnit data to understand which tests ran, how long they took, and whether they passed. Without valid JUnit output, these features can’t accurately select or distribute your tests meaning you will not get the full value from Smarter Testing.
This enforcement ensures every Smarter Testing customer gets consistent, reliable results.
Am I affected?
Thinks to watch for:
- The outputs.junit field is not set in your testsuite’s run command
- The JUnit XML file is missing or malformed (corrupt or empty XML)
- The JUnit results don’t include the test atoms that were run
What you need to do
- Ensure your testsuite’s run command uses outputs.junit
Every testsuite must declare a JUnit output path and pass it to your test runner. Here’s an example using Vitest:
name: ci tests
...
run: vitest run --reporter=junit --outputFile="<< outputs.junit >>" --bail 0 << test.atoms >>
outputs:
junit: test-reports/junit.xml
The key parts:
outputs.junit tells CircleCI where to find your JUnit XML file
- –outputFile=”« outputs.junit »” (or equivalent flag for your test runner) ensures the results are written to the correct location
- –reporter=junit (or equivalent) enables JUnit output in your test runner
- If you use Dynamic Test Splitting, ensure JUnit results include all test atoms
When Dynamic Test Splitting is enabled, your JUnit output must reference the test atoms that were run. The test file paths should appear in the name, classname, or file XML attributes of your JUnit results.
name: ci tests
discover: echo "tests/index.test.ts"
run: vitest run --reporter=junit --outputFile="<< outputs.junit >>" --bail 0 << test.atoms >>
outputs:
junit: test-reports/junit.xml # must include test atoms in name, classname, or file XML attributes
options:
dynamic-test-splitting: true
Adapting for your test runner
The examples above use Vitest, but the same principles apply to any test runner.
You need to:
- Enable JUnit output in your test runner (e.g., –reporter=junit for Vitest, –junitxml for pytest, –format RspecJunitFormatter for RSpec)
- Write the output to « outputs.junit » using your runner’s output file flag Declare the output path under outputs.junit in your testsuite config
Refer to your test runner’s documentation for the specific flags to produce JUnit XML output.