自定义 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-
,并使用诸如wdio
或wdio-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-plugin
、wdio-reporter
main
入口应export
Reporter 的实例- 示例 Reporter:
@wdio/dot-service
遵循推荐的命名模式允许按名称添加服务
// Add wdio-custom-reporter
export const config = {
// ...
reporter: ['custom'],
// ...
}
将已发布的服务添加到 WDIO CLI 和文档
我们非常感谢每个可以帮助其他人运行更佳测试的新插件!如果您创建了此类插件,请考虑将其添加到我们的 CLI 和文档中,以便更容易找到。
请使用以下更改提交一个 pull request
- 将您的服务添加到 CLI 模块中支持的 Reporter 列表中。
- 增强Reporter 列表,以便将您的文档添加到官方 Webdriver.io 页面中。