跳至主要内容

自定义 Reporter

您可以为 WDIO 测试运行器编写自己的自定义 Reporter,以满足您的需求。这很容易!

您只需创建一个继承自@wdio/reporter包的 Node 模块,以便它可以接收来自测试的消息。

基本设置应如下所示

import WDIOReporter from '@wdio/reporter'

export default class CustomReporter extends WDIOReporter {
constructor(options) {
/*
* make reporter to write to the output stream by default
*/
options = Object.assign(options, { stdout: true })
super(options)
}

onTestPass(test) {
this.write(`Congratulations! Your test "${test.title}" passed 👏`)
}
}

要使用此 Reporter,您只需将其分配给配置中的reporter属性。

您的wdio.conf.js文件应如下所示

import CustomReporter from './reporter/my.custom.reporter'

export const config = {
// ...
reporters: [
/**
* use imported reporter class
*/
[CustomReporter, {
someOption: 'foobar'
}]
/**
* use absolute path to reporter
*/
['/path/to/reporter.js', {
someOption: 'foobar'
}]
],
// ...
}

您还可以将 Reporter 发布到 NPM,以便每个人都可以使用它。像其他 Reporter 一样命名包wdio--reporter,并使用诸如wdiowdio-reporter之类的关键字标记它。

事件处理程序

您可以为测试期间触发的多个事件注册事件处理程序。所有以下处理程序都将接收包含有关当前状态和进度有用信息的有效负载。

这些有效负载对象的结构取决于事件,并且在框架(Mocha、Jasmine 和 Cucumber)之间是统一的。一旦您实现了一个自定义 Reporter,它应该适用于所有框架。

以下列表包含您可以添加到 Reporter 类中的所有可能方法

import WDIOReporter from '@wdio/reporter'

export default class CustomReporter extends WDIOReporter {
onRunnerStart() {}
onBeforeCommand() {}
onAfterCommand() {}
onSuiteStart() {}
onHookStart() {}
onHookEnd() {}
onTestStart() {}
onTestPass() {}
onTestFail() {}
onTestSkip() {}
onTestEnd() {}
onSuiteEnd() {}
onRunnerEnd() {}
}

方法名称不言自明。

要在某个事件上打印某些内容,请使用this.write(...)方法,该方法由父WDIOReporter类提供。它将内容流式传输到stdout或日志文件(取决于 Reporter 的选项)。

import WDIOReporter from '@wdio/reporter'

export default class CustomReporter extends WDIOReporter {
onTestPass(test) {
this.write(`Congratulations! Your test "${test.title}" passed 👏`)
}
}

请注意,您不能以任何方式延迟测试执行。

所有事件处理程序都应执行同步例程(否则您将遇到竞争条件)。

请务必查看示例部分,您可以在其中找到一个打印每个事件的事件名称的示例自定义 Reporter。

如果您已实现一个对社区可能有用的自定义 Reporter,请不要犹豫,提交一个 Pull Request,以便我们能够向公众提供此 Reporter!

此外,如果您通过Launcher接口运行 WDIO 测试运行器,则不能按如下方式将自定义 Reporter 应用为函数

import Launcher from '@wdio/cli'

import CustomReporter from './reporter/my.custom.reporter'

const launcher = new Launcher('/path/to/config.file.js', {
// this will NOT work, because CustomReporter is not serializable
reporters: ['dot', CustomReporter]
})

等待直到isSynchronised

如果您的 Reporter 必须执行异步操作来报告数据(例如上传日志文件或其他资产),您可以覆盖自定义 Reporter 中的isSynchronised方法,以让 WebdriverIO 运行器等待您完成所有计算。您可以在@wdio/sumologic-reporter中看到此示例。

export default class SumoLogicReporter extends WDIOReporter {
constructor (options) {
// ...
this.unsynced = []
this.interval = setInterval(::this.sync, this.options.syncInterval)
// ...
}

/**
* overwrite isSynchronised method
*/
get isSynchronised () {
return this.unsynced.length === 0
}

/**
* sync log files
*/
sync () {
// ...
request({
method: 'POST',
uri: this.options.sourceAddress,
body: logLines
}, (err, resp) => {
// ...
/**
* remove transferred logs from log bucket
*/
this.unsynced.splice(0, MAX_LINES)
// ...
}
}
}

这样,运行器将等待直到所有日志信息上传完毕。

在 NPM 上发布 Reporter

为了使 Reporter 更容易被 WebdriverIO 社区使用和发现,请遵循以下建议

  • 服务应使用此命名约定:wdio-*-reporter
  • 使用 NPM 关键字:wdio-pluginwdio-reporter
  • main入口应export Reporter 的实例
  • 示例 Reporter:@wdio/dot-service

遵循推荐的命名模式允许按名称添加服务

// Add wdio-custom-reporter
export const config = {
// ...
reporter: ['custom'],
// ...
}

将已发布的服务添加到 WDIO CLI 和文档

我们非常感谢每个可以帮助其他人运行更佳测试的新插件!如果您创建了此类插件,请考虑将其添加到我们的 CLI 和文档中,以便更容易找到。

请使用以下更改提交一个 pull request

欢迎!我如何提供帮助?

WebdriverIO AI Copilot