diff --git a/reporters/junit_reporter.go b/reporters/junit_reporter.go index 2c9f3c792..975659270 100644 --- a/reporters/junit_reporter.go +++ b/reporters/junit_reporter.go @@ -13,6 +13,7 @@ import ( "fmt" "math" "os" + "path/filepath" "strings" "github.com/onsi/ginkgo/config" @@ -124,6 +125,9 @@ func (reporter *JUnitReporter) SpecSuiteDidEnd(summary *types.SuiteSummary) { reporter.suite.Time = math.Trunc(summary.RunTime.Seconds()*1000) / 1000 reporter.suite.Failures = summary.NumberOfFailedSpecs reporter.suite.Errors = 0 + if err := os.MkdirAll(filepath.Dir(reporter.filename), 0755); err != nil { + fmt.Printf("Failed to create JUnit report file: %s\n\t%s", reporter.filename, err.Error()) + } file, err := os.Create(reporter.filename) if err != nil { fmt.Printf("Failed to create JUnit report file: %s\n\t%s", reporter.filename, err.Error()) diff --git a/reporters/junit_reporter_test.go b/reporters/junit_reporter_test.go index 9b75dc006..fae127e08 100644 --- a/reporters/junit_reporter_test.go +++ b/reporters/junit_reporter_test.go @@ -4,6 +4,7 @@ import ( "encoding/xml" "io/ioutil" "os" + "path/filepath" "time" . "github.com/onsi/ginkgo" @@ -255,4 +256,21 @@ var _ = Describe("JUnit Reporter", func() { }) }) } + + When("output directory doesn't exist", func() { + It("should create before open file", func() { + dir, err := ioutil.TempDir("", "not-exist") + Expect(err).ShouldNot(HaveOccurred()) + defer os.RemoveAll(dir) + + output := filepath.Join(dir, "not", "exist", "report.xml") + reporter := reporters.NewJUnitReporter(output) + reporter.SpecSuiteDidEnd(&types.SuiteSummary{ + NumberOfSpecsThatWillBeRun: 1, + NumberOfFailedSpecs: 0, + RunTime: testSuiteTime, + }) + Ω(output).Should(BeAnExistingFile()) + }) + }) })