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

Grouping test results : Karma / Protractor integration with Jenkins

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

我的问题非常简单,可以通过以下屏幕截图看到:我无法区分我的测试套件是量角器测试还是业力测试。

因此我问自己以下问题:

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


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

你的问题是合理的,但是从目前的情况来看,这个问题的解决方案更接近于基于意见。

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

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

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

为了这个目的有多个工作真的很不方便。

另一种选择是使用 HTML Publisher Plugin 来显示 karma/protractor html 记者生成的测试结果,我从未使用过,所以这取决于你。

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

我有针对您的特定用例的解决方案,希望能解决您的技术问题。

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

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

您将需要两个额外的包,karma-junit-reporter and jasmine-reporters。我们将为 Karma 使用 karma-junit-reporter,为 Protractor 使用 jasmine-reporters。

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

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

安装 karma-junit-reporter:

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

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

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

require('karma-junit-reporter')

将 junit 添加到 reporters 数组:

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

添加一个 junitReporter 对象如下:

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

安装 jasmine-reporters:

npm install jasmine-reporters --save-dev

请注意,截至撰写本文时; Protractor 的 jasmine-reporters 文档指出你应该 运行 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 测试结果仪表板现在将如下所示:

出于本次演示的目的,我没有通过单元测试和 e2e 测试,如您所见,每个测试名称都有一个前缀,用于确定它是单元测试还是 e2e。您还可以通过单击包下的 link 深入查看所有 e2e 或所有单元测试。

如果您有足够的勇气和充足的时间,您可以编写自己的实用程序来完成与这些包相同的工作,以获得更加个性化的结果。

我希望这能帮助您达到您想要的结果。

谢谢