跳转到主要内容

Reporter

测试运行器(Test runner)会在测试执行过程中通知报告器(Reporter)各种事件。报告器的所有方法都是可选的。

你可以通过实现一个包含部分报告器方法的类来创建自定义报告器。请确保将此类作为默认导出(export default)。

my-awesome-reporter.ts
import type {
Reporter, FullConfig, Suite, TestCase, TestResult, FullResult
} from '@playwright/test/reporter';

class MyReporter implements Reporter {
constructor(options: { customOption?: string } = {}) {
console.log(`my-awesome-reporter setup with customOption set to ${options.customOption}`);
}

onBegin(config: FullConfig, suite: Suite) {
console.log(`Starting the run with ${suite.allTests().length} tests`);
}

onTestBegin(test: TestCase) {
console.log(`Starting test ${test.title}`);
}

onTestEnd(test: TestCase, result: TestResult) {
console.log(`Finished test ${test.title}: ${result.status}`);
}

onEnd(result: FullResult) {
console.log(`Finished the run: ${result.status}`);
}
}
export default MyReporter;

现在,使用 testConfig.reporter 来使用此报告器。了解更多关于 使用报告器 的信息。

playwright.config.ts
import { defineConfig } from '@playwright/test';

export default defineConfig({
reporter: [['./my-awesome-reporter.ts', { customOption: 'some value' }]],
});

以下是报告器调用的典型顺序

此外,当工作进程(worker process)产生标准输出时会调用 reporter.onStdOut()reporter.onStdErr()(可能在测试执行期间),当测试执行之外出现问题时会调用 reporter.onError()

如果你的自定义报告器不会向终端打印任何内容,请实现 reporter.printsToStdio() 并返回 false。这样,Playwright 除了使用你的自定义报告器外,还会使用标准终端报告器之一,以提升用户体验。

报告器错误

Playwright 会吞掉自定义报告器方法中抛出的任何错误。如果你需要检测或处理报告器错误,必须自行封装并处理它们。

合并报告 API 注意事项

当通过 merge-reports CLI 命令合并多个 blob 报告时,会调用相同的 Reporter API 来生成最终报告,所有现有的报告器应该无需任何更改即可正常工作。不过,存在一些细微差别,可能会影响某些自定义报告器。

  • 来自不同分片(shard)的项目始终作为独立的 TestProject 对象保存。例如,如果 'Desktop Chrome' 项目被分片到 5 台机器上,那么在传递给 reporter.onBegin() 的配置中,将存在 5 个同名的项目实例。

方法

onBegin

新增于: v1.10 reporter.onBegin

在运行测试前调用一次。所有测试都已被发现并放入 Suite(套件)层级中。

用法

reporter.onBegin(config, suite);

参数

  • config FullConfig#

    解析后的配置。

  • suite Suite#

    包含所有项目、文件和测试用例的根套件。


onEnd

新增于: v1.10 reporter.onEnd

在所有测试运行结束后,或测试被中断时调用。注意,此方法可以返回一个 Promise,Playwright Test 将会等待它完成。报告器可以覆盖状态,从而影响测试运行器的退出代码。

用法

await reporter.onEnd(result);

参数

  • result Object#

    • status "passed" | "failed" | "timedout" | "interrupted"

      测试运行状态。

    • startTime Date

      测试运行的起始挂钟时间。

    • duration number

      测试运行持续时间(毫秒)。

    完整测试运行的结果,status 可以是以下之一:

    • 'passed' - 一切按预期进行。
    • 'failed' - 有测试失败。
    • 'timedout' - 已达到 testConfig.globalTimeout
    • 'interrupted' - 被用户中断。

返回

  • Promise<Object>#
    • status "passed" | "failed" | "timedout" | "interrupted" (可选)

onError

新增于: v1.10 reporter.onError

在出现全局错误时调用,例如工作进程中未捕获的异常。

用法

reporter.onError(error);
reporter.onError(error, workerInfo);

参数

  • error TestError#

    错误信息。

  • workerInfo WorkerInfo (可选)添加于: v1.60#

    包含产生此错误的工作进程的信息。对于未与特定工作进程关联的错误,此项为 undefined


onExit

新增于:v1.33 reporter.onExit

在测试运行器退出前立即调用。此时所有报告器都已接收到 reporter.onEnd() 信号,因此所有报告应该已构建完成。你可以在此钩子中运行上传报告的代码。

用法

await reporter.onExit();

返回


onStdErr

新增于: v1.10 reporter.onStdErr

当工作进程中的标准错误被写入内容时调用。

用法

reporter.onStdErr(chunk, test, result);

参数

  • chunk string | Buffer#

    输出的数据块。

  • test void | TestCase#

    正在运行的测试。注意,输出可能发生在没有测试运行时,这种情况下该参数为 void

  • result void | TestResult#

    测试运行的结果,此对象会在测试运行期间被填充。


onStdOut

新增于: v1.10 reporter.onStdOut

当工作进程中的标准输出被写入内容时调用。

用法

reporter.onStdOut(chunk, test, result);

参数

  • chunk string | Buffer#

    输出的数据块。

  • test void | TestCase#

    正在运行的测试。注意,输出可能发生在没有测试运行时,这种情况下该参数为 void

  • result void | TestResult#

    测试运行的结果,此对象会在测试运行期间被填充。


onStepBegin

新增于: v1.10 reporter.onStepBegin

当工作进程中开始一个测试步骤时调用。

用法

reporter.onStepBegin(test, result, step);

参数

  • test TestCase#

    该步骤所属的测试。

  • result TestResult#

    测试运行的结果,此对象会在测试运行期间被填充。

  • step TestStep#

    已开始的测试步骤实例。


onStepEnd

新增于: v1.10 reporter.onStepEnd

当工作进程中结束一个测试步骤时调用。

用法

reporter.onStepEnd(test, result, step);

参数


onTestBegin

新增于: v1.10 reporter.onTestBegin

在工作进程中开始测试后调用。

用法

reporter.onTestBegin(test, result);

参数

  • test TestCase#

    已开始的测试。

  • result TestResult#

    测试运行的结果,此对象会在测试运行期间被填充。


onTestEnd

新增于: v1.10 reporter.onTestEnd

在工作进程中结束测试后调用。

用法

reporter.onTestEnd(test, result);

参数


printsToStdio

新增于: v1.10 reporter.printsToStdio

该报告器是否使用标准输入输出(stdio)进行报告。如果不使用,Playwright Test 可能会添加一些输出以增强用户体验。如果你的报告器不向终端打印内容,强烈建议返回 false

用法

reporter.printsToStdio();

返回