Skip to content

Commit 6d146d1

Browse files
authoredJun 22, 2023
fix(runner): make the default value of retry and repeats 0 (#3638)
1 parent 5c0ac4a commit 6d146d1

File tree

9 files changed

+43
-33
lines changed

9 files changed

+43
-33
lines changed
 

‎docs/api/index.md

+4
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,16 @@ interface TestOptions {
1717
timeout?: number
1818
/**
1919
* Will retry the test specific number of times if it fails
20+
*
21+
* @default 0
2022
*/
2123
retry?: number
2224
/**
2325
* Will repeat the same test several times even if it fails each time
2426
* If you have "retry" option and it fails, it will use every retry in each cycle
2527
* Useful for debugging random failings
28+
*
29+
* @default 0
2630
*/
2731
repeats?: number
2832
}

‎packages/runner/src/run.ts

+7-8
Original file line numberDiff line numberDiff line change
@@ -127,22 +127,20 @@ export async function runTest(test: Test, runner: VitestRunner) {
127127
test.result = {
128128
state: 'run',
129129
startTime: start,
130+
retryCount: 0,
130131
}
131132
updateTask(test, runner)
132133

133134
setCurrentTest(test)
134135

135-
const repeats = typeof test.repeats === 'number' ? test.repeats : 1
136-
137-
for (let repeatCount = 0; repeatCount < repeats; repeatCount++) {
138-
const retry = test.retry || 1
139-
140-
for (let retryCount = 0; retryCount < retry; retryCount++) {
136+
const repeats = test.repeats ?? 0
137+
for (let repeatCount = 0; repeatCount <= repeats; repeatCount++) {
138+
const retry = test.retry ?? 0
139+
for (let retryCount = 0; retryCount <= retry; retryCount++) {
141140
let beforeEachCleanups: HookCleanupCallback[] = []
142141
try {
143142
await runner.onBeforeTryTest?.(test, { retry: retryCount, repeats: repeatCount })
144143

145-
test.result.retryCount = retryCount
146144
test.result.repeatCount = repeatCount
147145

148146
beforeEachCleanups = await callSuiteHook(test.suite, test, 'beforeEach', runner, [test.context, test.suite])
@@ -188,9 +186,10 @@ export async function runTest(test: Test, runner: VitestRunner) {
188186
if (test.result.state === 'pass')
189187
break
190188

191-
if (retryCount < retry - 1) {
189+
if (retryCount < retry) {
192190
// reset state when retry test
193191
test.result.state = 'run'
192+
test.result.retryCount = (test.result.retryCount ?? 0) + 1
194193
}
195194

196195
// update retry info

‎packages/runner/src/types/tasks.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -166,15 +166,14 @@ export interface TestOptions {
166166
* Times to retry the test if fails. Useful for making flaky tests more stable.
167167
* When retries is up, the last test error will be thrown.
168168
*
169-
* @default 1
169+
* @default 0
170170
*/
171171
retry?: number
172172
/**
173173
* How many times the test will run.
174174
* Only inner tests will repeat if set on `describe()`, nested `describe()` will inherit parent's repeat by default.
175175
*
176-
* @default 1
177-
*
176+
* @default 0
178177
*/
179178
repeats?: number
180179
}

‎packages/vitest/src/node/reporters/renderers/listRenderer.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ export function renderTree(tasks: Task[], options: ListRendererOptions, level =
100100
if (level === 0 && task.type === 'suite' && task.projectName)
101101
prefix += formatProjectName(task.projectName)
102102

103-
if (task.type === 'test' && task.result?.retryCount && task.result.retryCount > 1)
103+
if (task.type === 'test' && task.result?.retryCount && task.result.retryCount > 0)
104104
suffix += c.yellow(` (retry x${task.result.retryCount})`)
105105

106106
if (task.type === 'suite' && !task.meta?.typecheck) {
@@ -111,7 +111,7 @@ export function renderTree(tasks: Task[], options: ListRendererOptions, level =
111111
if (task.mode === 'skip' || task.mode === 'todo')
112112
suffix += ` ${c.dim(c.gray('[skipped]'))}`
113113

114-
if (task.type === 'test' && task.result?.repeatCount && task.result.repeatCount > 1)
114+
if (task.type === 'test' && task.result?.repeatCount && task.result.repeatCount > 0)
115115
suffix += c.yellow(` (repeat x${task.result.repeatCount})`)
116116

117117
if (task.result?.duration != null) {

‎test/core/test/propagate-options-nested-suite.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,5 @@ describe(
1919
})
2020
})
2121
},
22-
{ retry: 10 },
22+
{ retry: 9 },
2323
)

‎test/core/test/repeats.test.ts

+21-13
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { getCurrentTest } from '@vitest/runner'
12
import { afterAll, describe, expect, test } from 'vitest'
23

34
const testNumbers: number[] = []
@@ -7,16 +8,16 @@ describe('testing it/test', () => {
78

89
test('test 1', () => {
910
testNumbers.push(1)
10-
}, { repeats: 5 })
11+
}, { repeats: 4 })
1112

1213
test('test 2', () => {
1314
testNumbers.push(2)
14-
}, { repeats: 3 })
15+
}, { repeats: 2 })
1516

1617
test.fails('test 3', () => {
1718
testNumbers.push(3)
1819
expect(testNumbers).toStrictEqual(result)
19-
}, { repeats: 1 })
20+
}, { repeats: 0 })
2021

2122
afterAll(() => {
2223
result.push(3)
@@ -30,7 +31,7 @@ describe('testing describe', () => {
3031
test('test 1', () => {
3132
describeNumbers.push(1)
3233
})
33-
}, { repeats: 3 })
34+
}, { repeats: 2 })
3435

3536
afterAll(() => {
3637
expect(describeNumbers).toStrictEqual([1, 1, 1])
@@ -39,14 +40,21 @@ afterAll(() => {
3940
const retryNumbers: number[] = []
4041

4142
describe('testing repeats with retry', () => {
42-
const result = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
43-
test('test 1', () => {
44-
retryNumbers.push(1)
45-
}, { repeats: 5, retry: 2 })
46-
47-
afterAll(() => {
48-
expect(retryNumbers).toStrictEqual(result)
43+
describe('normal test', () => {
44+
const result = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
45+
test.fails('test 1', () => {
46+
retryNumbers.push(1)
47+
expect(1).toBe(2)
48+
}, { repeats: 4, retry: 1 })
49+
50+
afterAll(() => {
51+
expect(retryNumbers).toStrictEqual(result)
52+
})
4953
})
54+
55+
test('should not reset retry count', () => {
56+
expect(getCurrentTest()!.result?.retryCount).toBe(3)
57+
}, { repeats: 2, retry: 1 })
5058
})
5159

5260
const nestedDescribeNumbers: number[] = []
@@ -71,10 +79,10 @@ describe('testing nested describe', () => {
7179
nestedDescribeNumbers.push(4)
7280
})
7381
}, 100)
74-
}, { repeats: 3 })
82+
}, { repeats: 2 })
7583
})
7684

7785
afterAll(() => {
7886
expect(nestedDescribeNumbers).toStrictEqual([1, 1, 2, 2, 3, 3, 3, 4, 4, 4])
7987
})
80-
}, { repeats: 2 })
88+
}, { repeats: 1 })

