Skip to content

Commit

Permalink
add slow test threshold option
Browse files Browse the repository at this point in the history
  • Loading branch information
Draco-Umbratilis committed Jan 12, 2020
1 parent 9419034 commit b0ba242
Show file tree
Hide file tree
Showing 18 changed files with 67 additions and 9 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -12,6 +12,7 @@
- `[jest-config]` [**BREAKING**] Set default display name color based on runner ([#8689](https://github.com/facebook/jest/pull/8689))
- `[jest-config]` Merge preset globals with project globals ([#9027](https://github.com/facebook/jest/pull/9027))
- `[jest-config]` Support `.cjs` config files ([#9291](https://github.com/facebook/jest/pull/9291))
- `[jest-config, jest-reporter, jest-runner]` Add `slowTestThreshold` configuration option ([#9366](https://github.com/facebook/jest/pull/9366))
- `[jest-core]` Support reporters as default exports ([#9161](https://github.com/facebook/jest/pull/9161))
- `[jest-diff]` Add options for colors and symbols ([#8841](https://github.com/facebook/jest/pull/8841))
- `[jest-diff]` [**BREAKING**] Export as ECMAScript module ([#8873](https://github.com/facebook/jest/pull/8873))
Expand Down
1 change: 1 addition & 0 deletions TestUtils.ts
Expand Up @@ -106,6 +106,7 @@ const DEFAULT_PROJECT_CONFIG: Config.ProjectConfig = {
setupFilesAfterEnv: [],
skipFilter: false,
skipNodeResolution: false,
slowTestThreshold: 5,
snapshotResolver: null,
snapshotSerializers: [],
testEnvironment: 'node',
Expand Down
6 changes: 6 additions & 0 deletions docs/Configuration.md
Expand Up @@ -779,6 +779,12 @@ Example `jest.setup.js` file
jest.setTimeout(10000); // in milliseconds
```

### `slowTestThreshold` [number]

Default: `5`

A number of seconds after which a test is considered as slow and reported as such in the results.

### `snapshotResolver` [string]

Default: `undefined`
Expand Down
1 change: 1 addition & 0 deletions e2e/__tests__/__snapshots__/showConfig.test.ts.snap
Expand Up @@ -50,6 +50,7 @@ exports[`--showConfig outputs config info and exits 1`] = `
"setupFiles": [],
"setupFilesAfterEnv": [],
"skipFilter": false,
"slowTestThreshold": 5,
"snapshotSerializers": [],
"testEnvironment": "<<REPLACED_JEST_PACKAGES_DIR>>/jest-environment-jsdom/build/index.js",
"testEnvironmentOptions": {},
Expand Down
1 change: 1 addition & 0 deletions packages/jest-config/src/Defaults.ts
Expand Up @@ -52,6 +52,7 @@ const defaultOptions: Config.DefaultOptions = {
setupFiles: [],
setupFilesAfterEnv: [],
skipFilter: false,
slowTestThreshold: 5,
snapshotSerializers: [],
testEnvironment: 'jest-environment-jsdom',
testEnvironmentOptions: {},
Expand Down
2 changes: 2 additions & 0 deletions packages/jest-config/src/Descriptions.ts
Expand Up @@ -66,6 +66,8 @@ const descriptions: {[key in keyof Config.InitialOptions]: string} = {
'The paths to modules that run some code to configure or set up the testing environment before each test',
setupFilesAfterEnv:
'A list of paths to modules that run some code to configure or set up the testing framework before each test',
slowTestThreshold:
'A number of seconds after which a test is considered as slow and reported as such in the results.',
snapshotSerializers:
'A list of paths to snapshot serializer modules Jest should use for snapshot testing',
testEnvironment: 'The test environment that will be used for testing',
Expand Down
1 change: 1 addition & 0 deletions packages/jest-config/src/ValidConfig.ts
Expand Up @@ -99,6 +99,7 @@ const initialOptions: Config.InitialOptions = {
silent: true,
skipFilter: false,
skipNodeResolution: false,
slowTestThreshold: 5,
snapshotResolver: '<rootDir>/snapshotResolver.js',
snapshotSerializers: ['my-serializer-module'],
testEnvironment: 'jest-environment-jsdom',
Expand Down
1 change: 1 addition & 0 deletions packages/jest-config/src/index.ts
Expand Up @@ -199,6 +199,7 @@ const groupOptions = (
setupFilesAfterEnv: options.setupFilesAfterEnv,
skipFilter: options.skipFilter,
skipNodeResolution: options.skipNodeResolution,
slowTestThreshold: options.slowTestThreshold,
snapshotResolver: options.snapshotResolver,
snapshotSerializers: options.snapshotSerializers,
testEnvironment: options.testEnvironment,
Expand Down
1 change: 1 addition & 0 deletions packages/jest-config/src/normalize.ts
Expand Up @@ -870,6 +870,7 @@ export default function normalize(
case 'silent':
case 'skipFilter':
case 'skipNodeResolution':
case 'slowTestThreshold':
case 'testEnvironment':
case 'testEnvironmentOptions':
case 'testFailureExitCode':
Expand Down
Expand Up @@ -45,6 +45,7 @@ exports[`prints the config object 1`] = `
"setupFilesAfterEnv": [],
"skipFilter": false,
"skipNodeResolution": false,
"slowTestThreshold": 5,
"snapshotResolver": null,
"snapshotSerializers": [],
"testEnvironment": "node",
Expand Down
31 changes: 31 additions & 0 deletions packages/jest-reporters/src/__tests__/get_result_header.test.js
Expand Up @@ -11,9 +11,28 @@ const terminalLink = require('terminal-link');

jest.mock('terminal-link', () => jest.fn(() => 'wannabehyperlink'));

const endTime = 1577717671160;
const testTime = 5500;

const testResult = {
testFilePath: '/foo',
};
const testResultSlow = {
perfStats: {
end: endTime,
slow: true,
start: endTime - testTime,
},
testFilePath: '/foo',
};
const testResultFast = {
perfStats: {
end: endTime,
slow: false,
start: endTime - testTime,
},
testFilePath: '/foo',
};

const globalConfig = makeGlobalConfig();

Expand All @@ -36,3 +55,15 @@ test('should render the terminal link', () => {

expect(result).toContain('wannabehyperlink');
});

test('should display test time for slow test', () => {
const result = getResultHeader(testResultSlow, globalConfig);

expect(result).toContain(`${testTime / 1000}s`);
});

test('should not display test time for fast test ', () => {
const result = getResultHeader(testResultFast, globalConfig);

expect(result).not.toContain(`${testTime / 1000}s`);
});
9 changes: 4 additions & 5 deletions packages/jest-reporters/src/get_result_header.ts
Expand Up @@ -41,12 +41,11 @@ export default (
const status =
result.numFailingTests > 0 || result.testExecError ? FAIL : PASS;

const runTime = result.perfStats
? (result.perfStats.end - result.perfStats.start) / 1000
: null;

const testDetail = [];
if (runTime !== null && runTime > 5) {

if (result.perfStats && result.perfStats.slow) {
const runTime = (result.perfStats.end - result.perfStats.start) / 1000;

testDetail.push(LONG_TEST_COLOR(runTime + 's'));
}

Expand Down
7 changes: 6 additions & 1 deletion packages/jest-runner/src/runTest.ts
Expand Up @@ -259,7 +259,12 @@ async function runTestInternal(
result.numPendingTests +
result.numTodoTests;

result.perfStats = {end: Date.now(), start};
const end = Date.now();
result.perfStats = {
end,
slow: (end - start) / 1000 > config.slowTestThreshold,
start,
};
result.testFilePath = path;
result.console = testConsole.getBuffer();
result.skipped = testCount === result.numPendingTests;
Expand Down
Expand Up @@ -19,7 +19,7 @@ describe('formatTestResults', () => {
testResults: [
{
numFailingTests: 0,
perfStats: {end: 2, start: 1},
perfStats: {end: 2, slow: false, start: 1},
// @ts-ignore
testResults: [assertion],
},
Expand Down
2 changes: 2 additions & 0 deletions packages/jest-test-result/src/helpers.ts
Expand Up @@ -58,6 +58,7 @@ export const buildFailureTestResult = (
openHandles: [],
perfStats: {
end: 0,
slow: false,
start: 0,
},
skipped: false,
Expand Down Expand Up @@ -155,6 +156,7 @@ export const createEmptyTestResult = (): TestResult => ({
openHandles: [],
perfStats: {
end: 0,
slow: false,
start: 0,
},
skipped: false,
Expand Down
1 change: 1 addition & 0 deletions packages/jest-test-result/src/types.ts
Expand Up @@ -121,6 +121,7 @@ export type TestResult = {
openHandles: Array<Error>;
perfStats: {
end: Milliseconds;
slow: boolean;
start: Milliseconds;
};
skipped: boolean;
Expand Down
Expand Up @@ -44,6 +44,7 @@ Object {
"setupFilesAfterEnv": Array [],
"skipFilter": false,
"skipNodeResolution": false,
"slowTestThreshold": 5,
"snapshotResolver": null,
"snapshotSerializers": Array [],
"testEnvironment": "node",
Expand Down Expand Up @@ -222,7 +223,7 @@ exports[`ScriptTransformer uses multiple preprocessors 1`] = `
const TRANSFORMED = {
filename: '/fruits/banana.js',
script: 'module.exports = "banana";',
config: '{"automock":false,"browser":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extraGlobals":[],"filter":null,"forceCoverageMatch":[],"globalSetup":null,"globalTeardown":null,"globals":{},"haste":{"providesModuleNodeModules":[]},"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleLoader":"/test_module_loader_path","moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"resolver":null,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"snapshotResolver":null,"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-jasmine2","testURL":"http://localhost","timers":"real","transform":[["^.+\\\\.js$","test_preprocessor"],["^.+\\\\.css$","css-preprocessor"]],"transformIgnorePatterns":["/node_modules/"],"unmockedModulePathPatterns":null,"watchPathIgnorePatterns":[]}',
config: '{"automock":false,"browser":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extraGlobals":[],"filter":null,"forceCoverageMatch":[],"globalSetup":null,"globalTeardown":null,"globals":{},"haste":{"providesModuleNodeModules":[]},"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleLoader":"/test_module_loader_path","moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"resolver":null,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotResolver":null,"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-jasmine2","testURL":"http://localhost","timers":"real","transform":[["^.+\\\\.js$","test_preprocessor"],["^.+\\\\.css$","css-preprocessor"]],"transformIgnorePatterns":["/node_modules/"],"unmockedModulePathPatterns":null,"watchPathIgnorePatterns":[]}',
};
`;

Expand All @@ -239,7 +240,7 @@ exports[`ScriptTransformer uses the supplied preprocessor 1`] = `
const TRANSFORMED = {
filename: '/fruits/banana.js',
script: 'module.exports = "banana";',
config: '{"automock":false,"browser":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extraGlobals":[],"filter":null,"forceCoverageMatch":[],"globalSetup":null,"globalTeardown":null,"globals":{},"haste":{"providesModuleNodeModules":[]},"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleLoader":"/test_module_loader_path","moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"resolver":null,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"snapshotResolver":null,"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-jasmine2","testURL":"http://localhost","timers":"real","transform":[["^.+\\\\.js$","test_preprocessor"]],"transformIgnorePatterns":["/node_modules/"],"unmockedModulePathPatterns":null,"watchPathIgnorePatterns":[]}',
config: '{"automock":false,"browser":false,"cache":true,"cacheDirectory":"/cache/","clearMocks":false,"coveragePathIgnorePatterns":[],"cwd":"/test_root_dir/","detectLeaks":false,"detectOpenHandles":false,"errorOnDeprecated":false,"extraGlobals":[],"filter":null,"forceCoverageMatch":[],"globalSetup":null,"globalTeardown":null,"globals":{},"haste":{"providesModuleNodeModules":[]},"moduleDirectories":[],"moduleFileExtensions":["js"],"moduleLoader":"/test_module_loader_path","moduleNameMapper":[],"modulePathIgnorePatterns":[],"modulePaths":[],"name":"test","prettierPath":"prettier","resetMocks":false,"resetModules":false,"resolver":null,"restoreMocks":false,"rootDir":"/","roots":[],"runner":"jest-runner","setupFiles":[],"setupFilesAfterEnv":[],"skipFilter":false,"skipNodeResolution":false,"slowTestThreshold":5,"snapshotResolver":null,"snapshotSerializers":[],"testEnvironment":"node","testEnvironmentOptions":{},"testLocationInResults":false,"testMatch":[],"testPathIgnorePatterns":[],"testRegex":["\\\\.test\\\\.js$"],"testRunner":"jest-jasmine2","testURL":"http://localhost","timers":"real","transform":[["^.+\\\\.js$","test_preprocessor"]],"transformIgnorePatterns":["/node_modules/"],"unmockedModulePathPatterns":null,"watchPathIgnorePatterns":[]}',
};
`;
Expand Down
3 changes: 3 additions & 0 deletions packages/jest-types/src/Config.ts
Expand Up @@ -65,6 +65,7 @@ export type DefaultOptions = {
setupFiles: Array<Path>;
setupFilesAfterEnv: Array<Path>;
skipFilter: boolean;
slowTestThreshold: number;
snapshotSerializers: Array<Path>;
testEnvironment: string;
testEnvironmentOptions: Record<string, any>;
Expand Down Expand Up @@ -174,6 +175,7 @@ export type InitialOptions = Partial<{
silent: boolean;
skipFilter: boolean;
skipNodeResolution: boolean;
slowTestThreshold: number;
snapshotResolver: Path;
snapshotSerializers: Array<Path>;
errorOnDeprecated: boolean;
Expand Down Expand Up @@ -336,6 +338,7 @@ export type ProjectConfig = {
setupFilesAfterEnv: Array<Path>;
skipFilter: boolean;
skipNodeResolution?: boolean;
slowTestThreshold: number;
snapshotResolver?: Path;
snapshotSerializers: Array<Path>;
testEnvironment: string;
Expand Down

0 comments on commit b0ba242

Please sign in to comment.