diff --git a/.golangci.next.reference.yml b/.golangci.next.reference.yml index e08464bdd6b8..48e3b710d433 100644 --- a/.golangci.next.reference.yml +++ b/.golangci.next.reference.yml @@ -70,6 +70,7 @@ output: # - `checkstyle` # - `code-climate` # - `junit-xml` + # - `junit-xml-extended` # - `github-actions` # - `teamcity` # - `sarif` diff --git a/jsonschema/golangci.next.jsonschema.json b/jsonschema/golangci.next.jsonschema.json index f8233a77759d..319da8d930cf 100644 --- a/jsonschema/golangci.next.jsonschema.json +++ b/jsonschema/golangci.next.jsonschema.json @@ -520,6 +520,7 @@ "checkstyle", "code-climate", "junit-xml", + "junit-xml-extended", "github-actions", "teamcity", "sarif" diff --git a/pkg/config/output.go b/pkg/config/output.go index 592e293e0b06..6a26d5773e76 100644 --- a/pkg/config/output.go +++ b/pkg/config/output.go @@ -17,6 +17,7 @@ const ( OutFormatCodeClimate = "code-climate" OutFormatHTML = "html" OutFormatJunitXML = "junit-xml" + OutFormatJunitXMLExtended = "junit-xml-extended" OutFormatGithubActions = "github-actions" // Deprecated OutFormatTeamCity = "teamcity" OutFormatSarif = "sarif" @@ -32,6 +33,7 @@ var AllOutputFormats = []string{ OutFormatCodeClimate, OutFormatHTML, OutFormatJunitXML, + OutFormatJunitXMLExtended, OutFormatGithubActions, OutFormatTeamCity, OutFormatSarif, diff --git a/pkg/printers/junitxml.go b/pkg/printers/junitxml.go index 3e3f82f5805c..7d0a703b0a5e 100644 --- a/pkg/printers/junitxml.go +++ b/pkg/printers/junitxml.go @@ -30,6 +30,8 @@ type testCaseXML struct { Name string `xml:"name,attr"` ClassName string `xml:"classname,attr"` Failure failureXML `xml:"failure"` + File string `xml:"file,attr,omitempty"` + Line int `xml:"line,attr,omitempty"` } type failureXML struct { @@ -39,11 +41,15 @@ type failureXML struct { } type JunitXML struct { - w io.Writer + extended bool + w io.Writer } -func NewJunitXML(w io.Writer) *JunitXML { - return &JunitXML{w: w} +func NewJunitXML(extended bool, w io.Writer) *JunitXML { + return &JunitXML{ + extended: extended, + w: w, + } } func (p JunitXML) Print(issues []result.Issue) error { @@ -68,6 +74,11 @@ func (p JunitXML) Print(issues []result.Issue) error { }, } + if p.extended { + tc.File = i.Pos.Filename + tc.Line = i.Pos.Line + } + testSuite.TestCases = append(testSuite.TestCases, tc) suites[suiteName] = testSuite } diff --git a/pkg/printers/junitxml_test.go b/pkg/printers/junitxml_test.go index d5b4bc1f62de..e4dfde195dfa 100644 --- a/pkg/printers/junitxml_test.go +++ b/pkg/printers/junitxml_test.go @@ -42,13 +42,14 @@ func TestJunitXML_Print(t *testing.T) { }, } - buf := new(bytes.Buffer) - printer := NewJunitXML(buf) - - err := printer.Print(issues) - require.NoError(t, err) - - expected := ` + testCases := []struct { + desc string + extended bool + expected string + }{ + { + desc: "basic", + expected: ` -` +`, + }, + { + desc: "extended/complete", + extended: true, + expected: ` + + + + + + + + + + +`, + }, + } + + for _, test := range testCases { + t.Run(test.desc, func(t *testing.T) { + t.Parallel() - assert.Equal(t, expected, buf.String()) + buf := new(bytes.Buffer) + printer := NewJunitXML(test.extended, buf) + + err := printer.Print(issues) + require.NoError(t, err) + + assert.Equal(t, test.expected, buf.String()) + }) + } } diff --git a/pkg/printers/printer.go b/pkg/printers/printer.go index 53db01220e31..20be02e0158e 100644 --- a/pkg/printers/printer.go +++ b/pkg/printers/printer.go @@ -115,7 +115,7 @@ func (c *Printer) createPrinter(format string, w io.Writer) (issuePrinter, error switch format { case config.OutFormatJSON: p = NewJSON(c.reportData, w) - case config.OutFormatColoredLineNumber, config.OutFormatLineNumber: + case config.OutFormatLineNumber, config.OutFormatColoredLineNumber: p = NewText(c.cfg.PrintIssuedLine, format == config.OutFormatColoredLineNumber, c.cfg.PrintLinterName, c.log.Child(logutils.DebugKeyTextPrinter), w) @@ -129,8 +129,8 @@ func (c *Printer) createPrinter(format string, w io.Writer) (issuePrinter, error p = NewCodeClimate(w) case config.OutFormatHTML: p = NewHTML(w) - case config.OutFormatJunitXML: - p = NewJunitXML(w) + case config.OutFormatJunitXML, config.OutFormatJunitXMLExtended: + p = NewJunitXML(format == config.OutFormatJunitXMLExtended, w) case config.OutFormatGithubActions: p = NewGitHubAction(w) case config.OutFormatTeamCity: