Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

jest-circus runs children in shuffled order #12922

Merged
merged 92 commits into from Feb 23, 2023
Merged
Show file tree
Hide file tree
Changes from 40 commits
Commits
Show all changes
92 commits
Select commit Hold shift + click to select a range
e43ca99
jest-circus runs children in shuffled order
jhwang98 Jun 7, 2022
bbb1cf3
added shuffle and pseudorandom number generator
jhwang98 Jun 8, 2022
4c1d07c
merged master
Joshua-Hwang Aug 25, 2022
99ac4cd
added cli argv
Joshua-Hwang Sep 3, 2022
882f920
removed unnecessary dependencies
Joshua-Hwang Sep 3, 2022
4df23a9
add console logs about the seed
Joshua-Hwang Sep 3, 2022
dc6e64f
More readable Math.pow()
Joshua-Hwang Sep 3, 2022
3d09cfb
Used recommended logging approach
Joshua-Hwang Sep 3, 2022
f8860e2
Used recommended logging approach
Joshua-Hwang Sep 3, 2022
0bec19f
added prando rng
Joshua-Hwang Sep 3, 2022
3a1d712
bug where rng was recreated every run
Joshua-Hwang Sep 3, 2022
95590dc
swapped order of logs
Joshua-Hwang Sep 3, 2022
14349bd
added typing for the rng
Joshua-Hwang Sep 5, 2022
549988d
Merge branch 'main' of github.com:facebook/jest into feat-randomise-t…
Joshua-Hwang Sep 5, 2022
4ae8ff2
linting issues fixed
jhwang98 Sep 29, 2022
967b32e
unit tests are green
jhwang98 Sep 29, 2022
561146c
used snapshots instead
jhwang98 Sep 30, 2022
2f95b65
added e2e tests
jhwang98 Sep 30, 2022
50bada0
changed valid seeds
jhwang98 Sep 30, 2022
b78fdc2
added changelog message
jhwang98 Sep 30, 2022
3f33508
improved cli help and added documentation
jhwang98 Sep 30, 2022
d84caa1
Merge branch 'main' into feat-randomise-tests
jhwang98 Sep 30, 2022
b5c34fe
Update docs/CLI.md
jhwang98 Sep 30, 2022
b9c5139
Update docs/CLI.md
jhwang98 Sep 30, 2022
1b412b4
skipped jasmine
jhwang98 Sep 30, 2022
c45244c
updated cli help and docs for randomize
jhwang98 Sep 30, 2022
e1e73a0
merged
jhwang98 Sep 30, 2022
2152031
updated documentation order
jhwang98 Sep 30, 2022
6bb9449
Update docs/CLI.md
jhwang98 Sep 30, 2022
164d6fa
Update docs/CLI.md
jhwang98 Sep 30, 2022
79401d1
removed whitespace
jhwang98 Sep 30, 2022
b6c4da4
added copyright headers
jhwang98 Oct 4, 2022
19cf2b5
modifed snapshots to not rely on the actual lines
jhwang98 Oct 4, 2022
ca3a582
Merge branch 'main' into feat-randomise-tests
SimenB Oct 4, 2022
2007d47
move changelog entry
SimenB Oct 4, 2022
9361b80
Merge branch 'facebook:main' into feat-randomise-tests
Joshua-Hwang Oct 6, 2022
4d61ba2
merged master
Joshua-Hwang Oct 12, 2022
a087ce6
added documentation for configuration
Joshua-Hwang Oct 14, 2022
7b4bd2b
merged main
Joshua-Hwang Oct 14, 2022
b175652
using pure-rand
Joshua-Hwang Oct 14, 2022
54cc38c
updated cli message
Joshua-Hwang Oct 14, 2022
974bc5b
added randomize to config
Joshua-Hwang Oct 14, 2022
b4e448f
randomize gets passed to config objects
Joshua-Hwang Oct 14, 2022
816b8e6
lint fix
Joshua-Hwang Oct 14, 2022
4ba33d4
group options returns randomize
Joshua-Hwang Oct 14, 2022
7b40ca5
removed unnecessary messages
Joshua-Hwang Oct 14, 2022
ebf01d5
improved docs
Joshua-Hwang Oct 14, 2022
9172451
updated types
Joshua-Hwang Oct 14, 2022
0797346
changed the type of the rng
Joshua-Hwang Oct 14, 2022
9c0ff4e
unit tests green
Joshua-Hwang Oct 14, 2022
604499d
added unit tests for the shuffling of tests
Joshua-Hwang Oct 14, 2022
001d150
e2e tests green
Joshua-Hwang Oct 14, 2022
30b3452
small change to docs
Joshua-Hwang Oct 14, 2022
8661cad
e2e test for the config
Joshua-Hwang Oct 14, 2022
81d526b
tweaked changelog
Joshua-Hwang Oct 14, 2022
825fdd9
linting fix
Joshua-Hwang Oct 14, 2022
7512738
factorised test
Joshua-Hwang Oct 14, 2022
888f565
Merge branch 'main' into feat-randomise-tests
Joshua-Hwang Oct 17, 2022
a6f6982
Merge branch 'main' into feat-randomise-tests
Joshua-Hwang Oct 20, 2022
57e9836
linting fix
Joshua-Hwang Oct 21, 2022
b844e1b
yarn dedupe
Joshua-Hwang Oct 21, 2022
bbc70a1
show seed true for randomize
Joshua-Hwang Oct 21, 2022
d4509cb
updated docs about randomize
Joshua-Hwang Oct 21, 2022
6ce659d
e2e tests also test randomize
Joshua-Hwang Oct 21, 2022
7bdad9f
updated error message
Joshua-Hwang Oct 21, 2022
08ed42c
Merge branch 'main' of github.com:facebook/jest into feat-randomise-t…
Joshua-Hwang Oct 22, 2022
5fd2e2a
move shuffleArray to jest-circus
Joshua-Hwang Oct 22, 2022
2bffe52
prettier
SimenB Oct 22, 2022
f5b919c
improved randomize docs
Joshua-Hwang Oct 22, 2022
2688290
merged master
Joshua-Hwang Oct 28, 2022
ec85fb8
Merge branch 'main' of github.com:facebook/jest into feat-randomise-t…
Joshua-Hwang Oct 31, 2022
94c0740
Merge branch 'main' of github.com:facebook/jest into feat-randomise-t…
Joshua-Hwang Nov 3, 2022
e212ed9
Merge branch 'main' into feat-randomise-tests
SimenB Nov 7, 2022
5946e84
lint fix
jhwang98 Nov 8, 2022
ebe2485
merged main
jhwang98 Nov 8, 2022
c5145a6
Merge branch 'main' of https://github.com/facebook/jest into feat-ran…
jhwang98 Nov 14, 2022
4705449
merged main
jhwang98 Jan 12, 2023
af913e2
bumped pure-rand package
jhwang98 Jan 13, 2023
a6b4d06
Merge branch 'main' into feat-randomise-tests
jhwang98 Jan 25, 2023
e4f0b24
Merge branch 'main' into feat-randomise-tests
jhwang98 Feb 13, 2023
c4baaaa
yarn.lock updated
jhwang98 Feb 14, 2023
87547f3
fixed copyright headers
jhwang98 Feb 14, 2023
8bfa4c8
Merge branch 'main' into feat-randomise-tests
Joshua-Hwang Feb 16, 2023
0202230
Merge branch 'main' into feat-randomise-tests
SimenB Feb 23, 2023
3a0a4f1
Update packages/jest-config/src/normalize.ts
jhwang98 Feb 23, 2023
43d6f8b
Update packages/jest-core/src/cli/index.ts
jhwang98 Feb 23, 2023
7bd3fe1
Update packages/jest-circus/src/shuffleArray.ts
jhwang98 Feb 23, 2023
cff3995
remove bounds check as it's being done at the normalize level
jhwang98 Feb 23, 2023
7c8bfc1
changed error message slightly
jhwang98 Feb 23, 2023
c3c6516
swapped order for generating rng
jhwang98 Feb 23, 2023
d57bf1c
Update packages/jest-circus/src/run.ts
SimenB Feb 23, 2023
1137ce1
Update packages/jest-circus/src/run.ts
SimenB Feb 23, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Expand Up @@ -2,6 +2,8 @@

