分组测试结果:Karma / Protractor与Jenkins集成

时间:2017-10-30 17:08:26

标签: angular jenkins protractor karma-runner jenkins-pipeline

我已经成功设置了Jenkins作业,该作业执行我的Karma测试(使用Angular-CLI)以及我的Protractor测试Angular4 App(使用Angular-CLI)。这两个测试都将输出一个XML文件,Jenkins将使用该文件来显示结果和详细信息。

使用以下屏幕截图,我的问题非常简单明了:我无法区分我的测试套件是来自我的量角器测试还是业力测试。

  • 以红色突出显示我的量角器测试套件
  • 我的Karma测试套件没有突出显示。

Jenkins job result

因此我问自己以下问题:

  • 通过持续集成管理今天的单元测试和端到端测试是否有良好的做法?
  • 我是否必须在单独的Jenkins工作中分开测试?这是否意味着我需要在Jenkins管道工作流程中使用两个不同的JenkinsFiles?
  • 或者相反,我可以简单地为每个测试套件设置一个前缀,这样我就可以轻松管理所有内容?

最后两个选项似乎都不切实际。

编辑:关注这个问题并在投票结束之前仔细阅读,因为它不是基于意见的。我将明确表示:我面临着持续集成的不切实际的实现,对问题有一个明确的定义,我希望有一个解决方案可以解决我当前的问题,如果可能的话,还有一些关于测试前端的强制实践应用程序,也可以清除此问题。

2 个答案:

答案 0 :(得分:4)

虽然这是一个常见问题,但我认为没有最佳或良好的做法。它只取决于开发人员希望如何在构建服务器上显示测试结果。

我为您的特定用例提供了解决方案,希望能解决您的技术问题。

我自己使用Teamcity,但是我已经将它改编为与Jenkins一起使用。我已经使用Angular CLI设置了一个演示应用程序来演示。

构建Jenkins和TeamCity等服务器只需从结果文件(Jenkins,通常是JUnit,我将在下面演示)或stdout(TeamCity)的服务消息中读取。因此,我们可以在写入这些记录之前操作测试结果数据,这使我们能够区分业力(单位)和量角器(e2e),而无需在单独的工作上运行测试或者使用不必要的前缀膨胀测试套件

您需要另外两个套餐karma-junit-reporterjasmine-reporters。我们将使用karma-junit-reporter for Karma和jasmine-reporter for Protractor。

这些包允许我们在将结果写入JUnit文件之前修改套件名称,这将有助于我们区分单元和e2e。

您可以按照每个工具提供的安装说明进行操作,也可以按照我的实施方式进行操作:

安装karma-junit-reporter:

  

npm install karma-junit-reporter --save-dev

对您的karma.conf.js文件进行以下更改:

将karma-junit-reporter添加到插件数组中:

require('karma-junit-reporter')

将junit添加到记者阵列:

reporters: ['progress', 'kjhtml', 'junit']

使用以下内容添加junitReporter对象:

junitReporter: {
        outputDir: 'testresults', 
        outputFile: 'karmatest.xml', 
        suite: 'unit',  // whichever prefix you wish to use
        useBrowserName: false, 
      }

安装jasmine-reporter:

  

npm install jasmine-reporter --save-dev

请注意,截至写作; Protractor的jasmine-reporter文档声明你应该运行npm install --save-dev jasmine-reporters@^2.0.0 - 但是这会导致问题而无需异常处理。我建议安装最新的。

将以下代码添加到protractor.conf.js文件的onPrepare函数中:

var jasmineReporters = require('jasmine-reporters');
return browser.getProcessedConfig().then(function (config) {
      var junitReporter = new jasmineReporters.JUnitXmlReporter({
        consolidateAll: true,
        savePath: 'testresults',
        filePrefix: 'protractor-test-results',
        modifySuiteName: function (generatedSuiteName, suite) {
          return 'e2e.' + generatedSuiteName; // whichever prefix you wish to use
    }
  });
  jasmine.getEnv().addReporter(junitReporter);
});

您现在应该将Jenkins作业配置为运行ng test,ng e2e并添加post构建操作以发布JUnit测试结果报告,如下所示:

  

testresults \ *。XML

您的Jenkins测试结果仪表板现在将如下所示:

Jenkins Test Results dashboard

出于本演示的目的,我未通过单元测试和e2e测试,因为您可以看到每个测试名称都有一个前缀,用于确定它是单位还是e2e。您还可以通过单击包下的链接深入查看所有e2e或所有单元测试。

如果你很勇敢并且有很多时间你可以编写自己的实用程序,它可以完成与这些程序包相同的工作,以获得更加个性化的结果。

我希望这可以帮助您实现所需的结果。

由于

答案 1 :(得分:2)

你的问题是合理的,但是对于这个问题的当前状态解决方案更接近基于意见。

我们在Teamcity遇到同样的问题,NUnit,Karma或Protractor测试之间没有视觉差异。之所以会发生这种情况,因为对于CI,所有测试都是相同的,它只是解析stdout搜索特定的模式/格式(测试套件,测试名称等),但是没有测试类型或测试类型,所以没有分组按类型。

因此区分测试的唯一方法是使用命名约定或创建describe函数的特殊版本:

export describeProtractor(name:string, ...) {
     describe('(Protractor)' + name, ...);
} 

为此目的拥有多个工作真的不方便。

另一个选择是使用HTML Publisher插件来显示由业力/量角器html记者生成的测试结果,我从来没有使用过它取决于你。

相关问题