func JUnitReportXML(report *parser.Report, noXMLHeader bool, goVersion string, w io.Writer) error {
	suites := JUnitTestSuites{}

	// convert Report to JUnit test suites
	for _, pkg := range report.Packages {
		pkg.Benchmarks = mergeBenchmarks(pkg.Benchmarks)
		ts := JUnitTestSuite{
			Tests:      len(pkg.Tests) + len(pkg.Benchmarks),
			Failures:   0,
			Time:       formatTime(pkg.Duration),
			Name:       pkg.Name,
			Properties: []JUnitProperty{},
			TestCases:  []JUnitTestCase{},
		}

		classname := pkg.Name
		if idx := strings.LastIndex(classname, "/"); idx > -1 && idx < len(pkg.Name) {
			classname = pkg.Name[idx+1:]
		}

		// properties
		if goVersion == "" {
			// if goVersion was not specified as a flag, fall back to version reported by runtime
			goVersion = runtime.Version()
		}
		ts.Properties = append(ts.Properties, JUnitProperty{"go.version", goVersion})
		if pkg.CoveragePct != "" {
			ts.Properties = append(ts.Properties, JUnitProperty{"coverage.statements.pct", pkg.CoveragePct})
		}

		// individual test cases
		for _, test := range pkg.Tests {
			testCase := JUnitTestCase{
				Classname: classname,
				Name:      test.Name,
				Time:      formatTime(test.Duration),
				Failure:   nil,
			}

			if test.Result == parser.FAIL {
				ts.Failures++
				testCase.Failure = &JUnitFailure{
					Message:  "Failed",
					Type:     "",
					Contents: strings.Join(test.Output, "\n"),
				}
			}

			if test.Result == parser.SKIP {
				testCase.SkipMessage = &JUnitSkipMessage{strings.Join(test.Output, "\n")}
			}

			ts.TestCases = append(ts.TestCases, testCase)
		}

		// individual benchmarks
		for _, benchmark := range pkg.Benchmarks {
			benchmarkCase := JUnitTestCase{
				Classname: classname,
				Name:      benchmark.Name,
				Time:      formatBenchmarkTime(benchmark.Duration),
			}

			ts.TestCases = append(ts.TestCases, benchmarkCase)
		}

		suites.Suites = append(suites.Suites, ts)
	}

	// to xml
	bytes, err := xml.MarshalIndent(suites, "", "\t")
	if err != nil {
		return err
	}

	writer := bufio.NewWriter(w)

	if !noXMLHeader {
		writer.WriteString(xml.Header)
	}

	writer.Write(bytes)
	writer.WriteByte('\n')
	writer.Flush()

	return nil
}
func JUnitReportXML(report *parser.Report, noXMLHeader bool, goVersion string, w io.Writer) error {
	suites := JUnitTestSuites{}

	
	for _, pkg := range report.Packages {
		pkg.Benchmarks = mergeBenchmarks(pkg.Benchmarks)
		ts := JUnitTestSuite{
			Tests:      len(pkg.Tests) + len(pkg.Benchmarks),
			Failures:   0,
			Time:       formatTime(pkg.Duration),
			Name:       pkg.Name,
			Properties: []JUnitProperty{},
			TestCases:  []JUnitTestCase{},
		}

		classname := pkg.Name
		if idx := strings.LastIndex(classname, "/"); idx > -1 && idx < len(pkg.Name) {
			classname = pkg.Name[idx+1:]
		}

		
		if goVersion == "" {
			
			goVersion = runtime.Version()
		}
		ts.Properties = append(ts.Properties, JUnitProperty{"go.version", goVersion})
		if pkg.CoveragePct != "" {
			ts.Properties = append(ts.Properties, JUnitProperty{"coverage.statements.pct", pkg.CoveragePct})
		}

		
		for _, test := range pkg.Tests {
			testCase := JUnitTestCase{
				Classname: classname,
				Name:      test.Name,
				Time:      formatTime(test.Duration),
				Failure:   nil,
			}

			if test.Result == parser.FAIL {
				ts.Failures++
				testCase.Failure = &JUnitFailure{
					Message:  "Failed",
					Type:     "",
					Contents: strings.Join(test.Output, "\n"),
				}
			}

			if test.Result == parser.SKIP {
				testCase.SkipMessage = &JUnitSkipMessage{strings.Join(test.Output, "\n")}
			}

			ts.TestCases = append(ts.TestCases, testCase)
		}

		
		for _, benchmark := range pkg.Benchmarks {
			benchmarkCase := JUnitTestCase{
				Classname: classname,
				Name:      benchmark.Name,
				Time:      formatBenchmarkTime(benchmark.Duration),
			}

			ts.TestCases = append(ts.TestCases, benchmarkCase)
		}

		suites.Suites = append(suites.Suites, ts)
	}

	
	bytes, err := xml.MarshalIndent(suites, "", "\t")
	if err != nil {
		return err
	}

	writer := bufio.NewWriter(w)

	if !noXMLHeader {
		writer.WriteString(xml.Header)
	}

	writer.Write(bytes)
	writer.WriteByte('\n')
	writer.Flush()

	return nil
}
func JUnitReportXML ( report * parser . Report , noXMLHeader bool , goVersion string , w io . Writer ) error { suites := JUnitTestSuites { } // convert Report to JUnit test suites for _ , pkg := range report . Packages { pkg . Benchmarks = mergeBenchmarks ( pkg . Benchmarks ) ts := JUnitTestSuite { Tests : len ( pkg . Tests ) + len ( pkg . Benchmarks ) , Failures : 0 , Time : formatTime ( pkg . Duration ) , Name : pkg . Name , Properties : [ ] JUnitProperty { } , TestCases : [ ] JUnitTestCase { } , } classname := pkg . Name if idx := strings . LastIndex ( classname , " " ) ; idx > - 1 && idx < len ( pkg . Name ) { classname = pkg . Name [ idx + 1 : ] } // properties if goVersion == " " { // if goVersion was not specified as a flag, fall back to version reported by runtime goVersion = runtime . Version ( ) } ts . Properties = append ( ts . Properties , JUnitProperty { " " , goVersion } ) if pkg . CoveragePct != " " { ts . Properties = append ( ts . Properties , JUnitProperty { " " , pkg . CoveragePct } ) } // individual test cases for _ , test := range pkg . Tests { testCase := JUnitTestCase { Classname : classname , Name : test . Name , Time : formatTime ( test . Duration ) , Failure : nil , } if test . Result == parser . FAIL { ts . Failures ++ testCase . Failure = & JUnitFailure { Message : " " , Type : " " , Contents : strings . Join ( test . Output , " \n " ) , } } if test . Result == parser . SKIP { testCase . SkipMessage = & JUnitSkipMessage { strings . Join ( test . Output , " \n " ) } } ts . TestCases = append ( ts . TestCases , testCase ) } // individual benchmarks for _ , benchmark := range pkg . Benchmarks { benchmarkCase := JUnitTestCase { Classname : classname , Name : benchmark . Name , Time : formatBenchmarkTime ( benchmark . Duration ) , } ts . TestCases = append ( ts . TestCases , benchmarkCase ) } suites . Suites = append ( suites . Suites , ts ) } // to xml bytes , err := xml . MarshalIndent ( suites , " " , " \t " ) if err != nil { return err } writer := bufio . NewWriter ( w ) if ! noXMLHeader { writer . WriteString ( xml . Header ) } writer . Write ( bytes ) writer . WriteByte ( '\n' ) writer . Flush ( ) return nil }
// JUnitReportXML writes a JUnit xml representation of the given report to w
// in the format described at http://windyroad.org/dl/Open%20Source/JUnit.xsd
JUnitReportXML writes a JUnit xml representation of the given report to w in the format described at http : // windyroad . org / dl / Open%20Source / JUnit . xsd