【发布时间】:2019-11-01 10:46:33
【问题描述】:
我们在 CI 服务器上运行了一个大型测试套件,如果测试失败,似乎无法告诉赛普拉斯退出。它始终运行整个套件。
有一些讨论here,但没有可行的解决方案。
是否有可靠的方法让赛普拉斯在测试失败后立即退出?
【问题讨论】:
标签: javascript testing continuous-integration cypress
我们在 CI 服务器上运行了一个大型测试套件,如果测试失败,似乎无法告诉赛普拉斯退出。它始终运行整个套件。
有一些讨论here,但没有可行的解决方案。
是否有可靠的方法让赛普拉斯在测试失败后立即退出?
【问题讨论】:
标签: javascript testing continuous-integration cypress
您也可以使用这个 Cypress 插件,同时 Cypress 本身不支持此功能:https://www.npmjs.com/package/cypress-fail-fast
将插件添加到 devDependencies:
npm i --save-dev cypress-fail-fast
在 cypress/plugins/index.js 内部:
module.exports = (on, config) => {
require("cypress-fail-fast/plugin")(on, config);
return config;
};
在 cypress/support/index.js 的顶部:
import "cypress-fail-fast";
【讨论】:
正如您所提到的,它尚未得到官方支持(截至 3.6.0)。
这是我对 hack 的看法(不使用 cookie 等来保持状态):
// cypress/plugins/index.js
let shouldSkip = false;
module.exports = ( on ) => {
on('task', {
resetShouldSkipFlag () {
shouldSkip = false;
return null;
},
shouldSkip ( value ) {
if ( value != null ) shouldSkip = value;
return shouldSkip;
}
});
}
// cypress/support/index.js
function abortEarly () {
if ( this.currentTest.state === 'failed' ) {
return cy.task('shouldSkip', true);
}
cy.task('shouldSkip').then( value => {
if ( value ) this.skip();
});
}
beforeEach(abortEarly);
afterEach(abortEarly);
before(() => {
if ( Cypress.browser.isHeaded ) {
// Reset the shouldSkip flag at the start of a run, so that it
// doesn't carry over into subsequent runs.
// Do this only for headed runs because in headless runs,
// the `before` hook is executed for each spec file.
cy.task('resetShouldSkipFlag');
}
});
一旦遇到故障,将跳过所有进一步的测试。输出将如下所示:
【讨论】: