From fbf5e58d10a5f90c61571a8023feb5a9e223e15b Mon Sep 17 00:00:00 2001 From: Alexander Sklar Date: Fri, 8 May 2020 22:16:02 -0700 Subject: [PATCH 1/3] Improve run_wdio to print out failed tests --- packages/E2ETest/run_wdio.js | 69 ++++++++++++++++++++++++++---------- 1 file changed, 50 insertions(+), 19 deletions(-) diff --git a/packages/E2ETest/run_wdio.js b/packages/E2ETest/run_wdio.js index 56a33f269f5..63dc0c4ae87 100644 --- a/packages/E2ETest/run_wdio.js +++ b/packages/E2ETest/run_wdio.js @@ -4,6 +4,7 @@ const xml2js = require('xml2js'); const parser = new xml2js.Parser({ attrkey: 'ATTR' }); const child_process = require('child_process'); const prompt = require('prompt-sync')(); +const chalk = require('chalk'); const specFolder = 'wdio/test'; @@ -53,7 +54,7 @@ function SelectSpecs(folder) { let opts = SelectSpecs(specFolder); console.log(`Selected tests: ${opts}`); -function OverrideHyperV() { +function EnsureRunningInHyperV() { const baseboardMfr = child_process .execSync('powershell.exe (gwmi Win32_BaseBoard).Manufacturer') .toString() @@ -69,26 +70,38 @@ function OverrideHyperV() { } } -OverrideHyperV(); - const Launcher = require('@wdio/cli').default; const wdio = new Launcher('wdio.conf.js', { specs: opts }); function parseLog(logfile) { const xmlString = fs.readFileSync(logfile); - let name; + let failures = {}; parser.parseString(xmlString, (err, res) => { if (!res.testsuites) { - name = 'something went wrong'; + failures = 'something went wrong'; } else { - const attr = res.testsuites.testsuite[0].ATTR; - if (attr.errors > 0 || attr.failures > 0) { - name = attr.name; + for (let i = 0; i < res.testsuites.testsuite.length; i++) { + const attr = res.testsuites.testsuite[i].ATTR; + if (attr.errors > 0 || attr.failures > 0) { + let name = attr.name; + failures[name] = {}; + const testcases = res.testsuites.testsuite[i].testcase; + for (let j = 0; j < testcases.length; j++) { + if (testcases[j].error && testcases[j].error[0].ATTR) { + failures[name].testcase = testcases[j].ATTR.name; + failures[name].error = testcases[j].error[0].ATTR.message; + const systemErr = testcases[j]['system-err'][0]; + const stack = systemErr.substr(systemErr.indexOf('\n at ') + 1); + failures[name].stack = stack; + } + } + } + } } }); - return name; + return failures; } function parseLogs() { @@ -100,20 +113,38 @@ function parseLogs() { return names; } +function PrintFailedTests(ft) { + for (let i = 0; i < Object.keys(ft).length; i++) { + const key = Object.keys(ft)[i]; + console.log(chalk.redBright(key)); + console.log(' ', chalk.underline('testcase'), chalk.bold(ft[key].testcase)); + console.log(' ', chalk.underline('error'), chalk.bold(ft[key].error)); + console.log(' ', chalk.underline('stack')); + console.log(ft[key].stack); + } +} + function Process(code) { const failedTests = parseLogs(); for (let i = 0; i < failedTests.length; i++) { - console.log(`Failed test: ${failedTests[i]}`); + console.log('Failed tests: '); + PrintFailedTests(failedTests[i]); } process.exit(code); } -wdio.run().then( - code => { - Process(code); - }, - error => { - console.error('Launcher failed to start the test', error.stacktrace); - process.exit(1); - } -); +function RunWdio() { + EnsureRunningInHyperV(); + + wdio.run().then( + code => { + Process(code); + }, + error => { + console.error('Launcher failed to start the test', error.stacktrace); + process.exit(1); + } + ); +} + +RunWdio(); From 0bffb2d6d0ff0acc54f573f5621db455ac5ad2b7 Mon Sep 17 00:00:00 2001 From: Alexander Sklar Date: Fri, 8 May 2020 23:15:07 -0700 Subject: [PATCH 2/3] lint --- packages/E2ETest/run_wdio.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/E2ETest/run_wdio.js b/packages/E2ETest/run_wdio.js index 63dc0c4ae87..7ea5422a875 100644 --- a/packages/E2ETest/run_wdio.js +++ b/packages/E2ETest/run_wdio.js @@ -92,12 +92,13 @@ function parseLog(logfile) { failures[name].testcase = testcases[j].ATTR.name; failures[name].error = testcases[j].error[0].ATTR.message; const systemErr = testcases[j]['system-err'][0]; - const stack = systemErr.substr(systemErr.indexOf('\n at ') + 1); + const stack = systemErr.substr( + systemErr.indexOf('\n at ') + 1 + ); failures[name].stack = stack; } } } - } } }); @@ -117,7 +118,11 @@ function PrintFailedTests(ft) { for (let i = 0; i < Object.keys(ft).length; i++) { const key = Object.keys(ft)[i]; console.log(chalk.redBright(key)); - console.log(' ', chalk.underline('testcase'), chalk.bold(ft[key].testcase)); + console.log( + ' ', + chalk.underline('testcase'), + chalk.bold(ft[key].testcase) + ); console.log(' ', chalk.underline('error'), chalk.bold(ft[key].error)); console.log(' ', chalk.underline('stack')); console.log(ft[key].stack); From 4359b8c71940ac3f75c9eb641cf6595a65011d60 Mon Sep 17 00:00:00 2001 From: Alexander Sklar Date: Sun, 10 May 2020 10:46:14 -0700 Subject: [PATCH 3/3] PR feedback --- packages/E2ETest/run_wdio.js | 59 ++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/packages/E2ETest/run_wdio.js b/packages/E2ETest/run_wdio.js index 7ea5422a875..aec747f94f2 100644 --- a/packages/E2ETest/run_wdio.js +++ b/packages/E2ETest/run_wdio.js @@ -8,7 +8,7 @@ const chalk = require('chalk'); const specFolder = 'wdio/test'; -function GetMetadata(specPath) { +function getMetadata(specPath) { const contents = fs.readFileSync(specPath); const metadataTag = '// @metadata '; const metadataStart = contents.indexOf(metadataTag); @@ -30,31 +30,31 @@ const filters = { // Returns true if the spec is to run. // Specs marked SkipCI are excluded from CI (identified by environment variables in the ADO lab) -function FilterSpec(specPath) { - const metadata = GetMetadata(specPath); - for (let i = 0; i < metadata.length; i++) { - if (filters[metadata[i]](specPath)) { +function filterSpec(specPath) { + const metadata = getMetadata(specPath); + for (const metadataElement of metadata) { + if (filters[metadataElement](specPath)) { return false; } } return true; } -function SelectSpecs(folder) { +function selectSpecs(folder) { let specs = []; if (process.argv.length > 2) { specs = process.argv.splice(2).map(spec => spec + '.spec.ts'); } else { specs = fs.readdirSync(folder).filter(x => x.endsWith('.spec.ts')); } - specs = specs.map(spec => path.join(folder, spec)).filter(FilterSpec); + specs = specs.map(spec => path.join(folder, spec)).filter(filterSpec); return specs; } -let opts = SelectSpecs(specFolder); +let opts = selectSpecs(specFolder); console.log(`Selected tests: ${opts}`); -function EnsureRunningInHyperV() { +function ensureRunningInHyperV() { const baseboardMfr = child_process .execSync('powershell.exe (gwmi Win32_BaseBoard).Manufacturer') .toString() @@ -79,19 +79,20 @@ function parseLog(logfile) { let failures = {}; parser.parseString(xmlString, (err, res) => { if (!res.testsuites) { - failures = 'something went wrong'; + console.error(`Something went wrong processing file ${logfile}`); } else { - for (let i = 0; i < res.testsuites.testsuite.length; i++) { - const attr = res.testsuites.testsuite[i].ATTR; + for (const testsuite of res.testsuites.testsuite) { + const attr = testsuite.ATTR; + if (attr.errors > 0 || attr.failures > 0) { - let name = attr.name; + const name = attr.name; failures[name] = {}; - const testcases = res.testsuites.testsuite[i].testcase; - for (let j = 0; j < testcases.length; j++) { - if (testcases[j].error && testcases[j].error[0].ATTR) { - failures[name].testcase = testcases[j].ATTR.name; - failures[name].error = testcases[j].error[0].ATTR.message; - const systemErr = testcases[j]['system-err'][0]; + + for (const testcase of testsuite.testcases) { + if (testcase.error && testcase.error[0].ATTR) { + failures[name].testcase = testcase.ATTR.name; + failures[name].error = testcase.error[0].ATTR.message; + const systemErr = testcase['system-err'][0]; const stack = systemErr.substr( systemErr.indexOf('\n at ') + 1 ); @@ -102,6 +103,7 @@ function parseLog(logfile) { } } }); + return failures; } @@ -114,9 +116,8 @@ function parseLogs() { return names; } -function PrintFailedTests(ft) { - for (let i = 0; i < Object.keys(ft).length; i++) { - const key = Object.keys(ft)[i]; +function printFailedTests(ft) { + for (const key in ft) { console.log(chalk.redBright(key)); console.log( ' ', @@ -129,21 +130,21 @@ function PrintFailedTests(ft) { } } -function Process(code) { +function doProcess(code) { const failedTests = parseLogs(); - for (let i = 0; i < failedTests.length; i++) { + for (const failedTest of failedTests) { console.log('Failed tests: '); - PrintFailedTests(failedTests[i]); + printFailedTests(failedTest); } process.exit(code); } -function RunWdio() { - EnsureRunningInHyperV(); +function runWdio() { + ensureRunningInHyperV(); wdio.run().then( code => { - Process(code); + doProcess(code); }, error => { console.error('Launcher failed to start the test', error.stacktrace); @@ -152,4 +153,4 @@ function RunWdio() { ); } -RunWdio(); +runWdio();