protractor-junit-flake
Version:
A wrapper for protractor to automatically re-run failed tests for a specific number of attempts
81 lines (74 loc) • 2.85 kB
JavaScript
import fs from 'fs'
import glob from 'glob'
import path from 'path'
import _ from 'lodash'
import { parseString as parseXml, Builder } from 'xml2js'
// We leave results of last run as they are except copying over the files with new name
export function processLastRunResults (filePattern, testAttempt) {
var cwd = process.cwd()
var files = glob.sync(filePattern, { cwd: cwd })
files.forEach((file) => {
var resolvedPath = path.resolve(cwd, file)
var resultDir = path.dirname(resolvedPath)
var resultFileName = path.basename(resolvedPath)
var processedResultsFile = path.resolve(resultDir, `flake-${resultFileName}`)
var fileExists = fs.existsSync(processedResultsFile)
if (fileExists) {
console.log(`${resolvedPath} already read since ${processedResultsFile} exists\n`)
// For sanity of results, we need to process it instead
resolvedPath = processedResultsFile
} else {
console.log(`Copying ${resolvedPath} to ${processedResultsFile} for last attempt\n`)
fs.copyFileSync(resolvedPath, processedResultsFile)
}
})
}
export function processResults (filePattern, testAttempt) {
var cwd = process.cwd()
var files = glob.sync(filePattern, { cwd: cwd })
return files.reduce((specNames, file) => {
var resolvedPath = path.resolve(cwd, file)
var resultDir = path.dirname(resolvedPath)
var resultFileName = path.basename(resolvedPath)
var processedResultsFile = path.resolve(resultDir, `flake-${resultFileName}`)
var fileExists = fs.existsSync(processedResultsFile)
if (fileExists) {
console.log(`${resolvedPath} already read since ${processedResultsFile} exists\n`)
// For sanity of results, we need to process it instead
resolvedPath = processedResultsFile
} else {
console.log('Parsing file ', resolvedPath, '\n')
}
var fileContents = fs.readFileSync(resolvedPath)
try {
parseXml(fileContents, (err, result) => {
if (err) {
console.log('Found parsing errors: ', err, '\n')
return
}
let suites = _.castArray(result.testsuites.testsuite)
suites.forEach(suite => {
if (!suite.testcase) {
return
}
let cases = _(suite.testcase)
.castArray()
.partition(caze => !!caze.failure)
.value()
suite.testcase = cases[1]
let cazeNames = cases[0].map(caze => caze.$.name)
if (cazeNames) {
specNames.push(...cazeNames)
}
})
let builder = new Builder()
let xml = builder.buildObject(result)
// Do not clobber results file from protractor
fs.writeFileSync(processedResultsFile, xml)
})
} catch (err) {
console.log('Errors parsing xml: ', err, '\n')
}
return specNames
}, [])
}