‎test/core/test/retry-only.test.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,5 @@ describe.only('description.only retry', () => {
1111
it('test should not inherit options from the description block if exists', () => {
1212
count5 += 1
1313
expect(count5).toBe(5)
14-
}, { retry: 5 })
15-
}, { retry: 2 })
14+
}, { retry: 4 })
15+
}, { retry: 1 })

‎test/core/test/retry.test.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ let count1 = 0
44
it('retry test', () => {
55
count1 += 1
66
expect(count1).toBe(3)
7-
}, { retry: 3 })
7+
}, { retry: 2 })
88

99
let count2 = 0
1010
it.fails('retry test fails', () => {
1111
count2 += 1
1212
expect(count2).toBe(3)
13-
}, { retry: 2 })
13+
}, { retry: 1 })
1414

1515
let count3 = 0
1616
it('retry test fails', () => {

‎test/failing/fixtures/expects/soft.test.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,13 @@ test('retry will passed', () => {
7373
expect.soft(num += 1).toBe(3)
7474
expect.soft(num += 1).toBe(4)
7575
}, {
76-
retry: 2,
76+
retry: 1,
7777
})
7878

7979
num = 0
8080
test('retry will failed', () => {
8181
expect.soft(num += 1).toBe(4)
8282
expect.soft(num += 1).toBe(5)
8383
}, {
84-
retry: 2,
84+
retry: 1,
8585
})

0 commit comments

Comments
 (0)
Please sign in to comment.