Merge pull request #25004 from Microsoft/trackFailedTests

Adds failed test tracking
This commit is contained in:
Ron Buckton
2018-06-25 16:55:43 -07:00
committed by GitHub
9 changed files with 308 additions and 23 deletions

View File

@@ -16,6 +16,10 @@ namespace Harness.Parallel.Host {
const { fork } = require("child_process") as typeof import("child_process");
const { statSync } = require("fs") as typeof import("fs");
// NOTE: paths for module and types for FailedTestReporter _do not_ line up due to our use of --outFile for run.js
// tslint:disable-next-line:variable-name
const FailedTestReporter = require(path.resolve(__dirname, "../../scripts/failed-tests")) as typeof import("../../../scripts/failed-tests");
const perfData = readSavedPerfData(configOption);
const newTasks: Task[] = [];
let tasks: Task[] = [];
@@ -54,7 +58,7 @@ namespace Harness.Parallel.Host {
interface Worker {
process: import("child_process").ChildProcess;
accumulatedOutput: string;
currentTasks?: {file: string}[];
currentTasks?: { file: string }[];
timer?: any;
}
@@ -115,7 +119,7 @@ namespace Harness.Parallel.Host {
update(index: number, percentComplete: number, color: string, title: string | undefined, titleColor?: string) {
percentComplete = minMax(percentComplete, 0, 1);
const progressBar = this._progressBars[index] || (this._progressBars[index] = { });
const progressBar = this._progressBars[index] || (this._progressBars[index] = {});
const width = this._options.width;
const n = Math.floor(width * percentComplete);
const i = width - n;
@@ -177,7 +181,7 @@ namespace Harness.Parallel.Host {
return `${perfdataFileNameFragment}${target ? `.${target}` : ""}.json`;
}
function readSavedPerfData(target?: string): {[testHash: string]: number} | undefined {
function readSavedPerfData(target?: string): { [testHash: string]: number } | undefined {
const perfDataContents = IO.readFile(perfdataFileName(target));
if (perfDataContents) {
return JSON.parse(perfDataContents);
@@ -189,7 +193,7 @@ namespace Harness.Parallel.Host {
return `tsrunner-${runner}://${test}`;
}
function startDelayed(perfData: {[testHash: string]: number} | undefined, totalCost: number) {
function startDelayed(perfData: { [testHash: string]: number } | undefined, totalCost: number) {
console.log(`Discovered ${tasks.length} unittest suites` + (newTasks.length ? ` and ${newTasks.length} new suites.` : "."));
console.log("Discovering runner-based tests...");
const discoverStart = +(new Date());
@@ -247,7 +251,7 @@ namespace Harness.Parallel.Host {
const progressUpdateInterval = 1 / progressBars._options.width;
let nextProgress = progressUpdateInterval;
const newPerfData: {[testHash: string]: number} = {};
const newPerfData: { [testHash: string]: number } = {};
const workers: Worker[] = [];
let closedWorkers = 0;
@@ -531,10 +535,26 @@ namespace Harness.Parallel.Host {
patchStats(consoleReporter.stats);
let xunitReporter: import("mocha").reporters.XUnit | undefined;
if (Utils.getExecutionEnvironment() !== Utils.ExecutionEnvironment.Browser && process.env.CI === "true") {
xunitReporter = new Mocha.reporters.XUnit(replayRunner, { reporterOptions: { suiteName: "Tests", output: "./TEST-results.xml" } });
patchStats(xunitReporter.stats);
xunitReporter.write(`<?xml version="1.0" encoding="UTF-8"?>\n`);
let failedTestReporter: import("../../../scripts/failed-tests") | undefined;
if (Utils.getExecutionEnvironment() !== Utils.ExecutionEnvironment.Browser) {
if (process.env.CI === "true") {
xunitReporter = new Mocha.reporters.XUnit(replayRunner, {
reporterOptions: {
suiteName: "Tests",
output: "./TEST-results.xml"
}
});
patchStats(xunitReporter.stats);
xunitReporter.write(`<?xml version="1.0" encoding="UTF-8"?>\n`);
}
else {
failedTestReporter = new FailedTestReporter(replayRunner, {
reporterOptions: {
file: path.resolve(".failed-tests"),
keepFailed
}
});
}
}
const savedUseColors = Base.useColors;
@@ -551,6 +571,9 @@ namespace Harness.Parallel.Host {
if (xunitReporter) {
xunitReporter.done(errorResults.length, failures => process.exit(failures));
}
else if (failedTestReporter) {
failedTestReporter.done(errorResults.length, failures => process.exit(failures));
}
else {
process.exit(errorResults.length);
}

View File

@@ -62,6 +62,7 @@ let workerCount: number;
let runUnitTests: boolean | undefined;
let stackTraceLimit: number | "full" | undefined;
let noColors = false;
let keepFailed = false;
interface TestConfig {
light?: boolean;
@@ -74,6 +75,7 @@ interface TestConfig {
runUnitTests?: boolean;
noColors?: boolean;
timeout?: number;
keepFailed?: boolean;
}
interface TaskSet {
@@ -102,6 +104,9 @@ function handleTestConfig() {
if (testConfig.noColors !== undefined) {
noColors = testConfig.noColors;
}
if (testConfig.keepFailed) {
keepFailed = true;
}
if (testConfig.stackTraceLimit === "full") {
(<any>Error).stackTraceLimit = Infinity;