Skip to content

Commit 3ef953a

Browse files
committed
Allow passing skipPercent
Currently, the default is 5%. 0 gives you 0% time savings 2.5 gives you 29% 5 gives you 38% 10 gives you 50% 20 gives you 65%
1 parent a852f2f commit 3ef953a

File tree

4 files changed

+18
-11
lines changed

4 files changed

+18
-11
lines changed

Gulpfile.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,7 @@ task("runtests-parallel").flags = {
429429
" --workers=<number>": "The number of parallel workers to use.",
430430
" --timeout=<ms>": "Overrides the default test timeout.",
431431
" --built": "Compile using the built version of the compiler.",
432+
" --skipPercent=<number>": "Skip expensive tests with <percent> chance to miss an edit.",
432433
};
433434

434435
task("diff", () => exec(getDiffTool(), [refBaseline, localBaseline], { ignoreExitCode: true }));

scripts/build/tests.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ async function runConsoleTests(runJs, defaultReporter, runInParallel, watchMode,
3131
const inspect = cmdLineOptions.inspect;
3232
const runners = cmdLineOptions.runners;
3333
const light = cmdLineOptions.light;
34+
const skipPercent = cmdLineOptions.skipPercent;
3435
const stackTraceLimit = cmdLineOptions.stackTraceLimit;
3536
const testConfigFile = "test.config";
3637
const failed = cmdLineOptions.failed;
@@ -62,8 +63,8 @@ async function runConsoleTests(runJs, defaultReporter, runInParallel, watchMode,
6263
testTimeout = 400000;
6364
}
6465

65-
if (tests || runners || light || testTimeout || taskConfigsFolder || keepFailed) {
66-
writeTestConfigFile(tests, runners, light, taskConfigsFolder, workerCount, stackTraceLimit, testTimeout, keepFailed);
66+
if (tests || runners || light || testTimeout || taskConfigsFolder || keepFailed || skipPercent) {
67+
writeTestConfigFile(tests, runners, light, skipPercent, taskConfigsFolder, workerCount, stackTraceLimit, testTimeout, keepFailed);
6768
}
6869

6970
const colors = cmdLineOptions.colors;
@@ -158,17 +159,19 @@ exports.cleanTestDirs = cleanTestDirs;
158159
* @param {string} tests
159160
* @param {string} runners
160161
* @param {boolean} light
162+
* @param {string} skipPercent
161163
* @param {string} [taskConfigsFolder]
162164
* @param {string | number} [workerCount]
163165
* @param {string} [stackTraceLimit]
164166
* @param {string | number} [timeout]
165167
* @param {boolean} [keepFailed]
166168
*/
167-
function writeTestConfigFile(tests, runners, light, taskConfigsFolder, workerCount, stackTraceLimit, timeout, keepFailed) {
169+
function writeTestConfigFile(tests, runners, light, skipPercent, taskConfigsFolder, workerCount, stackTraceLimit, timeout, keepFailed) {
168170
const testConfigContents = JSON.stringify({
169171
test: tests ? [tests] : undefined,
170172
runners: runners ? runners.split(",") : undefined,
171173
light,
174+
skipPercent,
172175
workerCount,
173176
stackTraceLimit,
174177
taskConfigsFolder,

src/testRunner/parallel/host.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,6 @@ namespace Harness.Parallel.Host {
1616
const { fork } = require("child_process") as typeof import("child_process");
1717
const { statSync, readFileSync } = require("fs") as typeof import("fs");
1818

19-
const editSkipRate = 0.05
20-
2119
// NOTE: paths for module and types for FailedTestReporter _do not_ line up due to our use of --outFile for run.js
2220
// tslint:disable-next-line:variable-name
2321
const FailedTestReporter = require(path.resolve(__dirname, "../../scripts/failed-tests")) as typeof import("../../../scripts/failed-tests");
@@ -194,7 +192,7 @@ namespace Harness.Parallel.Host {
194192
return `tsrunner-${runner}://${test}`;
195193
}
196194

197-
function skipCostlyTests(tasks: Task[], editSkipRate: number) {
195+
function skipCostlyTests(tasks: Task[]) {
198196
if (statSync('.test-cost.json')) {
199197
const costs = JSON.parse(readFileSync('.test-cost.json', 'utf8')) as {
200198
totalTime: number,
@@ -205,12 +203,12 @@ namespace Harness.Parallel.Host {
205203
let skippedTests = new Set<string>();
206204
let skippedTime = 0;
207205
let i = 0;
208-
for (; i < costs.data.length && (skippedEdits / costs.totalEdits) < editSkipRate; i++) {
206+
for (; i < costs.data.length && (skippedEdits / costs.totalEdits) < (skipPercent / 100); i++) {
209207
skippedEdits += costs.data[i].edits;
210208
skippedTime += costs.data[i].time;
211209
skippedTests.add(costs.data[i].name);
212210
}
213-
console.log(`Skipped ${i} expensive tests; estimated time savings of ${(skippedTime / costs.totalTime * 100).toFixed(2)}% with ${(editSkipRate * 100).toFixed(2)}% chance of missing a test.`)
211+
console.log(`Skipped ${i} expensive tests; estimated time savings of ${(skippedTime / costs.totalTime * 100).toFixed(2)}% with ${skipPercent.toFixed(2)}% chance of missing a test.`)
214212
return tasks.filter(t => !skippedTests.has(t.file));
215213
}
216214
else {
@@ -219,7 +217,7 @@ namespace Harness.Parallel.Host {
219217
}
220218
}
221219

222-
function startDelayed(perfData: { [testHash: string]: number } | undefined, totalCost: number, editSkipRate: number) {
220+
function startDelayed(perfData: { [testHash: string]: number } | undefined, totalCost: number) {
223221
console.log(`Discovered ${tasks.length} unittest suites` + (newTasks.length ? ` and ${newTasks.length} new suites.` : "."));
224222
console.log("Discovering runner-based tests...");
225223
const discoverStart = +(new Date());
@@ -258,7 +256,7 @@ namespace Harness.Parallel.Host {
258256
}
259257
tasks.sort((a, b) => a.size - b.size);
260258
tasks = tasks.concat(newTasks);
261-
tasks = skipCostlyTests(tasks, editSkipRate);
259+
tasks = skipCostlyTests(tasks);
262260
const batchCount = workerCount;
263261
const packfraction = 0.9;
264262
const chunkSize = 1000; // ~1KB or 1s for sending batches near the end of a test
@@ -653,6 +651,6 @@ namespace Harness.Parallel.Host {
653651
}
654652

655653
// tslint:disable-next-line:ban
656-
setTimeout(() => startDelayed(perfData, totalCost, editSkipRate), 0); // Do real startup on next tick, so all unit tests have been collected
654+
setTimeout(() => startDelayed(perfData, totalCost), 0); // Do real startup on next tick, so all unit tests have been collected
657655
}
658656
}

src/testRunner/runner.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ let runUnitTests: boolean | undefined;
6363
let stackTraceLimit: number | "full" | undefined;
6464
let noColors = false;
6565
let keepFailed = false;
66+
let skipPercent = 5;
6667

6768
interface TestConfig {
6869
light?: boolean;
@@ -76,6 +77,7 @@ interface TestConfig {
7677
noColors?: boolean;
7778
timeout?: number;
7879
keepFailed?: boolean;
80+
skipPercent?: number;
7981
}
8082

8183
interface TaskSet {
@@ -107,6 +109,9 @@ function handleTestConfig() {
107109
if (testConfig.keepFailed) {
108110
keepFailed = true;
109111
}
112+
if (testConfig.skipPercent !== undefined) {
113+
skipPercent = testConfig.skipPercent;
114+
}
110115

111116
if (testConfig.stackTraceLimit === "full") {
112117
(<any>Error).stackTraceLimit = Infinity;

0 commit comments

Comments
 (0)