mirror of
https://github.com/facebook/react.git
synced 2026-02-23 04:12:21 +00:00
Jest's default test sequencer sorts alphabetically, causing large test files (eg ReactDOMFloat-test.js at 9k lines, ReactHooksWithNoopRenderer-test.js at 4k lines) to cluster in shard 3/5. This made shard 3/5 average 117s vs 77s for other shards, a 52% slowdown. I'm using filesize as a rough proxy for number of tests. This custom sequencer sorts tests by file size and distributes large files evenly across all shards instead of clustering them together. --- [//]: # (BEGIN SAPLING FOOTER) Stack created with [Sapling](https://sapling-scm.com). Best reviewed with [ReviewStack](https://reviewstack.dev/facebook/react/pull/35458). * __->__ #35458 * #35459
29 lines
768 B
JavaScript
29 lines
768 B
JavaScript
'use strict';
|
|
|
|
const Sequencer = require('@jest/test-sequencer').default;
|
|
const fs = require('fs');
|
|
|
|
class SizeBalancedSequencer extends Sequencer {
|
|
shard(tests, {shardIndex, shardCount}) {
|
|
const shards = Array.from({length: shardCount}, () => ({
|
|
tests: [],
|
|
size: 0,
|
|
}));
|
|
const sorted = [...tests].sort(
|
|
(a, b) => fs.statSync(b.path).size - fs.statSync(a.path).size
|
|
);
|
|
|
|
for (let i = 0; i < sorted.length; i++) {
|
|
const test = sorted[i];
|
|
const size = fs.statSync(test.path).size;
|
|
const smallest = shards.reduce((min, s) => (s.size < min.size ? s : min));
|
|
smallest.tests.push(test);
|
|
smallest.size += size;
|
|
}
|
|
|
|
return shards[shardIndex - 1].tests;
|
|
}
|
|
}
|
|
|
|
module.exports = SizeBalancedSequencer;
|