JavaScript Jasmine中条件校验失败时如何跳过测试套件内所有用例
WebdriverIO + Jasmine 条件不满足时跳过整个测试套件解决方案
你之前在beforeAll中调用pending()未生效,原因是Jasmine的pending()方法仅作用于当前正在执行的测试单元,beforeAll属于套件级前置钩子,不会自动将pending状态传递给下属所有测试用例。
可以通过以下两种常用方案实现需求:
方案1:beforeEach全局校验自动跳过所有用例(适配异步前置校验场景)
该方案不需要修改原有测试用例代码,仅需新增一个全局前置钩子,每个用例执行前都会自动判断前置条件,符合你需要的异步登录校验后跳过所有用例的场景,示例代码如下:
let checkCondition = false; describe(`My Test Suite`, () => { beforeAll(async () => { // 原有的登录校验异步逻辑 checkCondition = await returnBoolean(); if (checkCondition) { console.log(`前置校验通过,开始执行测试`); } else { console.log('前置校验失败,跳过当前套件所有测试'); } }); // 新增该钩子,所有测试用例执行前都会触发校验 beforeEach(() => { if (!checkCondition) { pending('前置校验失败,自动跳过'); } }); // 原有测试用例不需要加任何判断逻辑 it(`Test 1`, () => { console.log("checkCondition is defined") }); it(`Test 2`, () => { // 正常编写业务校验逻辑 }); it(`Test 3`, () => { console.log("正常编写测试逻辑即可") }); });
该方案的执行效果为:前置校验失败时,所有用例都会被标记为pending状态,不会执行业务逻辑。
方案2:前置校验失败直接终止套件执行(标记为失败)
如果不需要标记为跳过,而是希望前置校验失败时直接终止整个套件的执行,将套件整体标记为失败,可以直接在beforeAll中抛出错误:
let checkCondition = false; describe(`My Test Suite`, () => { beforeAll(async () => { checkCondition = await returnBoolean(); if (!checkCondition) { // 抛出错误后,后续所有钩子和测试用例都不会执行 throw new Error('前置校验(网页登录/打开)失败,终止套件执行'); } console.log(`前置校验通过,开始执行测试`); }); it(`Test 1`, () => { console.log("checkCondition is defined") }); // 其余测试用例 });
补充:同步校验场景的简化写法
如果你的前置校验是同步逻辑,不需要等待异步操作返回结果,可以直接动态选择是否用xdescribe跳过整个套件:
// 同步判断是否需要执行该套件 const shouldRun = checkSyncCondition(); // 条件满足时执行describe,不满足时执行xdescribe跳过整个套件 (shouldRun ? describe : xdescribe)(`My Test Suite`, () => { // 所有测试用例 });
内容的提问来源于stack exchange,提问作者Suzy
相关产品推荐
相关产品推荐

