func reportXUnitFormat()

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
}