【问题标题】:Protractor Exits with code 0 even though tests are failing即使测试失败,量角器也会以代码 0 退出
【发布时间】:2018-11-28 22:19:34
【问题描述】:

我正在通过 npm 运行 protractor v4.0.9,并注意到我在 Visual Studio Team Services 上的构建不会失败,即使测试报告为失败。进一步研究这一点,我引入了一个错误,因此测试会失败,然后在本地运行它们。如下面的屏幕截图所示,我有 17/17 次失败的测试,但退出代码仍然是 0,我理解这是成功的。它甚至说chrome #01 passed,我认为这是错误的。

这是我的量角器配置:

"use strict";
exports.config = {
    baseUrl: process.env.npm_package_config_baseUrl,
    framework: 'jasmine',
    capabilities: {
        browserName: 'chrome'
    },
    specs: ['test/*.spec.js'],
    rootElement: 'se-app',
    directConnect: true,
    ignoreUncaughtExceptions: false,
    onPrepare: function () {
        var globals = require('protractor');
        var browser = globals.browser;
        browser.ignoreSynchronization = true;
        browser.manage().window().maximize();
        var specReporter = require('jasmine-spec-reporter');

        // add jasmine spec reporter
        jasmine.getEnv().clearReporters();
        jasmine.getEnv().addReporter(new specReporter({
            displayStacktrace: false
        }));

        var reporters = require('jasmine-reporters');
        jasmine.getEnv().addReporter(new reporters.JUnitXmlReporter({
            savePath: 'junit/'
        }));
    },
};

我检查了documentation for the Protractor config,但看不到任何会导致这种情况发生的明显设置。我什至在ignoreUncaughtExceptions:false(如上所示)中添加了明确但没有任何区别。

【问题讨论】:

  • 您使用的是什么版本的节点?我遇到了一个奇怪的问题,我使用的是更新版本的节点,并且所有测试都立即通过了。我不得不恢复到旧版本的节点。我发现它可以与 4.2.4 一起使用,但我不得不删除我的节点模块文件夹并再次执行 npm 安装。
  • 我使用的是 v7.2.0。然而,我第一次发现问题的构建服务器使用的是 v5(不确定是哪个版本,因为我现在也将它更新到 v7.2.0)。
  • 我意识到我刚刚说的是更新版本。我使用的较新版本是 4.5,这给了我这个问题。我使用的一件事是 nvm 在不同版本的节点之间轻松切换。我的问题与您的问题不完全相同,但它发生在我团队中的几个人身上 b/c 我们正在使用 4.5 版进行我们正在处理的不同项目
  • 您的配置看起来很正常,我建议您删除部分 onPrepare 或一起删除您的 onPrepare,看看它是否返回 0 以外的值。我还建议使用最新版本的 Protractor: 4.0.11
  • 你能添加下面的afterLaunch()方法来真正检查退出代码值afterLaunch: function(exitCode) { console.log('exit code is' + exitCode) },

标签: angular npm protractor azure-devops


【解决方案1】:

好的,我发现了问题。默认情况下,Jasmine 包含控制台ReporterCompletionReporter。如果测试失败,后者是退出过程的内容。通过清除记者,我正在删除该记者。

我可以只删除该行,但我想删除控制台报告器,以便规范报告器和控制台报告器不做同样的工作。

所以我不得不重新添加完成报告器。我不确定这是否是“正确”的方法,但它确实有效。这是我的新 onPrepare 函数:

onPrepare: function() {
    let globals = require('protractor');
    let reporters = require('jasmine-reporters');
    let CompletionReporter = require('jasmine/lib/reporters/completion_reporter');
    let SpecReporter = require('jasmine-spec-reporter');

    let browser: ProtractorBrowser = globals.browser;
    browser.ignoreSynchronization = true;
    browser.manage().window().maximize();

    let specReporter = new SpecReporter({
        displayStacktrace: false
    });

    let junitReporter = new reporters.JUnitXmlReporter({
        savePath: 'junit/'
    });

    let completionReporter = new CompletionReporter();
    completionReporter.onComplete((success: boolean) => {
        if (!success) {
            process.exit(1);
        }
    });

    // Now clear all existing reporters and add the ones I want in the order I want
    jasmine.getEnv().clearReporters();
    jasmine.getEnv().addReporter(specReporter);
    jasmine.getEnv().addReporter(junitReporter);
    jasmine.getEnv().addReporter(completionReporter);
}

【讨论】:

  • 我试过这个,它并没有让量角器/Jasmine 优雅地退出,所以我最终得到了一个挥之不去的 Chrome 浏览器。所以似乎应该有更优雅的方式来实现这一点。
  • 对我不起作用。进程仍以“退出状态 4”退出
【解决方案2】:

如果有人在 Jasmine 2+ 上遇到此问题,Maloric 的回答将不会涵盖您。相反,将 onComplete 函数添加到 protractor.conf 本身:

...other conf...,
onComplete: function (success) {
    if (!success) {
      process.exit(1);
    }
}

由于某种原因,默认的 onComplete 操作似乎是空的,但这会纠正它。如果您已经指定了其他 onComplete 操作,只需添加 process.exit(code) 调用即可。

【讨论】:

  • 尽管我们的测试通过/失败在以 0 或 1 退出的进程方面工作正常,但我们在 afterAll() 中遇到了失败,这仅被视为警告(根据设计,确实有道理)。但是,我们希望这会导致流程失败,这是我迄今为止发现的唯一可行的方法!
【解决方案3】:

如果您使用 grunt-protractor-runner 模块运行量角器,请确保 Gruntfile.js 中 protractor.options 下的选项 keepAlive 设置为 false。

【讨论】:

    猜你喜欢
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 2022-11-06
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多