Skip to content

Commit 5e6de27

Browse files
dsyddallhi-ogawa
andauthoredOct 12, 2024··
fix(runner): ensure sequential suite overrides sequence.concurrent (#6653)
Co-authored-by: Hiroshi Ogawa <hi.ogawa.zz@gmail.com>
1 parent 70baaaa commit 5e6de27

6 files changed

+152
-15
lines changed
 

Diff for: ‎packages/runner/src/suite.ts

+5-4
Original file line numberDiff line numberDiff line change
@@ -520,16 +520,17 @@ function createSuite() {
520520
optionsOrFactory,
521521
)
522522

523+
const isConcurrentSpecified = options.concurrent || this.concurrent || options.sequential === false
524+
const isSequentialSpecified = options.sequential || this.sequential || options.concurrent === false
525+
523526
// inherit options from current suite
524527
if (currentSuite?.options) {
525528
options = { ...currentSuite.options, ...options }
526529
}
527530

528531
// inherit concurrent / sequential from suite
529-
const isConcurrent
530-
= options.concurrent || (this.concurrent && !this.sequential)
531-
const isSequential
532-
= options.sequential || (this.sequential && !this.concurrent)
532+
const isConcurrent = isConcurrentSpecified || (options.concurrent && !isSequentialSpecified)
533+
const isSequential = isSequentialSpecified || (options.sequential && !isConcurrentSpecified)
533534
options.concurrent = isConcurrent && !isSequential
534535
options.sequential = isSequential && !isConcurrent
535536

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { describe, expect, test, vi } from 'vitest'
2+
3+
const delay = (timeout: number) => new Promise(resolve => setTimeout(resolve, timeout))
4+
5+
let count = 0
6+
7+
describe.concurrent('concurrent suite', () => {
8+
test('first test completes last', async ({ task }) => {
9+
await delay(40)
10+
expect(task.concurrent).toBeTruthy()
11+
expect(++count).toBe(4)
12+
})
13+
14+
test('second test completes third', async ({ task }) => {
15+
await delay(30)
16+
expect(task.concurrent).toBeTruthy()
17+
expect(++count).toBe(3)
18+
})
19+
})
20+
21+
test.concurrent('third test completes second', async ({ task }) => {
22+
await delay(20)
23+
expect(task.concurrent).toBeTruthy()
24+
expect(++count).toBe(2)
25+
})
26+
27+
test.concurrent('last test completes first', async ({ task }) => {
28+
await delay(10)
29+
expect(task.concurrent).toBeTruthy()
30+
expect(++count).toBe(1)
31+
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { describe, expect, test, vi } from 'vitest'
2+
3+
const delay = (timeout: number) => new Promise(resolve => setTimeout(resolve, timeout))
4+
5+
let count = 0
6+
7+
describe('sequential suite', () => {
8+
test('first test completes first', async ({ task }) => {
9+
await delay(40)
10+
expect(task.concurrent).toBeFalsy()
11+
expect(++count).toBe(1)
12+
})
13+
14+
test('second test completes second', async ({ task }) => {
15+
await delay(30)
16+
expect(task.concurrent).toBeFalsy()
17+
expect(++count).toBe(2)
18+
})
19+
})
20+
21+
test('third test completes third', async ({ task }) => {
22+
await delay(20)
23+
expect(task.concurrent).toBeFalsy()
24+
expect(++count).toBe(3)
25+
})
26+
27+
test('last test completes last', async ({ task }) => {
28+
await delay(10)
29+
expect(task.concurrent).toBeFalsy()
30+
expect(++count).toBe(4)
31+
})
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { describe, expect, test, vi } from 'vitest'
2+
3+
const delay = (timeout: number) => new Promise(resolve => setTimeout(resolve, timeout))
4+
5+
let count = 0
6+
7+
describe('concurrent suite', () => {
8+
test('first test completes last', async ({ task }) => {
9+
await delay(40)
10+
expect(task.concurrent).toBeTruthy()
11+
expect(++count).toBe(4)
12+
})
13+
14+
test('second test completes third', async ({ task }) => {
15+
await delay(30)
16+
expect(task.concurrent).toBeTruthy()
17+
expect(++count).toBe(3)
18+
})
19+
})
20+
21+
test('third test completes second', async ({ task }) => {
22+
await delay(20)
23+
expect(task.concurrent).toBeTruthy()
24+
expect(++count).toBe(2)
25+
})
26+
27+
test('last test completes first', async ({ task }) => {
28+
await delay(10)
29+
expect(task.concurrent).toBeTruthy()
30+
expect(++count).toBe(1)
31+
})
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,31 @@
11
import { describe, expect, test, vi } from 'vitest'
22

3-
vi.setConfig({
4-
sequence: {
5-
concurrent: true,
6-
},
7-
})
8-
93
const delay = (timeout: number) => new Promise(resolve => setTimeout(resolve, timeout))
104

115
let count = 0
126

13-
describe.sequential('running sequential suite when sequence.concurrent is true', () => {
7+
describe.sequential('sequential suite', () => {
148
test('first test completes first', async ({ task }) => {
15-
await delay(50)
9+
await delay(40)
1610
expect(task.concurrent).toBeFalsy()
1711
expect(++count).toBe(1)
1812
})
1913

20-
test('second test completes second', ({ task }) => {
14+
test('second test completes second', async ({ task }) => {
15+
await delay(30)
2116
expect(task.concurrent).toBeFalsy()
2217
expect(++count).toBe(2)
2318
})
2419
})
2520

2621
test.sequential('third test completes third', async ({ task }) => {
27-
await delay(50)
22+
await delay(20)
2823
expect(task.concurrent).toBeFalsy()
2924
expect(++count).toBe(3)
3025
})
3126

32-
test.sequential('fourth test completes fourth', ({ task }) => {
27+
test.sequential('last test completes last', async ({ task }) => {
28+
await delay(10)
3329
expect(task.concurrent).toBeFalsy()
3430
expect(++count).toBe(4)
3531
})

Diff for: ‎test/config/test/sequence-concurrent.test.ts

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { expect, test } from 'vitest'
2+
3+
import { runVitest } from '../../test-utils'
4+
5+
test('should run suites and tests concurrently unless sequential specified when sequence.concurrent is true', async () => {
6+
const { stderr, stdout } = await runVitest({
7+
root: './fixtures/sequence-concurrent',
8+
include: ['sequence-concurrent-true-*.test.ts'],
9+
sequence: {
10+
concurrent: true,
11+
},
12+
})
13+
14+
expect(stderr).toBe('')
15+
16+
expect(stdout).toContain('✓ sequence-concurrent-true-sequential.test.ts > sequential suite > first test completes first')
17+
expect(stdout).toContain('✓ sequence-concurrent-true-sequential.test.ts > sequential suite > second test completes second')
18+
expect(stdout).toContain('✓ sequence-concurrent-true-sequential.test.ts > third test completes third')
19+
expect(stdout).toContain('✓ sequence-concurrent-true-sequential.test.ts > last test completes last')
20+
expect(stdout).toContain('✓ sequence-concurrent-true-concurrent.test.ts > concurrent suite > first test completes last')
21+
expect(stdout).toContain('✓ sequence-concurrent-true-concurrent.test.ts > concurrent suite > second test completes third')
22+
expect(stdout).toContain('✓ sequence-concurrent-true-concurrent.test.ts > third test completes second')
23+
expect(stdout).toContain('✓ sequence-concurrent-true-concurrent.test.ts > last test completes first')
24+
expect(stdout).toContain('Test Files 2 passed (2)')
25+
})
26+
27+
test('should run suites and tests sequentially unless concurrent specified when sequence.concurrent is false', async () => {
28+
const { stderr, stdout } = await runVitest({
29+
root: './fixtures/sequence-concurrent',
30+
include: ['sequence-concurrent-false-*.test.ts'],
31+
sequence: {
32+
concurrent: false,
33+
},
34+
})
35+
36+
expect(stderr).toBe('')
37+
38+
expect(stdout).toContain('✓ sequence-concurrent-false-sequential.test.ts > sequential suite > first test completes first')
39+
expect(stdout).toContain('✓ sequence-concurrent-false-sequential.test.ts > sequential suite > second test completes second')
40+
expect(stdout).toContain('✓ sequence-concurrent-false-sequential.test.ts > third test completes third')
41+
expect(stdout).toContain('✓ sequence-concurrent-false-sequential.test.ts > last test completes last')
42+
expect(stdout).toContain('✓ sequence-concurrent-false-concurrent.test.ts > concurrent suite > first test completes last')
43+
expect(stdout).toContain('✓ sequence-concurrent-false-concurrent.test.ts > concurrent suite > second test completes third')
44+
expect(stdout).toContain('✓ sequence-concurrent-false-concurrent.test.ts > third test completes second')
45+
expect(stdout).toContain('✓ sequence-concurrent-false-concurrent.test.ts > last test completes first')
46+
expect(stdout).toContain('Test Files 2 passed (2)')
47+
})

0 commit comments

Comments
 (0)
Please sign in to comment.