JUnit XML
Selenium Boot generates a JUnit-compatible XML report at target/surefire-reports/TEST-SeleniumBoot.xml. This format is understood by virtually every CI system and test reporting tool.
Report location
target/
└── surefire-reports/
└── TEST-SeleniumBoot.xml
Format
<?xml version="1.0" encoding="UTF-8"?>
<testsuite name="SeleniumBoot" tests="12" failures="1" errors="0" skipped="1" time="34.21">
<testcase classname="LoginTest" name="validLogin" time="2.341"/>
<testcase classname="CheckoutTest" name="checkout_withInvalidCard" time="1.823">
<failure message="Expected [Order confirmed] but found [Payment declined]"
type="org.openqa.selenium.NoSuchElementException">
org.openqa.selenium.NoSuchElementException: no such element
at com.example.tests.CheckoutTest.checkout_withInvalidCard(CheckoutTest.java:42)
...
</failure>
</testcase>
<testcase classname="ProfileTest" name="updateAvatar" time="0.0">
<skipped/>
</testcase>
</testsuite>
Failure messages
The message attribute on <failure> contains the actual assertion message or exception message from your test — not a generic "Test failed" placeholder.
This means CI tools that display failure summaries (GitHub Actions, Jenkins, Azure Pipelines) show meaningful error descriptions without needing to open the full report.
CI integration
GitHub Actions — dorny/test-reporter
- name: Publish test results
uses: dorny/test-reporter@v1
if: always()
with:
name: Selenium Boot Results
path: '**/surefire-reports/TEST-*.xml'
reporter: java-junit
fail-on-empty: false
Jenkins
post {
always {
junit '**/surefire-reports/TEST-*.xml'
}
}
Azure Pipelines
- task: PublishTestResults@2
condition: always()
inputs:
testResultsFormat: JUnit
testResultsFiles: '**/surefire-reports/TEST-*.xml'
testRunTitle: 'Selenium Boot'
Maven Surefire XML
Maven Surefire also generates its own XML files per class in target/surefire-reports/. Both sets of XML files are valid JUnit format and can be published together.
To publish all XML files:
path: 'target/surefire-reports/TEST-*.xml'