in internal/testrunner/reporters/formats/xunit.go [53:143]
func reportXUnitFormat(results []testrunner.TestResult) (string, error) {
// test type => package => data stream => test cases
tests := map[string]map[string]map[string][]testCase{}
var numTests, numFailures, numErrors, numSkipped int
for _, r := range results {
testType := string(r.TestType)
if _, exists := tests[testType]; !exists {
tests[testType] = map[string]map[string][]testCase{}
}
if _, exists := tests[testType][r.Package]; !exists {
tests[testType][r.Package] = map[string][]testCase{}
}
if _, exists := tests[testType][r.Package][r.DataStream]; !exists {
tests[testType][r.Package][r.DataStream] = make([]testCase, 0)
}
var failure string
if r.FailureMsg != "" {
failure = r.FailureMsg
numFailures++
}
if r.FailureDetails != "" {
failure += ": " + r.FailureDetails
}
if r.ErrorMsg != "" {
numErrors++
}
if r.Skipped != nil {
numSkipped++
}
name := fmt.Sprintf("%s test", r.TestType)
if r.Name != "" {
name += ": " + r.Name
}
c := testCase{
Name: name,
ClassName: fmt.Sprintf("%s.%s", r.Package, r.DataStream),
TimeInSeconds: r.TimeElapsed.Seconds(),
Error: r.ErrorMsg,
Failure: failure,
}
if r.Skipped != nil {
c.Skipped = &skipped{r.Skipped.String()}
}
numTests++
tests[testType][r.Package][r.DataStream] = append(tests[testType][r.Package][r.DataStream], c)
}
var ts testSuites
ts.Suites = make([]testSuite, 0)
for testType, packages := range tests {
testTypeSuite := testSuite{
Comment: fmt.Sprintf("test suite for %s tests", testType),
Name: testType,
NumTests: numTests,
NumFailures: numFailures,
NumErrors: numErrors,
NumSkipped: numSkipped,
Cases: make([]testCase, 0),
}
for _, pkg := range packages {
for _, ds := range pkg {
testTypeSuite.Cases = append(testTypeSuite.Cases, ds...)
}
}
ts.Suites = append(ts.Suites, testTypeSuite)
}
out, err := xml.MarshalIndent(&ts, "", " ")
if err != nil {
return "", fmt.Errorf("unable to format test results as xUnit: %w", err)
}
return xml.Header + string(out), nil
}