Skip to content

Commit ef369b1

Browse files
committed
Mark junit test cases as skipped if no pickle step results available
1 parent 5a5631a commit ef369b1

File tree

1 file changed

+54
-15
lines changed

1 file changed

+54
-15
lines changed

internal/formatters/fmt_junit.go

+54-15
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"time"
1111

1212
"github.com/cucumber/godog/formatters"
13+
"github.com/cucumber/godog/internal/models"
1314
"github.com/cucumber/godog/internal/utils"
1415
)
1516

@@ -47,6 +48,40 @@ func junitTimeDuration(from, to time.Time) string {
4748
return strconv.FormatFloat(to.Sub(from).Seconds(), 'f', -1, 64)
4849
}
4950

51+
// getPickleResult deals with the fact that if there's no result due to 'StopOnFirstFailure' being
52+
// set, MustGetPickleResult panics.
53+
func (f *JUnit) getPickleResult(pickleID string) (res *models.PickleResult) {
54+
defer func() {
55+
if r := recover(); r != nil {
56+
res = nil
57+
}
58+
}()
59+
pr := f.Storage.MustGetPickleResult(pickleID)
60+
res = &pr
61+
return
62+
}
63+
64+
func (f *JUnit) getPickleStepResult(stepID string) (res *models.PickleStepResult) {
65+
defer func() {
66+
if r := recover(); r != nil {
67+
res = nil
68+
}
69+
}()
70+
psr := f.Storage.MustGetPickleStepResult(stepID)
71+
res = &psr
72+
return
73+
}
74+
75+
func (f *JUnit) getPickleStepResultsByPickleID(pickleID string) (res []models.PickleStepResult) {
76+
defer func() {
77+
if r := recover(); r != nil {
78+
res = nil
79+
}
80+
}()
81+
res = f.Storage.MustGetPickleStepResultsByPickleID(pickleID)
82+
return
83+
}
84+
5085
func (f *JUnit) buildJUNITPackageSuite() JunitPackageSuite {
5186
features := f.Storage.MustGetFeatures()
5287
sort.Sort(sortFeaturesByName(features))
@@ -79,33 +114,37 @@ func (f *JUnit) buildJUNITPackageSuite() JunitPackageSuite {
79114
var outlineNo = make(map[string]int)
80115
for idx, pickle := range pickles {
81116
tc := junitTestCase{}
82-
83-
pickleResult := f.Storage.MustGetPickleResult(pickle.Id)
84-
85-
if idx == 0 {
86-
firstPickleStartedAt = pickleResult.StartedAt
117+
tc.Name = pickle.Name
118+
if testcaseNames[tc.Name] > 1 {
119+
outlineNo[tc.Name] = outlineNo[tc.Name] + 1
120+
tc.Name += fmt.Sprintf(" #%d", outlineNo[tc.Name])
87121
}
88122

89-
lastPickleFinishedAt = pickleResult.StartedAt
123+
pickleResult := f.getPickleResult(pickle.Id)
124+
if pickleResult == nil {
125+
tc.Status = skipped.String()
126+
} else {
127+
if idx == 0 {
128+
firstPickleStartedAt = pickleResult.StartedAt
129+
}
130+
lastPickleFinishedAt = pickleResult.StartedAt
131+
}
90132

91133
if len(pickle.Steps) > 0 {
92134
lastStep := pickle.Steps[len(pickle.Steps)-1]
93-
lastPickleStepResult := f.Storage.MustGetPickleStepResult(lastStep.Id)
94-
lastPickleFinishedAt = lastPickleStepResult.FinishedAt
135+
if lastPickleStepResult := f.getPickleStepResult(lastStep.Id); lastPickleStepResult != nil {
136+
lastPickleFinishedAt = lastPickleStepResult.FinishedAt
137+
}
95138
}
96139

97-
tc.Time = junitTimeDuration(pickleResult.StartedAt, lastPickleFinishedAt)
98-
99-
tc.Name = pickle.Name
100-
if testcaseNames[tc.Name] > 1 {
101-
outlineNo[tc.Name] = outlineNo[tc.Name] + 1
102-
tc.Name += fmt.Sprintf(" #%d", outlineNo[tc.Name])
140+
if pickleResult != nil {
141+
tc.Time = junitTimeDuration(pickleResult.StartedAt, lastPickleFinishedAt)
103142
}
104143

105144
ts.Tests++
106145
suite.Tests++
107146

108-
pickleStepResults := f.Storage.MustGetPickleStepResultsByPickleID(pickle.Id)
147+
pickleStepResults := f.getPickleStepResultsByPickleID(pickle.Id)
109148
for _, stepResult := range pickleStepResults {
110149
pickleStep := f.Storage.MustGetPickleStep(stepResult.PickleStepID)
111150

0 commit comments

Comments
 (0)