Skip to content

Commit

Permalink
fix: distribute rest files over shards jestjs#13027
Browse files Browse the repository at this point in the history
  • Loading branch information
marionebl committed Oct 19, 2022
1 parent 90995df commit ad2c61a
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 4 deletions.
Expand Up @@ -368,6 +368,23 @@ test('returns expected 100/8 shards', async () => {
);

expect(shards.map(shard => shard.length)).toEqual([
13, 13, 13, 13, 13, 13, 13, 9,
13, 13, 13, 13, 12, 12, 12, 12,
]);
});

test('returns expected 55/12 shards', async () => {
const allTests = toTests(new Array(55).fill(true).map((_, i) => `/${i}.js`));

const shards = await Promise.all(
new Array(12).fill(true).map((_, i) =>
sequencer.shard(allTests, {
shardCount: 12,
shardIndex: i + 1,
}),
),
);

expect(shards.map(shard => shard.length)).toEqual([
5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4,
]);
});
27 changes: 24 additions & 3 deletions packages/jest-test-sequencer/src/index.ts
Expand Up @@ -72,6 +72,19 @@ export default class TestSequencer {
return cache;
}

_shardPosition(options: ShardOptions & {suiteLength: number}): number {
const shardRest = options.suiteLength % options.shardCount;
const ratio = options.suiteLength / options.shardCount;

return new Array(options.shardIndex)
.fill(true)
.reduce((acc, _, shardIndex) => {
const dangles = shardIndex < shardRest;
const shardSize = dangles ? Math.ceil(ratio) : Math.floor(ratio);
return acc + shardSize;
}, 0);
}

/**
* Select tests for shard requested via --shard=shardIndex/shardCount
* Sharding is applied before sorting
Expand All @@ -97,9 +110,17 @@ export default class TestSequencer {
tests: Array<Test>,
options: ShardOptions,
): Array<Test> | Promise<Array<Test>> {
const shardSize = Math.ceil(tests.length / options.shardCount);
const shardStart = shardSize * (options.shardIndex - 1);
const shardEnd = shardSize * options.shardIndex;
const shardStart = this._shardPosition({
shardCount: options.shardCount,
shardIndex: options.shardIndex - 1,
suiteLength: tests.length,
});

const shardEnd = this._shardPosition({
shardCount: options.shardCount,
shardIndex: options.shardIndex,
suiteLength: tests.length,
});

return tests
.map(test => {
Expand Down

0 comments on commit ad2c61a

Please sign in to comment.