Skip to content

Commit ee48b95

Browse files
authored
feat(cli): add --repeats CLI option (#10504)
1 parent 4c84cbc commit ee48b95

12 files changed

Lines changed: 78 additions & 1 deletion

File tree

‎docs/.vitepress/config.ts‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,10 @@ export default ({ mode }: { mode: string }) => {
507507
text: 'retry',
508508
link: '/config/retry',
509509
},
510+
{
511+
text: 'repeats',
512+
link: '/config/repeats',
513+
},
510514
{
511515
text: 'onConsoleLog',
512516
link: '/config/onconsolelog',

‎docs/config/repeats.md‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
---
2+
title: repeats | Config
3+
outline: deep
4+
---
5+
6+
# repeats
7+
8+
- **Type:** `number`
9+
- **Default:** `0`
10+
- **CLI:** `--repeats=<number>`
11+
12+
Repeat every test a specific number of times regardless of the result. A test that uses the [`repeats`](/api/test#repeats) test option takes precedence over this value.
13+
14+
This is useful for verifying that tests are stable across multiple runs. If a test fails on any repetition, the whole test is reported as failed.

‎docs/guide/cli-generated.md‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -637,6 +637,13 @@ Delay in milliseconds between retry attempts (default: `0`)
637637

638638
Regex pattern to match error messages that should trigger a retry. Only errors matching this pattern will cause a retry (default: retry on all errors)
639639

640+
### repeats
641+
642+
- **CLI:** `--repeats <number>`
643+
- **Config:** [repeats](/config/repeats)
644+
645+
Repeat every test a specific number of times regardless of the result (default: `0`)
646+
640647
### diff.aAnnotation
641648

642649
- **CLI:** `--diff.aAnnotation <annotation>`

‎packages/vitest/src/node/cli/cli-config.ts‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -630,6 +630,11 @@ export const cliOptionsConfig: VitestCLIOptions = {
630630
},
631631
},
632632
},
633+
repeats: {
634+
description:
635+
'Repeat every test a specific number of times regardless of the result (default: `0`)',
636+
argument: '<number>',
637+
},
633638
diff: {
634639
description:
635640
'DiffOptions object or a path to a module which exports DiffOptions object',

‎packages/vitest/src/node/config/serializeConfig.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export function serializeConfig(project: TestProject): SerializedConfig {
4545
// TODO: non serializable function?
4646
diff: config.diff,
4747
retry: config.retry,
48+
repeats: config.repeats,
4849
disableConsoleIntercept: config.disableConsoleIntercept,
4950
root: config.root,
5051
name: config.name,

‎packages/vitest/src/node/projects/resolveProjects.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ export async function resolveProjects(
5252
'expandSnapshotDiff',
5353
'disableConsoleIntercept',
5454
'retry',
55+
'repeats',
5556
'testNamePattern',
5657
'passWithNoTests',
5758
'bail',

‎packages/vitest/src/node/types/config.ts‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -830,6 +830,13 @@ export interface InlineConfig {
830830
*/
831831
retry?: SerializableRetry
832832

833+
/**
834+
* Repeat every test a specific number of times regardless of the result.
835+
*
836+
* @default 0 // Don't repeat
837+
*/
838+
repeats?: number
839+
833840
/**
834841
* Show full diff when snapshot fails instead of a patch.
835842
*/

‎packages/vitest/src/runtime/config.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export interface SerializedConfig {
3131
testTimeout: number
3232
hookTimeout: number
3333
retry: SerializableRetry
34+
repeats?: number
3435
includeTaskLocation: boolean | undefined
3536
tags: TestTagDefinition[]
3637
tagsFilter: string[] | undefined

‎packages/vitest/src/runtime/runner/suite.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,7 @@ function createSuiteCollector(
387387
file: (currentSuite?.file ?? collectorContext.currentSuite?.file)!,
388388
timeout,
389389
retry: options.retry ?? runner.config.retry,
390-
repeats: options.repeats,
390+
repeats: options.repeats ?? runner.config.repeats,
391391
mode: options.only
392392
? 'only'
393393
: options.skip
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { expect, test } from 'vitest'
2+
3+
test('uses repeats from config', () => {
4+
expect(1 + 1).toBe(2)
5+
})
6+
7+
test('test option overrides config', { repeats: 1 }, () => {
8+
expect(1 + 1).toBe(2)
9+
})

0 commit comments

Comments
 (0)