You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Playwright中实现测试失败时禁用全局Teardown?

解决Playwright全局Teardown仅在测试全成功时执行的问题

问题分析

你当前的全局Teardown会在测试结束后无条件执行,需求是仅当所有测试用例都通过时才运行清理逻辑,且你已通过test.list实现串行测试,这个前提能保证状态判断的准确性。另外先修正一个小问题:你的teardown.js里直接导出了globalTeardown()的执行结果,这会导致清理逻辑在文件加载时就提前运行,而非测试结束后,需要改成导出函数本身。

方案一:通过进程退出码判断(简单直接)

Playwright在所有测试通过时会将process.exitCode设为0,只要有测试失败或运行出错,该值就会是非0。利用这个特性可以快速实现需求:

修改teardown.js

import { chromium } from '@playwright/test';

async function globalTeardown() {
  // 仅测试全成功时执行清理逻辑
  if (process.exitCode === 0) {
    const browser = await chromium.launch();
    const page = await browser.newPage();
    // 这里放置你的teardown业务代码
    console.log('执行全局清理操作');
    await browser.close();
  } else {
    console.log('存在测试失败/错误,跳过全局清理');
  }
}

// 导出函数本身,不要加括号执行
export default globalTeardown;

方案二:通过标记文件精准判断测试用例失败(更可控)

如果需要区分「测试用例失败」和「其他运行错误」(比如配置错误、进程崩溃),可以通过在测试失败时写入标记文件,让Teardown读取该文件来决定是否执行:

第一步:修改test.list.js,添加失败监听

import { test } from '@playwright/test';
import fs from 'fs';
import path from 'path';

import usecase1 from './e2e/usecase-1.spec';
import usecase2 from './e2e/usecase-2.spec';
import usecase3 from './e2e/usecase-3.spec';
import usecase4 from './e2e/usecase-4.spec';

// 定义标记文件路径
const failedFlagPath = path.resolve('./test-failed-flag');

// 测试开始前清除旧的标记文件
test.beforeAll(() => {
  if (fs.existsSync(failedFlagPath)) {
    fs.unlinkSync(failedFlagPath);
  }
});

// 监听每个测试用例的失败状态,触发时写入标记文件
test.afterEach(({ testInfo }) => {
  if (testInfo.status === 'failed') {
    fs.writeFileSync(failedFlagPath, '1');
  }
});

test.describe(usecase1);
test.describe(usecase2);
test.describe(usecase3);
test.describe(usecase4);

第二步:修改teardown.js读取标记

import { chromium } from '@playwright/test';
import fs from 'fs';
import path from 'path';

async function globalTeardown() {
  const failedFlagPath = path.resolve('./test-failed-flag');
  let hasTestFailed = false;

  // 检查标记文件是否存在
  try {
    hasTestFailed = fs.existsSync(failedFlagPath);
    // 无论是否存在,都清理标记文件避免影响下次测试
    if (hasTestFailed) {
      fs.unlinkSync(failedFlagPath);
    }
  } catch (err) {
    console.error('检查测试失败状态出错:', err);
  }

  if (!hasTestFailed) {
    const browser = await chromium.launch();
    const page = await browser.newPage();
    // 你的teardown业务代码
    console.log('执行全局清理操作');
    await browser.close();
  } else {
    console.log('有测试用例失败,跳过全局清理');
  }
}

export default globalTeardown;

注意事项

  1. 确保playwright.config.js中fullyParallel: false保持开启,串行测试才能保证标记文件的状态准确。
  2. 方案一中的process.exitCode可能被非测试失败的情况影响,若需要精准控制,优先选择方案二。

内容的提问来源于stack exchange,提问作者David Pongo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 23:15:39