即使测试失败,Protractor仍以代码0退出。

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

protractor passing when it should fail

这是我的protractor配置:

"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/'
        }));
    },
};

我查看了Protractor配置文档,但没有看到任何明显的设置会导致这种情况发生。我甚至添加了ignoreUncaughtExceptions:false(如上所示)以明确说明,但没有任何改变。

你使用的是哪个版本的Node?我曾经遇到一个奇怪的问题,当我使用了一个更新的Node版本时,所有的测试都立即通过了。但我不得不回退到旧版本的Node。我发现它可以与4.2.4版本一起工作,但我必须删除我的node模块文件夹并再次运行npm install。 - BarretV
1
我正在使用v7.2.0版本。然而,我最初发现问题的构建服务器使用的是v5版本(不确定具体是哪个版本,因为我现在也已将其更新为v7.2.0)。 - Maloric
1
你能否添加以下的 afterLaunch() 方法来真正检查退出代码值吗? afterLaunch: function(exitCode) { console.log('exit code is' + exitCode) }, - AdityaReddy
如果您能提供完整的堆栈跟踪,那就太好了! - AdityaReddy
afterLaunch函数还会报告退出代码为0。如果我删除jasmine.getEnv().clearReporters()这行,它就能正常工作。但我不想要原始的控制台报告器,只需要jasmine spec报告器。 - Maloric
显示剩余2条评论
3个回答

3

好的,我找到了问题。默认情况下,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);
}

1
我尝试过这个方法,但它不能让protractor/Jasmine优雅地退出,所以最终我得到了一个挂起的Chrome浏览器。因此,似乎应该有更加优雅的方法来实现这一点。 - donmartin
对我不起作用。进程仍然以“退出状态4”退出。 - Joerg S

3

如果有人在Jasmine 2+上遇到这个问题,Maloric的答案将无法解决你的问题。相反,将onComplete函数添加到protractor.conf本身中:

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

出于某些原因,默认的onComplete操作似乎是空的,但这将予以纠正。如果您已经指定了其他onComplete操作,请添加process.exit(code)调用。


尽管我们的测试通过/失败在进程以0或1退出的方面表现良好,但我们在afterAll()中遇到了一个失败,这仅被视为警告(按设计,这是有意义的)。然而,我们希望这会导致进程失败,到目前为止,这是我找到的唯一有效的解决方法!! - Claire Furney

0
如果您使用的是 grunt-protractor-runner 模块来运行 Protractor,请确保在 Gruntfile.js 中,protractor . options 下选项 keepAlive 被设置为 false。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接