### Features

- `[jest-circus, @jest/cli, jest-config]` Add cli feature to randomize order or tests ([#12922](https://github.com/facebook/jest/pull/12922))

### Fixes

### Chore & Maintenance
Expand Down
20 changes: 20 additions & 0 deletions docs/CLI.md
Expand Up @@ -318,6 +318,26 @@ If configuration files are found in the specified paths, _all_ projects specifie

:::

### `--randomize`

Shuffle the order of the tests within a file. The seed used to generate the new order will be printed to stdout.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add something along the lines of "passing the same seed will allow you to recreate the test run" or some such? Preferably with a better wording 😅


:::tip
jhwang98 marked this conversation as resolved.
Show resolved Hide resolved

Additionally you can use the [`--seed`](#--seed) flag to pass the seed value:

```bash
jest --randomize --seed 1234
```

:::

:::note

This option is only supported using the default `jest-circus` test runner.

:::

### `--reporters`

Run tests with specified reporters. [Reporter options](configuration#reporters-arraymodulename--modulename-options) are not available via CLI. Example with multiple reporters:
Expand Down
6 changes: 6 additions & 0 deletions docs/Configuration.md
Expand Up @@ -1216,6 +1216,12 @@ With the `projects` option enabled, Jest will copy the root-level configuration

:::

### `randomize` \[boolean]

Default: `false`

The equivalent of the [`--randomize`](CLI.md#--randomize) flag to randomize the order of the tests in a file.

### `reporters` \[array<moduleName | \[moduleName, options]>]

Default: `undefined`
Expand Down
128 changes: 128 additions & 0 deletions e2e/__tests__/__snapshots__/randomize.test.ts.snap
@@ -0,0 +1,128 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`works with each 1`] = `
"PASS __tests__/each.test.js
✓ test1
✓ test2
✓ test3
describe1
✓ test4
✓ test6
✓ test5
describe3
✓ test11
✓ test12
✓ test10
describe4
✓ test14
✓ test13
✓ test15
describe2
✓ test4
✓ test5
✓ test6"
`;

exports[`works with hooks 1`] = `
"Seed is 123
This is before all
This is before each
test4
This is after each
This is before each
test6
This is after each
This is before each
test5
This is after each
This is before each
test1
This is after each
This is before each
This is before each describe3
test11
This is after each
This is before each
This is before each describe3
test12
This is after each
This is before each
This is before each describe3
test14
This is after each
This is before each
This is before each describe3
test13
This is after each
This is before each
This is before each describe3
test15
This is after each
This is before each
This is before each describe3
test10
This is after each
This is before each
test7
This is after each
This is before each
test8
This is after each
This is before each
test9
This is after each
This is after all describe2
This is before each
test2
This is after each
This is before each
test3
This is after each
This is after all"
`;

exports[`works with passing tests 1`] = `
"PASS __tests__/success.test.js
✓ test1
✓ test2
✓ test3
describe1
✓ test4
✓ test6
✓ test5
describe3
✓ test11
✓ test12
✓ test10
describe4
✓ test14
✓ test13
✓ test15
describe2
✓ test7
✓ test8
✓ test9"
`;

exports[`works with snapshots 1`] = `
"PASS __tests__/snapshots.test.js
✓ test1
✓ test2
✓ test3
describe1
✓ test4
✓ test6
✓ test5
describe3
✓ test11
✓ test12
✓ test10
describe4
✓ test14
✓ test13
✓ test15
describe2
✓ test4
✓ test5
✓ test6"
`;
54 changes: 54 additions & 0 deletions e2e/__tests__/randomize.test.ts
@@ -0,0 +1,54 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

import * as path from 'path';
SimenB marked this conversation as resolved.
Show resolved Hide resolved
import {skipSuiteOnJasmine} from '@jest/test-utils';
import {extractSummary} from '../Utils';
import runJest from '../runJest';

skipSuiteOnJasmine();

const dir = path.resolve(__dirname, '../randomize');

test('works with passing tests', () => {
const result = runJest(dir, [
'success.test.js',
'--randomize',
'--seed',
'123',
]);
const {rest} = extractSummary(result.stderr);
expect(rest).toMatchSnapshot();
});

test('works with each', () => {
const result = runJest(dir, ['each.test.js', '--randomize', '--seed', '123']);
const {rest} = extractSummary(result.stderr);
expect(rest).toMatchSnapshot();
});

test('works with hooks', () => {
const result = runJest(dir, [
'hooks.test.js',
'--randomize',
'--seed',
'123',
]);
// Change in formatting could change this one
expect(result.stdout).toMatchSnapshot();
});

test('works with snapshots', () => {
const result = runJest(dir, [
'snapshots.test.js',
'--randomize',
'--seed',
'123',
]);
const {rest} = extractSummary(result.stderr);
expect(rest).toMatchSnapshot();
});
31 changes: 31 additions & 0 deletions e2e/randomize/__tests__/__snapshots__/snapshots.test.js.snap
@@ -0,0 +1,31 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`describe1 test4 1`] = `4`;

exports[`describe1 test5 1`] = `5`;

exports[`describe1 test6 1`] = `6`;

exports[`describe2 test4 1`] = `4`;

exports[`describe2 test5 1`] = `5`;

exports[`describe2 test6 1`] = `6`;

exports[`describe3 describe4 test13 1`] = `13`;

exports[`describe3 describe4 test14 1`] = `14`;

exports[`describe3 describe4 test15 1`] = `15`;

exports[`describe3 test10 1`] = `10`;

exports[`describe3 test11 1`] = `11`;

exports[`describe3 test12 1`] = `12`;

exports[`test1 1`] = `1`;

exports[`test2 1`] = `2`;

exports[`test3 1`] = `3`;
28 changes: 28 additions & 0 deletions e2e/randomize/__tests__/each.test.js
@@ -0,0 +1,28 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

it.each([1, 2, 3])('test%d', () => {
expect(true).toBe(true);
});

describe.each([1, 2])('describe%d', () => {
it.each([4, 5, 6])('test%d', () => {
expect(true).toBe(true);
});
});

describe('describe3', () => {
it.each([10, 11, 12])('test%d', () => {
expect(true).toBe(true);
});

describe('describe4', () => {
it.each([13, 14, 15])('test%d', () => {
expect(true).toBe(true);
});
});
});
98 changes: 98 additions & 0 deletions e2e/randomize/__tests__/hooks.test.js
@@ -0,0 +1,98 @@
/**
* Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

beforeAll(() => {
process.stdout.write('This is before all\n');
});

beforeEach(() => {
process.stdout.write('This is before each\n');
});

afterEach(() => {
process.stdout.write('This is after each\n');
});

afterAll(() => {
process.stdout.write('This is after all\n');
});

it('test1', () => {
process.stdout.write('test1\n');
});

it('test2', () => {
process.stdout.write('test2\n');
});

it('test3', () => {
process.stdout.write('test3\n');
});

describe('describe1', () => {
it('test4', () => {
process.stdout.write('test4\n');
});

it('test5', () => {
process.stdout.write('test5\n');
});

it('test6', () => {
process.stdout.write('test6\n');
});
});

describe('describe2', () => {
afterAll(() => {
process.stdout.write('This is after all describe2\n');
});

it('test7', () => {
process.stdout.write('test7\n');
});

it('test8', () => {
process.stdout.write('test8\n');
});

it('test9', () => {
process.stdout.write('test9\n');
});
});

describe('describe3', () => {
beforeEach(() => {
process.stdout.write('This is before each describe3\n');
});

it('test10', () => {
process.stdout.write('test10\n');
});

it('test11', () => {
process.stdout.write('test11\n');
});

it('test12', () => {
process.stdout.write('test12\n');
});

describe('describe4', () => {
it('test13', () => {
process.stdout.write('test13\n');
});

it('test14', () => {
process.stdout.write('test14\n');
});

it('test15', () => {
process.stdout.write('test15\n');
});
});
});