Reporter
测试运行器在执行过程中会通过 reporter 通知各种事件。reporter 的所有方法都是可选的。
您可以通过实现一个包含部分 reporter 方法的类来创建自定义 reporter。请确保将该类作为默认导出。
- TypeScript
- JavaScript
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;
// @ts-check
/** @implements {import('@playwright/test/reporter').Reporter} */
class MyReporter {
constructor(options) {
console.log(`my-awesome-reporter setup with customOption set to ${options.customOption}`);
}
onBegin(config, suite) {
console.log(`Starting the run with ${suite.allTests().length} tests`);
}
onTestBegin(test) {
console.log(`Starting test ${test.title}`);
}
onTestEnd(test, result) {
console.log(`Finished test ${test.title}: ${result.status}`);
}
onEnd(result) {
console.log(`Finished the run: ${result.status}`);
}
}
module.exports = MyReporter;
现在可以通过 testConfig.reporter 使用这个 reporter。了解更多关于 使用 reporters 的信息。
import { defineConfig } from '@playwright/test';
export default defineConfig({
reporter: [['./my-awesome-reporter.ts', { customOption: 'some value' }]],
});
以下是 reporter 方法的典型调用顺序:
- reporter.onBegin() 被调用一次,传入包含所有其他套件和测试的根套件。了解更多关于 套件层级 的信息。
- reporter.onTestBegin() 为每个测试运行调用一次。它接收一个正在执行的 TestCase 和一个几乎为空的 TestResult。测试结果会在测试运行时填充(例如包含步骤和标准输出),并在测试完成后获得最终的
status
。 - reporter.onStepBegin() 和 reporter.onStepEnd() 为测试内执行的每个步骤调用。当步骤执行时,测试运行尚未完成。
- reporter.onTestEnd() 在测试运行完成时调用。此时 TestResult 已完成,您可以使用 testResult.status、testResult.error 等属性。
- reporter.onEnd() 在所有应运行的测试完成后调用一次。
- reporter.onExit() 在测试运行器退出前立即调用。
此外,当工作进程中产生标准输出时(可能在测试执行期间),会调用 reporter.onStdOut() 和 reporter.onStdErr();当测试执行之外发生错误时,会调用 reporter.onError()。
如果您的自定义 reporter 不向终端输出任何内容,请实现 reporter.printsToStdio() 并返回 false
。这样 Playwright 会在您的自定义 reporter 之外使用一个标准终端 reporter 来增强用户体验。
合并报告 API 注意事项
当通过 merge-reports
CLI 命令合并多个 blob
报告时,会调用相同的 Reporter API 来生成最终报告,所有现有 reporter 都应无需修改即可工作。但存在一些细微差异可能会影响某些自定义 reporter:
- 来自不同分片的项目始终作为单独的 TestProject 对象保留。例如,如果项目 'Desktop Chrome' 被分片到 5 台机器上,那么在传递给 reporter.onBegin() 的配置中,会有 5 个同名项目实例。
方法
onBegin
添加于: v1.10在运行测试前调用一次。所有测试已被发现并组织成 Suite 的层级结构。
用法
reporter.onBegin(config, suite);
参数
-
config
FullConfig#已解析的配置项。
-
包含所有项目、文件和测试用例的根套件。
onEnd
Added in: v1.10在所有测试运行完毕或测试被中断后调用。注意此方法可以返回一个 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'
- 被用户中断。
-
返回值
onError
Added in: v1.10在发生某些全局错误时调用,例如工作进程中的未捕获异常。
用法
reporter.onError(error);
参数
onExit
Added in: v1.33在测试运行器退出前立即调用。此时所有报告器都已收到 reporter.onEnd() 信号,因此所有报告应该已经构建完成。你可以在这个钩子中运行上传报告的代码。
用法
await reporter.onExit();
返回值
onStdErr
Added in: v1.10当工作进程中有内容写入标准错误时调用。
用法
reporter.onStdErr(chunk, test, result);
参数
-
输出块。
-
正在运行的测试。注意输出可能发生在没有测试运行时,此时该参数为 void。
-
result
void | TestResult#测试运行结果,该对象会在测试运行时被填充。
onStdOut
添加于: v1.10当工作进程中有内容写入标准输出时调用。
用法
reporter.onStdOut(chunk, test, result);
参数
-
输出片段。
-
正在运行的测试用例。注意输出可能在没有测试运行时发生,此时该参数为 void。
-
result
void | TestResult#测试运行结果,该对象会在测试运行过程中被填充。
onStepBegin
v1.10 版本新增当工作进程中测试步骤开始时调用。
用法
reporter.onStepBegin(test, result, step);
参数
onStepEnd
Added in: v1.10当测试步骤在工作进程中完成时调用。
用法
reporter.onStepEnd(test, result, step);
参数
onTestBegin
Added in: v1.10当测试在工作进程中启动后调用。
用法
reporter.onTestBegin(test, result);
参数
-
已启动的测试用例。
-
result
TestResult#测试运行的结果对象,该对象会在测试运行过程中逐步填充。
onTestEnd
Added in: v1.10在 worker 进程中测试完成后调用。
用法
reporter.onTestEnd(test, result);
参数
-
已完成的测试用例。
-
result
TestResult#测试运行结果。
printsToStdio
Added in: v1.10该 reporter 是否使用标准输入输出进行报告。当不使用 stdio 时,Playwright Test 可以添加一些输出来增强用户体验。如果你的 reporter 不打印到终端,强烈建议返回 false
。
用法
reporter.printsToStdio();
返回值