首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在并行执行量角器测试脚本的同时生成合并报表?

如何在并行执行量角器测试脚本的同时生成合并报表?
EN

Stack Overflow用户
提问于 2019-06-20 20:24:35
回答 3查看 1.3K关注 0票数 1

我的量角器套间里有15个规格。我希望并行运行这些脚本,并希望在执行过程中生成合并报告。

我可以通过在配置文件中添加'shardTestFiles: true‘标签来并行运行这些脚本,但是,我无法获得合并报告(只能在报告中获得上次执行的规范的结果)。

我正在寻找解决方案,以生成合并报告,同时并行执行量角器脚本。

注:使用jasmine report生成报表。

EN

回答 3

Stack Overflow用户

发布于 2019-06-21 14:02:30

您可以使用this reporter并提供用于合并测试结果的选项。例如:

代码语言:javascript
复制
 var Jasmine2HtmlReporter = require('protractor-jasmine2-html-reporter');

    jasmine.getEnv().addReporter(
        new Jasmine2HtmlReporter({
            savePath: 'testReports/',
            screenshotsFolder: 'images',
            takeScreenshotsOnlyOnFailures: true,
            consolidateAll: true,
            consolidate: true,
            cleanDestination: false
        }));
票数 0
EN

Stack Overflow用户

发布于 2019-06-28 22:23:13

我遵循了下面提到的方法来满足我的需求。

  1. 我把下面的代码保存在配置文件的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:‘Jasmine2HtmlReporter’,takeScreenshotsOnlyOnFailures: true,consolidate: true,consolidateAll: true,cleanDestination: false,fileName:"my-report.html",fileName:“回归-测试-报表.html”,fileNamePrefix: reportName,}) );履行();}) });});},

并在afterLaunch部分中保持以下代码,该代码将合并onPrepare部分中生成的所有报告:

输出:afterLaunch afterLaunch() { var fs = fs.writeFileSync('e2e/Results/RegressionTestReport.html',(‘fs’);var afterLaunch= '';fs.readdirSync('e2e/Results/').forEach(function(file){ if(!(fs.lstatSync('e2e/Results/‘+afterLaunch).isDirectory() output = output + fs.readFileSync('e2e/Results/’+ file);});var output,'utf8');}

以上配置后面临的挑战:通过在配置文件中写入上述配置,我能够通过并行执行来合并报告。但是,如果我第二次运行该脚本,报告也会合并(这是我不想做的)。标记'cleanDestination: true‘会在每个规范执行结束后将其删除。所以,它没有起作用。

我是如何解决这个挑战的?:我是使用shell脚本在jenkins中运行脚本的。因此,我编写了外壳命令'rm -fr e2e/Results‘来在脚本执行之前删除报告文件夹。因此,每次都会删除该报表,并在最近一次执行时生成一个新的合并报表。

票数 0
EN

Stack Overflow用户

发布于 2020-11-25 08:53:48

我尝试了protractor-jasmine2-html-reporter与链接答案中的建议相结合,但不喜欢输出。我喜欢protractor-html-reporter-2生成的输出,它处理由jasmine-reporters生成的xml文件。但它没有任何选项来处理由多个浏览器实例生成的报告。在找不到理想的解决方案后,我最终在protractor config js文件中执行了以下操作:

代码语言:javascript
复制
// 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插件显示的报告上。

另请参阅:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56685945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档