jenkins - 当使用 'shardTestFiles' : true in conf file 共享测试时,protractor-jasmine2-html-reporter 不会合并所有测试的结果

标签 jenkins jasmine protractor gulp-protractor jasmine-reporters

最近,我们在 Jenkins 上配置了 e2e 测试,很快我们意识到我们必须使用共享测试文件:真正的选项,因为完整的套件运行需要很长时间,我们每天要花 9-10 个小时。但是当我们在conf文件中配置以下两个选项时。测试运行良好,但最终报告仅显示保存路径中的最后一个规范运行结果。合并所有选项并不提供完整的报告。

请查找我们的conf文件详细信息。任何帮助将不胜感激。

按照 Aditya 提供的解决方案编辑 conf 文件。请帮忙

   var Jasmine2HtmlReporter = require('protractor-jasmine2-html-reporter');
var log4js = require('log4js');
var params = process.argv;
var args = process.argv.slice(3);

exports.config = {
  //seleniumServerJar: './node_modules/gulp-protractor/node_modules/protractor/selenium/selenium-server-standalone-2.48.2.jar',
  seleniumAddress: 'http://localhost:4444/wd/hub',
  allScriptsTimeout: 100000,
  framework: 'jasmine2',

  onPrepare: function () {

    return new Promise(function(fulfill, reject) {
      browser.getCapabilities().then(function(value) {
        reportName = value.get(Math.random(8,2)) + '_' + value.get('browserName') + '_' + Math.floor(Math.random() * 1E16);
        jasmine.getEnv().addReporter(
          new Jasmine2HtmlReporter({
            //cleanDestination: false,
            savePath: __dirname+'/target',
            //docTitle: 'Web UI Test Report',
            screenshotsFolder: 'image',
            //takeScreenshots: true,
            takeScreenshotsOnlyOnFailures: true,
            consolidate: true,
            consolidateAll: true,
             preserveDirectory: true,
            //fixedScreenshotName: true,
            filePrefix: reportName + ".html"
          })
        );
        fulfill();
      });
    });

    // browser.manage().timeouts().implicitlyWait(11000);
    var width = 768;
    var height = 1366;
    browser.driver.manage().window().setSize(768, 1366);
    browser.ignoreSynchronization = false; 
  },

  afterLaunch: function afterLaunch() {
    var fs = require('fs');
    var output = '';
    fs.readdirSync('target/').forEach(function (file) {
      if (!(fs.lstatSync('target/' + file).isDirectory()))
        output = output + fs.readFileSync('target/' + file);
    });
    fs.writeFileSync('target/ConsolidatedReport.html', output, 'utf8');

  },

  suites:{

    example:['./test/e2e/specs/**/*Spec.js',]
  },


  /*  capabilities: {
      'browserName': 'chrome'
    },*/

  multiCapabilities: [
    {
      'browserName': 'chrome'
    },
    {
      'browserName': 'firefox'
    }
  ],


  resultJsonOutputFile:'./results.json',

  // Options to be passed to Jasmine-node.
  jasmineNodeOpts: {
    showColors: true,
    defaultTimeoutInterval: 100000
  }
};

最佳答案

限制在于“Jasmine2HtmlReporter”,因为它会在并行运行测试时覆盖 html 报告文件。但避免这种情况绝对是可能的,并且有几种方法可以做到这一点。根据您的方便程度选择合适的方式

1) 修补 Jasmine2HtmlReporter 的“index.js”以附加文件,而不是使用 PhantomJs 覆盖其文件

2) 通过从 onPrepare() 函数配置 Jasmine2HTML 报告器来生成独特的 HTML 报告,并在稍后合并所有报告

解决方案 1:Jasmine2HtmlReporter 当前的代码库 - index.js 使用两个函数 - phantomWrite()nodeWrite() 进行写入数据。请参阅here

我创建了一个新函数 - appendwrite() 来附加而不是覆盖,并修改了代码来拾取此函数 查看我从 protractor-jasmine2-html-reporter fork 出来的 github 代码

        function appendwrite(path, filename, text){
            var fs = require("fs");
            var nodejs_path = require("path");
            require("mkdirp").sync(path); // make sure the path exists
            var filepath = nodejs_path.join(path, filename);
            fs.appendFileSync(filepath,text)
            return;
        }

并修改“node_modules/protractor-jasmine2-html-reporter/index.js”中的self.writeFile函数以获取新函数

        try {
            appendwrite(path, filename, text);
            //phantomWrite(path, filename, text);
            return;
        } catch (e) { errors.push('  PhantomJs attempt: ' + e.message); }
        try {
            nodeWrite(path, filename, text);
            return;
        } catch (f) { errors.push('  NodeJS attempt: ' + f.message); }

并注释下面的代码,该代码会清理新运行的报告,以便您不会看到任何错误清理错误 - CleanUpCode

    rmdir(self.savePath);

解决方案 2:通过在 OnPrepare 函数中配置 Jasmine 报告器,根据并行实例的 sessionID 生成单独的报告

onPrepare: function() {
        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);
                jasmine.getEnv().addReporter(
                    new Jasmine2HtmlReporter({
                        savePath: 'target/',
                        screenshotsFolder: 'images',
                        consolidate: true,
                        consolidateAll: true,
                        filePrefix: reportName + ".html"
                    })
                );
                fulfill();
            })
        });
    },

第 2 步:完成完整测试并关闭所有 Webdriver session 后,在 afterLaunch() 方法中合并跨并行实例生成的报告

afterLaunch: function afterLaunch() {
        var fs = require('fs');
        var output = '';
       fs.readdirSync('target/').forEach(function(file){
           if(!(fs.lstatSync('target/' + file).isDirectory()))
            output = output + fs.readFileSync('target/' + file);
       });
        fs.writeFileSync('target/ConsolidatedReport.html', output, 'utf8');
    },

您将看到生成的报告类似于下面的内容,其中还有一个 ConsolidatedReport PS:请忽略任何拼写错误和语法错误。这仅作为示例,可以自定义

enter image description here

EDIT1:我们用来命名 HTML 报告的“sessionID”是 webdriver 远程 sessionID,如果您怀疑它在多个 session 中可能无法保持唯一,只需为各个 HTML 报告生成一个随机数并稍后进行合并

我修改了上面的代码

关于jenkins - 当使用 'shardTestFiles' : true in conf file 共享测试时,protractor-jasmine2-html-reporter 不会合并所有测试的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39336025/

相关文章:

javascript - 带有 Protractor js 的剪贴板中的文本

jenkins无权复制文件-还是吗?

java - 将运行 JUnit 测试作为 Jenkins 配置的一部分

unit-testing - Angular NgModel双向绑定(bind)单元测试

angularjs - 睾丸 : encountered a declaration exception

javascript - 如何在 Protractor 中组合多个期望条件?

svn - 由于根文件夹被禁止,无法执行对 svn 的提交

android - Jenkins 无法创建 Cordova 平台

angularjs - 当没有 $scope 强制摘要时,如何解决 AngularJS、Jasmine 2.0 中的 promise ?

html - 使用 Protractor 进行 Web 内容测试的想法?