【发布时间】:2019-11-03 06:32:07
【问题描述】:
我的量角器套件中有 15 个规格。我想并行运行这些脚本,并希望在执行过程中生成综合报告。
通过在配置文件中添加标签“shardTestFiles:true”,我能够并行运行脚本。但是,我无法获得综合报告(仅在报告中获得最后执行的规范的结果)。
我正在寻找在并行执行量角器脚本时生成合并报告的解决方案。
注意:使用 jasmine 报告器生成报告。
【问题讨论】:
标签: jasmine protractor
我的量角器套件中有 15 个规格。我想并行运行这些脚本,并希望在执行过程中生成综合报告。
通过在配置文件中添加标签“shardTestFiles:true”,我能够并行运行脚本。但是,我无法获得综合报告(仅在报告中获得最后执行的规范的结果)。
我正在寻找在并行执行量角器脚本时生成合并报告的解决方案。
注意:使用 jasmine 报告器生成报告。
【问题讨论】:
标签: jasmine protractor
您可以使用thisreporter 并提供合并测试结果的选项。例如:
var Jasmine2HtmlReporter = require('protractor-jasmine2-html-reporter');
jasmine.getEnv().addReporter(
new Jasmine2HtmlReporter({
savePath: 'testReports/',
screenshotsFolder: 'images',
takeScreenshotsOnlyOnFailures: true,
consolidateAll: true,
consolidate: true,
cleanDestination: false
}));
【讨论】:
我按照下面提到的方法来满足我的需求。
我在配置文件的 onPrepare 部分保留了以下代码。这将为每个规范生成一份报告。
onPrepare() {
return new Promise(function (fulfill, reject) {
browser.getCapabilities().then(function (value) {
reportName = value.get('webdriver.remote.sessionid') + '_' + value.get('browserName') + '_' + Math.floor(Math.random()*1E16); // eslint-disable-line
jasmine.getEnv().addReporter(
new Jasmine2HtmlReporter({
savePath: 'e2e/Results',
screenshotsFolder: 'images',
takeScreenshotsOnlyOnFailures: true,
consolidate: true,
consolidateAll: true,
cleanDestination: false,
fileName: "my-report.html",
fileName: "regression-test-report.html",
fileNamePrefix: reportName,
})
);
fulfill();
})
});
});
},
并在 afterLaunch 部分保留以下代码,它将合并在 onPrepare 部分中生成的所有报告:
afterLaunch: function afterLaunch() {
var fs = require('fs');
var output = '';
fs.readdirSync('e2e/Results/').forEach(function(file){
if(!(fs.lstatSync('e2e/Results/' + file).isDirectory()))
output = output + fs.readFileSync('e2e/Results/' + file);
});
fs.writeFileSync('e2e/Results/RegressionTestReport.html', output, 'utf8');
}
上述配置后面临的挑战:我可以通过在配置文件中写入上述配置,通过并行执行来合并报表。但是,如果我第二次运行脚本,报告也会合并它(我不想这样做)。一旦执行结束,使标签“cleanDestination:true”删除每个规范。所以,它没有工作。
我是如何解决这个挑战的?:我在 jenkins 中使用 shell 脚本运行脚本。因此,我在执行脚本之前编写了 shell 命令“rm -fr e2e/Results”来删除报告文件夹。因此,每次都将删除该报告,并生成最新执行的新合并报告。
【讨论】:
我尝试了protractor-jasmine2-html-reporter 结合链接答案中的建议,但不喜欢输出。我喜欢protractor-html-reporter-2 生成的输出,它适用于jasmine-reporters 生成的xml 文件。但这没有任何选项可以处理由多个浏览器实例生成的报告。在未能找到理想的解决方案后,我最终在量角器配置 js 文件中进行了以下操作:
// add relevant packages in package.json
'use strict';
const HTMLReport = require('protractor-html-reporter-2');
const jasmineReporters = require('jasmine-reporters');
const moment = require('moment');
const os = require('os');
const xmldoc = require('xmldoc');
...
const DATE_FORMAT = 'YYYYMMDD-HHmmss-SSS'; // use any other format that gives unique timestamp
const reportDir = path.join(__dirname, '../report');
...
exports.config = {
...
framework: 'jasmine',
capabilities: {
browserName: 'chrome',
maxInstances: 2,
shardTestFiles: true,
},
beforeLaunch: async function () {
// clean up report directory
fs.emptyDirSync(reportDir);
},
onPrepare: async function () {
const NOW = moment().format(DATE_FORMAT);
const reportName = 'index-' + NOW;
jasmine.getEnv().addReporter(new jasmineReporters.JUnitXmlReporter({
consolidateAll: true,
savePath: reportDir,
filePrefix: reportName,
}));
},
onComplete: async function () {
// do something after each instance of browser is closed
},
afterLaunch: async function (exitCode) {
// do something after ALL instances of browser are closed
await consolidateJasmineXmlReports();
},
...
},
...
async function consolidateJasmineXmlReports() {
// there may be better ways to write xml out but this works for me
const files = fs.readdirSync(reportDir).filter(fn => fn.endsWith('.xml'));
let disabledSum = 0;
let errorsSum = 0;
let failuresSum = 0;
let testsSum = 0;
let timeSum = 0;
const allTestSuiteNodes = [];
for (const file of files) {
const pathToXml = reportDir + path.sep + file;
console.log('Reading xml report file: ' + pathToXml);
const xml = fs.readFileSync(pathToXml);
const xmlDoc = new xmldoc.XmlDocument(xml);
const disabled = parseInt(xmlDoc.attr.disabled);
const errors = parseInt(xmlDoc.attr.errors);
const failures = parseInt(xmlDoc.attr.failures);
const tests = parseInt(xmlDoc.attr.tests);
const time = parseFloat(xmlDoc.attr.time);
disabledSum += disabled;
errorsSum += errors;
failuresSum += failures;
testsSum += tests;
timeSum += time;
const testSuiteNodes = xmlDoc.childrenNamed('testsuite');
allTestSuiteNodes.push(testSuiteNodes);
}
let startXml = `<?xml version="1.0" encoding="UTF-8" ?>`;
startXml += `<testsuites disabled="` + disabledSum + `" errors="` + errorsSum + `" failures="` + failuresSum + `" tests="` + testsSum + `" time="` + timeSum + `">`;
const endXml = '</testsuites>';
allTestSuiteNodes.push(endXml);
const finalXml = startXml + allTestSuiteNodes.join('\n');
fs.writeFileSync(reportDir + path.sep + 'consolidated.xml', finalXml, 'utf8');
const testConfig = {
outputPath: reportDir,
outputFilename: 'consolidated',
...
};
new HTMLReport().from(reportDir + path.sep + 'consolidated.xml', testConfig);
}
我们使用 Jenkins 运行测试,上面创建的报告在 Jenkins 中显示良好,并且在 Open Blue Ocean Jenkins 插件显示的报告上也准确显示。
另见:
【讨论】: