feat(test-runner): shorten long output paths (#10523)
This commit is contained in:
parent
7a02c52144
commit
c27491cd4d
|
|
@ -20,7 +20,7 @@ import url from 'url';
|
||||||
import type { TestError, Location } from './types';
|
import type { TestError, Location } from './types';
|
||||||
import { default as minimatch } from 'minimatch';
|
import { default as minimatch } from 'minimatch';
|
||||||
import debug from 'debug';
|
import debug from 'debug';
|
||||||
import { isRegExp } from 'playwright-core/lib/utils/utils';
|
import { calculateSha1, isRegExp } from 'playwright-core/lib/utils/utils';
|
||||||
|
|
||||||
export function serializeError(error: Error | any): TestError {
|
export function serializeError(error: Error | any): TestError {
|
||||||
if (error instanceof Error) {
|
if (error instanceof Error) {
|
||||||
|
|
@ -83,7 +83,7 @@ export function createFileMatcher(patterns: string | RegExp | (string | RegExp)[
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export function createTitleMatcher(patterns: RegExp | RegExp[]): Matcher {
|
export function createTitleMatcher(patterns: RegExp | RegExp[]): Matcher {
|
||||||
const reList = Array.isArray(patterns) ? patterns : [patterns];
|
const reList = Array.isArray(patterns) ? patterns : [patterns];
|
||||||
return (value: string) => {
|
return (value: string) => {
|
||||||
for (const re of reList) {
|
for (const re of reList) {
|
||||||
|
|
@ -144,6 +144,16 @@ export function sanitizeForFilePath(s: string) {
|
||||||
return s.replace(/[\x00-\x2C\x2E-\x2F\x3A-\x40\x5B-\x60\x7B-\x7F]+/g, '-');
|
return s.replace(/[\x00-\x2C\x2E-\x2F\x3A-\x40\x5B-\x60\x7B-\x7F]+/g, '-');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function trimLongString(s: string, length = 100) {
|
||||||
|
if (s.length <= length)
|
||||||
|
return s;
|
||||||
|
const hash = calculateSha1(s);
|
||||||
|
const middle = `-${hash.substring(0, 5)}-`;
|
||||||
|
const start = Math.floor((length - middle.length) / 2);
|
||||||
|
const end = length - middle.length - start;
|
||||||
|
return s.substring(0, start) + middle + s.slice(-end);
|
||||||
|
}
|
||||||
|
|
||||||
export function addSuffixToFilePath(filePath: string, suffix: string, customExtension?: string, sanitize = false): string {
|
export function addSuffixToFilePath(filePath: string, suffix: string, customExtension?: string, sanitize = false): string {
|
||||||
const dirname = path.dirname(filePath);
|
const dirname = path.dirname(filePath);
|
||||||
const ext = path.extname(filePath);
|
const ext = path.extname(filePath);
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ import * as mime from 'mime';
|
||||||
import util from 'util';
|
import util from 'util';
|
||||||
import colors from 'colors/safe';
|
import colors from 'colors/safe';
|
||||||
import { EventEmitter } from 'events';
|
import { EventEmitter } from 'events';
|
||||||
import { monotonicTime, serializeError, sanitizeForFilePath, getContainedPath, addSuffixToFilePath, prependToTestError } from './util';
|
import { monotonicTime, serializeError, sanitizeForFilePath, getContainedPath, addSuffixToFilePath, prependToTestError, trimLongString } from './util';
|
||||||
import { TestBeginPayload, TestEndPayload, RunPayload, TestEntry, DonePayload, WorkerInitParams, StepBeginPayload, StepEndPayload } from './ipc';
|
import { TestBeginPayload, TestEndPayload, RunPayload, TestEntry, DonePayload, WorkerInitParams, StepBeginPayload, StepEndPayload } from './ipc';
|
||||||
import { setCurrentTestInfo } from './globals';
|
import { setCurrentTestInfo } from './globals';
|
||||||
import { Loader } from './loader';
|
import { Loader } from './loader';
|
||||||
|
|
@ -232,7 +232,8 @@ export class WorkerRunner extends EventEmitter {
|
||||||
const relativeTestFilePath = path.relative(this._project.config.testDir, test._requireFile.replace(/\.(spec|test)\.(js|ts|mjs)$/, ''));
|
const relativeTestFilePath = path.relative(this._project.config.testDir, test._requireFile.replace(/\.(spec|test)\.(js|ts|mjs)$/, ''));
|
||||||
const sanitizedRelativePath = relativeTestFilePath.replace(process.platform === 'win32' ? new RegExp('\\\\', 'g') : new RegExp('/', 'g'), '-');
|
const sanitizedRelativePath = relativeTestFilePath.replace(process.platform === 'win32' ? new RegExp('\\\\', 'g') : new RegExp('/', 'g'), '-');
|
||||||
const fullTitleWithoutSpec = test.titlePath().slice(1).join(' ') + (test._type === 'test' ? '' : '-worker' + this._params.workerIndex);
|
const fullTitleWithoutSpec = test.titlePath().slice(1).join(' ') + (test._type === 'test' ? '' : '-worker' + this._params.workerIndex);
|
||||||
let testOutputDir = sanitizedRelativePath + '-' + sanitizeForFilePath(fullTitleWithoutSpec);
|
|
||||||
|
let testOutputDir = sanitizedRelativePath + '-' + sanitizeForFilePath(trimLongString(fullTitleWithoutSpec));
|
||||||
if (this._uniqueProjectNamePathSegment)
|
if (this._uniqueProjectNamePathSegment)
|
||||||
testOutputDir += '-' + this._uniqueProjectNamePathSegment;
|
testOutputDir += '-' + this._uniqueProjectNamePathSegment;
|
||||||
if (retry)
|
if (retry)
|
||||||
|
|
|
||||||
|
|
@ -429,6 +429,21 @@ test('should allow nonAscii characters in the output dir', async ({ runInlineTes
|
||||||
expect(outputDir).toBe(path.join(testInfo.outputDir, 'test-results', 'my-test-こんにちは世界'));
|
expect(outputDir).toBe(path.join(testInfo.outputDir, 'test-results', 'my-test-こんにちは世界'));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('should allow shorten long output dirs characters in the output dir', async ({ runInlineTest }, testInfo) => {
|
||||||
|
const result = await runInlineTest({
|
||||||
|
'my-test.spec.js': `
|
||||||
|
const { test } = pwt;
|
||||||
|
test.describe('this is a really long description that would be too long for a file path', () => {
|
||||||
|
test('and this is an even longer test name that just keeps going and going and we should shorten it', async ({}, testInfo) => {
|
||||||
|
console.log('\\n%%' + testInfo.outputDir);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
`,
|
||||||
|
});
|
||||||
|
const outputDir = result.output.split('\n').filter(x => x.startsWith('%%'))[0].slice('%%'.length);
|
||||||
|
expect(outputDir).toBe(path.join(testInfo.outputDir, 'test-results', 'my-test-this-is-a-really-long-description-that-would-b-6d724--keeps-going-and-going-and-we-should-shorten-it'));
|
||||||
|
});
|
||||||
|
|
||||||
test('should not mangle double dashes', async ({ runInlineTest }, testInfo) => {
|
test('should not mangle double dashes', async ({ runInlineTest }, testInfo) => {
|
||||||
const result = await runInlineTest({
|
const result = await runInlineTest({
|
||||||
'my--file.spec.js': `
|
'my--file.spec.js': `
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue