@@ -10,6 +10,7 @@ import (
10
10
"time"
11
11
12
12
"github.com/cucumber/godog/formatters"
13
+ "github.com/cucumber/godog/internal/models"
13
14
"github.com/cucumber/godog/internal/utils"
14
15
)
15
16
@@ -47,6 +48,40 @@ func junitTimeDuration(from, to time.Time) string {
47
48
return strconv .FormatFloat (to .Sub (from ).Seconds (), 'f' , - 1 , 64 )
48
49
}
49
50
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
+
50
85
func (f * JUnit ) buildJUNITPackageSuite () JunitPackageSuite {
51
86
features := f .Storage .MustGetFeatures ()
52
87
sort .Sort (sortFeaturesByName (features ))
@@ -79,33 +114,37 @@ func (f *JUnit) buildJUNITPackageSuite() JunitPackageSuite {
79
114
var outlineNo = make (map [string ]int )
80
115
for idx , pickle := range pickles {
81
116
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 ])
87
121
}
88
122
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
+ }
90
132
91
133
if len (pickle .Steps ) > 0 {
92
134
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
+ }
95
138
}
96
139
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 )
103
142
}
104
143
105
144
ts .Tests ++
106
145
suite .Tests ++
107
146
108
- pickleStepResults := f .Storage . MustGetPickleStepResultsByPickleID (pickle .Id )
147
+ pickleStepResults := f .getPickleStepResultsByPickleID (pickle .Id )
109
148
for _ , stepResult := range pickleStepResults {
110
149
pickleStep := f .Storage .MustGetPickleStep (stepResult .PickleStepID )
111
150
0 commit comments