A highly opinionated way for creating Jest Runners
yarn add create-jest-runner
create-jest-runner takes care of handling the appropriate parallelization and creating a worker farm for your runner.
You simply need two files:
- Entry file: Used by Jest as an entrypoint to your runner.
- Run file: Runs once per test file, and it encapsulates the logic of your runner
// index.js
const { createJestRunner } = require('create-jest-runner');
module.exports = createJestRunner(require.resolve('./run'));
pathToRunFile
: path to your run file.config
: Optional argument for configuring the runner.getExtraOptions
:() => object
used for passing extra options to the runner. It needs to be a serializable object because it will be send to a different Node process.
module.exports = options => {};
This file should export a function that receives one parameter with the options
testPath
: Path of the file that is going to be testsconfig
: Jest Project config used by this fileglobalConfig
: Jest global configextraOptions
: The return value of the{ getExtraOptions }
argument ofcreateJestRunner(...)
the entry file.
You can return one of the following values:
testResult
: Needs to be an object of type https://github.com/facebook/jest/blob/master/types/TestResult.js#L137-L165Promise<testResult|Error>
: needs to be of above type.Error
: good for reporting system error, not failed tests.
This runner "blade-runner" makes sure that these two emojis ⚔️ 🏃
are present in every file
// index.js
const { createJestRunner } = require('create-jest-runner');
module.exports = createJestRunner(require.resolve('./run'));
// run.js
const fs = require('fs');
const { pass, fail } = require('create-jest-runner');
module.exports = ({ testPath }) => {
const start = Date.now();
const contents = fs.readFileSync(testPath, 'utf8');
const end = Date.now();
if (contents.includes('⚔️🏃')) {
return pass({ start, end, test: { path: testPath } });
}
const errorMessage = 'Company policies require ⚔️ 🏃 in every file';
return fail({
start,
end,
test: { path: testPath, errorMessage, title: 'Check for ⚔️ 🏃' },
});
};
Once you have your Jest runner you can add it to your Jest config.
In your package.json
{
"jest": {
"runner": "/path/to/my-runner"
}
}
Or in jest.config.js
module.exports = {
runner: '/path/to/my-runner',
};
yarn jest