From 7ea4ac8f254b42e7952763210a2c0bfe86281937 Mon Sep 17 00:00:00 2001 From: Teresa Romero Date: Thu, 13 Nov 2025 13:56:07 +0100 Subject: [PATCH 1/2] feat: add JSON format support for test reports and update file output extension --- internal/cobraext/flags.go | 2 +- internal/testrunner/reporters/formats/json.go | 72 +++++++++++++++++++ internal/testrunner/reporters/outputs/file.go | 5 +- 3 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 internal/testrunner/reporters/formats/json.go diff --git a/internal/cobraext/flags.go b/internal/cobraext/flags.go index 2441040f45..ad0c1fdc5d 100644 --- a/internal/cobraext/flags.go +++ b/internal/cobraext/flags.go @@ -160,7 +160,7 @@ const ( ProfileFormatFlagDescription = "format of the profiles list (table | json)" ReportFormatFlagName = "report-format" - ReportFormatFlagDescription = "format of test report, eg: human, xUnit" + ReportFormatFlagDescription = "format of test report, eg: human, xUnit, json" ReportFullFlagName = "full" ReportFullFlagDescription = "whether to show the full report or a summary" diff --git a/internal/testrunner/reporters/formats/json.go b/internal/testrunner/reporters/formats/json.go new file mode 100644 index 0000000000..452f4d9825 --- /dev/null +++ b/internal/testrunner/reporters/formats/json.go @@ -0,0 +1,72 @@ +// Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one +// or more contributor license agreements. Licensed under the Elastic License; +// you may not use this file except in compliance with the Elastic License. + +package formats + +import ( + "encoding/json" + "fmt" + + "github.com/elastic/elastic-package/internal/testrunner" +) + +func init() { + testrunner.RegisterReporterFormat(ReportFormatJSON, reportJSONFormat) +} + +const ( + // ReportFormatJSON reports test results in a JSON format + ReportFormatJSON testrunner.TestReportFormat = "json" +) + +type jsonResult struct { + Package string `json:"package"` + DataStream string `json:"data_stream,omitempty"` + TestType string `json:"test_type"` + Name string `json:"name"` + Result string `json:"result"` + TimeElapsed string `json:"time_elapsed"` + FailureDetails string `json:"failure_details,omitempty"` +} + +func reportJSONFormat(results []testrunner.TestResult) (string, error) { + if len(results) == 0 { + return "No test results", nil + } + + jsonReport := make([]jsonResult, 0, len(results)) + for _, r := range results { + jsonResult := jsonResult{ + Package: r.Package, + DataStream: r.DataStream, + TestType: string(r.TestType), + Name: r.Name, + TimeElapsed: r.TimeElapsed.String(), + } + + if r.FailureMsg != "" { + jsonResult.FailureDetails = fmt.Sprintf("%s/%s %s:\n%s\n", r.Package, r.DataStream, r.Name, r.FailureDetails) + } + + var result string + if r.ErrorMsg != "" { + result = fmt.Sprintf("ERROR: %s", r.ErrorMsg) + } else if r.FailureMsg != "" { + result = fmt.Sprintf("FAIL: %s", r.FailureMsg) + } else if r.Skipped != nil { + result = fmt.Sprintf("SKIPPED: %s", r.Skipped.String()) + } else { + result = "PASS" + } + jsonResult.Result = result + + jsonReport = append(jsonReport, jsonResult) + } + + b, err := json.Marshal(jsonReport) + if err != nil { + return "", fmt.Errorf("marshaling test results to JSON: %w", err) + } + return string(b), nil +} diff --git a/internal/testrunner/reporters/outputs/file.go b/internal/testrunner/reporters/outputs/file.go index 4588357e56..bf04cfbc90 100644 --- a/internal/testrunner/reporters/outputs/file.go +++ b/internal/testrunner/reporters/outputs/file.go @@ -39,8 +39,11 @@ func reportToFile(pkg, report string, testType testrunner.TestType, format testr } ext := "txt" - if format == formats.ReportFormatXUnit { + switch format { + case formats.ReportFormatXUnit: ext = "xml" + case formats.ReportFormatJSON: + ext = "json" } fileName := fmt.Sprintf("%s-%s-%d.%s", pkg, testType, time.Now().UnixNano(), ext) From 17528db0553ac6d4b1e2b6fa9cfacc56ebd84f76 Mon Sep 17 00:00:00 2001 From: Tere Date: Wed, 26 Nov 2025 09:04:45 +0100 Subject: [PATCH 2/2] Update internal/testrunner/reporters/formats/json.go Co-authored-by: Dan Kortschak --- internal/testrunner/reporters/formats/json.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/testrunner/reporters/formats/json.go b/internal/testrunner/reporters/formats/json.go index 452f4d9825..3e8f424731 100644 --- a/internal/testrunner/reporters/formats/json.go +++ b/internal/testrunner/reporters/formats/json.go @@ -55,7 +55,7 @@ func reportJSONFormat(results []testrunner.TestResult) (string, error) { } else if r.FailureMsg != "" { result = fmt.Sprintf("FAIL: %s", r.FailureMsg) } else if r.Skipped != nil { - result = fmt.Sprintf("SKIPPED: %s", r.Skipped.String()) + result = fmt.Sprintf("SKIPPED: %s", r.Skipped) } else { result = "PASS" }