Skip to content

Commit c5e2909

Browse files
authored
fix(runner): run onTestFinished and onTestFailed during retry and repeats (#6609)
1 parent 5f75790 commit c5e2909

File tree

2 files changed

+162
-21
lines changed

2 files changed

+162
-21
lines changed

Diff for: packages/runner/src/run.ts

+23-20
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,29 @@ export async function runTest(test: Test | Custom, runner: VitestRunner): Promis
271271
failTask(test.result, e, runner.config.diffOptions)
272272
}
273273

274+
try {
275+
await callTaskHooks(test, test.onFinished || [], 'stack')
276+
}
277+
catch (e) {
278+
failTask(test.result, e, runner.config.diffOptions)
279+
}
280+
281+
if (test.result.state === 'fail') {
282+
try {
283+
await callTaskHooks(
284+
test,
285+
test.onFailed || [],
286+
runner.config.sequence.hooks,
287+
)
288+
}
289+
catch (e) {
290+
failTask(test.result, e, runner.config.diffOptions)
291+
}
292+
}
293+
294+
delete test.onFailed
295+
delete test.onFinished
296+
274297
if (test.result.state === 'pass') {
275298
break
276299
}
@@ -286,26 +309,6 @@ export async function runTest(test: Test | Custom, runner: VitestRunner): Promis
286309
}
287310
}
288311

289-
try {
290-
await callTaskHooks(test, test.onFinished || [], 'stack')
291-
}
292-
catch (e) {
293-
failTask(test.result, e, runner.config.diffOptions)
294-
}
295-
296-
if (test.result.state === 'fail') {
297-
try {
298-
await callTaskHooks(
299-
test,
300-
test.onFailed || [],
301-
runner.config.sequence.hooks,
302-
)
303-
}
304-
catch (e) {
305-
failTask(test.result, e, runner.config.diffOptions)
306-
}
307-
}
308-
309312
// if test is marked to be failed, flip the result
310313
if (test.fails) {
311314
if (test.result.state === 'pass') {

Diff for: test/core/test/on-finished.test.ts

+139-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { expect, it, onTestFinished } from 'vitest'
1+
import { describe, expect, it, onTestFailed, onTestFinished } from 'vitest'
22

33
const collected: any[] = []
44
const multiple: any[] = []
@@ -59,3 +59,141 @@ it('after', () => {
5959
expect(collected).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
6060
expect(multiple).toEqual([4, 3, 2, 1])
6161
})
62+
63+
describe('repeats pass', () => {
64+
const state: string[] = []
65+
66+
it('run', { repeats: 2 }, (t) => {
67+
const tag = `(${t.task.result?.retryCount}, ${t.task.result?.repeatCount}) `
68+
state.push(`${tag}run`)
69+
70+
onTestFinished(() => {
71+
state.push(`${tag}finish`)
72+
})
73+
74+
onTestFailed(() => {
75+
state.push(`${tag}fail`)
76+
})
77+
})
78+
79+
it('assert', () => {
80+
expect(state).toMatchInlineSnapshot(`
81+
[
82+
"(0, 0) run",
83+
"(0, 0) finish",
84+
"(0, 1) run",
85+
"(0, 1) finish",
86+
"(0, 2) run",
87+
"(0, 2) finish",
88+
]
89+
`)
90+
})
91+
})
92+
93+
describe('repeats fail', () => {
94+
const state: string[] = []
95+
96+
it.fails('run', { repeats: 2 }, (t) => {
97+
const tag = `(${t.task.result?.retryCount}, ${t.task.result?.repeatCount}) `
98+
state.push(`${tag}run`)
99+
100+
onTestFinished(() => {
101+
state.push(`${tag}finish`)
102+
})
103+
104+
onTestFailed(() => {
105+
state.push(`${tag}fail`)
106+
})
107+
108+
if (t.task.result?.repeatCount === 1) {
109+
throw new Error('fail')
110+
}
111+
})
112+
113+
it('assert', () => {
114+
expect(state).toMatchInlineSnapshot(`
115+
[
116+
"(0, 0) run",
117+
"(0, 0) finish",
118+
"(0, 1) run",
119+
"(0, 1) finish",
120+
"(0, 1) fail",
121+
"(0, 2) run",
122+
"(0, 2) finish",
123+
"(0, 2) fail",
124+
]
125+
`)
126+
})
127+
})
128+
129+
describe('retry pass', () => {
130+
const state: string[] = []
131+
132+
it('run', { retry: 2 }, (t) => {
133+
const tag = `(${t.task.result?.retryCount}, ${t.task.result?.repeatCount}) `
134+
state.push(`${tag}run`)
135+
136+
onTestFinished(() => {
137+
state.push(`${tag}finish`)
138+
})
139+
140+
onTestFailed(() => {
141+
state.push(`${tag}fail`)
142+
})
143+
144+
if (t.task.result?.retryCount && t.task.result?.retryCount > 1) {
145+
return
146+
}
147+
throw new Error('fail')
148+
})
149+
150+
it('assert', () => {
151+
expect(state).toMatchInlineSnapshot(`
152+
[
153+
"(0, 0) run",
154+
"(0, 0) finish",
155+
"(0, 0) fail",
156+
"(1, 0) run",
157+
"(1, 0) finish",
158+
"(1, 0) fail",
159+
"(2, 0) run",
160+
"(2, 0) finish",
161+
]
162+
`)
163+
})
164+
})
165+
166+
describe('retry fail', () => {
167+
const state: string[] = []
168+
169+
it.fails('run', { retry: 2 }, (t) => {
170+
const tag = `(${t.task.result?.retryCount}, ${t.task.result?.repeatCount}) `
171+
state.push(`${tag}run`)
172+
173+
onTestFinished(() => {
174+
state.push(`${tag}finish`)
175+
})
176+
177+
onTestFailed(() => {
178+
state.push(`${tag}fail`)
179+
})
180+
181+
throw new Error('fail')
182+
})
183+
184+
it('assert', () => {
185+
expect(state).toMatchInlineSnapshot(`
186+
[
187+
"(0, 0) run",
188+
"(0, 0) finish",
189+
"(0, 0) fail",
190+
"(1, 0) run",
191+
"(1, 0) finish",
192+
"(1, 0) fail",
193+
"(2, 0) run",
194+
"(2, 0) finish",
195+
"(2, 0) fail",
196+
]
197+
`)
198+
})
199+
})

0 commit comments

Comments
 (0)