Support async sort in custom testSequencer. (#8642)

* Support async sort in testSequencer.

* Add e2e test for async testSequencer.

* Update CHANGELOG.md

* Update CHANGELOG.md
This commit is contained in:
scotthovestadt 2019-07-04 08:49:56 +01:00 committed by GitHub
parent bb01c944f2
commit 9c70ba0563
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 65 additions and 7 deletions

View File

@ -10,6 +10,7 @@
- `[pretty-format]` Render custom displayName of memoized components
- `[jest-validate]` Allow `maxWorkers` as part of the `jest.config.js` ([#8565](https://github.com/facebook/jest/pull/8565))
- `[jest-runtime]` Allow passing configuration objects to transformers ([#7288](https://github.com/facebook/jest/pull/7288))
- `[@jest/core, @jest/test-sequencer]` Support async sort in custom `testSequencer` ([#8642](https://github.com/facebook/jest/pull/8642))
### Fixes

View File

@ -1039,11 +1039,11 @@ An example of such function can be found in our default [jasmine2 test runner pa
Default: `@jest/test-sequencer`
This option allows you to use a custom sequencer instead of Jest's default.
This option allows you to use a custom sequencer instead of Jest's default. `sort` may optionally return a Promise.
Example:
Sort test path alphabetically
Sort test path alphabetically.
```js
const Sequencer = require('@jest/test-sequencer').default;

View File

@ -10,8 +10,43 @@ import runJest from '../runJest';
import {extractSummary} from '../Utils';
const dir = path.resolve(__dirname, '../custom-test-sequencer');
test('run prioritySequence first', () => {
const result = runJest(dir, ['-i']);
test('run prioritySequence first sync', () => {
const result = runJest(
dir,
[
'-i',
'--config',
JSON.stringify({
testSequencer: '<rootDir>/testSequencer.js',
}),
],
{},
);
expect(result.status).toBe(0);
const sequence = extractSummary(result.stderr)
.rest.replace(/PASS /g, '')
.split('\n');
expect(sequence).toEqual([
'./a.test.js',
'./b.test.js',
'./c.test.js',
'./d.test.js',
'./e.test.js',
]);
});
test('run prioritySequence first async', () => {
const result = runJest(
dir,
[
'-i',
'--config',
JSON.stringify({
testSequencer: '<rootDir>/testSequencerAsync.js',
}),
],
{},
);
expect(result.status).toBe(0);
const sequence = extractSummary(result.stderr)
.rest.replace(/PASS /g, '')

View File

@ -1,6 +1,5 @@
{
"jest": {
"testEnvironment": "node",
"testSequencer": "<rootDir>/testSequencer.js"
"testEnvironment": "node"
}
}

View File

@ -0,0 +1,23 @@
/**
* 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.
*/
const Sequencer = require('@jest/test-sequencer').default;
class CustomSequencer extends Sequencer {
sort(tests) {
return new Promise(resolve => {
setTimeout(() => {
const copyTests = Array.from(tests);
resolve(
copyTests.sort((testA, testB) => (testA.path > testB.path ? 1 : -1))
);
}, 50);
});
}
}
module.exports = CustomSequencer;

View File

@ -183,7 +183,7 @@ export default (async function runJest({
}),
);
allTests = sequencer.sort(allTests);
allTests = await sequencer.sort(allTests);
if (globalConfig.listTests) {
const testsPaths = Array.from(new Set(allTests.map(test => test.path)));