カスタムレポーター
WDIOテストランナー用に、あなたのニーズに合わせたカスタムレポーターを作成することができます。そして、それは簡単です!
必要なのは、@wdio/reporter
パッケージを継承するノードモジュールを作成して、テストからメッセージを受け取れるようにすることだけです。
基本的なセットアップは次のようになります:
import WDIOReporter from '@wdio/reporter'
export default class CustomReporter extends WDIOReporter {
constructor(options) {
/*
* デフォルトで出力ストリームに書き込むようにレポーターを設定する
*/
options = Object.assign(options, { stdout: true })
super(options)
}
onTestPass(test) {
this.write(`Congratulations! Your test "${test.title}" passed 👏`)
}
}
このレポーターを使用するには、設定のreporter
プロパティに割り当てるだけです。
あなたのwdio.conf.js
ファイルは次のようになるはずです:
import CustomReporter from './reporter/my.custom.reporter'
export const config = {
// ...
reporters: [
/**
* インポートしたレポータークラスを使用
*/
[CustomReporter, {
someOption: 'foobar'
}],
/**
* レポーターへの絶対パスを使用
*/
['/path/to/reporter.js', {
someOption: 'foobar'
}]
],
// ...
}
レポーターをNPMに公開して、誰もが使えるようにすることもできます。パッケージ名は他のレポーターと同様にwdio-<reportername>-reporter
のようにし、wdio
やwdio-reporter
などのキーワードでタグ付けしてください。
イベントハンドラー
テスト中に発生するいくつかのイベントに対してイベントハンドラーを登録できます。以下のすべてのハンドラーは、現在の状態と進行状況に関する有用な情報を含むペイロードを受け取ります。
これらのペイロードオブジェクトの構造はイベントによって異なりますが、フレームワーク(Mocha、Jasmine、Cucumber)間で統一されています。カスタムレポーターを実装すると、すべてのフレームワークで動作するはずです。
以下のリストには、レポータークラスに追加できるすべてのメソッドが含まれています:
import WDIOReporter from '@wdio/reporter'
export default class CustomReporter extends WDIOReporter {
onRunnerStart() {}
onBeforeCommand() {}
onAfterCommand() {}
onSuiteStart() {}
onHookStart() {}
onHookEnd() {}
onTestStart() {}
onTestPass() {}
onTestFail() {}
onTestSkip() {}
onTestEnd() {}
onSuiteEnd() {}
onRunnerEnd() {}
}
メソッド名はかなり自明です。
特定のイベントで何かを出力するには、親クラスWDIOReporter
によって提供されるthis.write(...)
メソッドを使用してください。これは内容をstdout
またはログファイル(レポーターのオプションによる)にストリーミングします。
import WDIOReporter from '@wdio/reporter'
export default class CustomReporter extends WDIOReporter {
onTestPass(test) {
this.write(`Congratulations! Your test "${test.title}" passed 👏`)
}
}
テスト実行を遅らせることはできないことに注意してください。
すべてのイベントハンドラは同期的なルーチンを実行 する必要があります(そうしないと競合状態に陥る可能性があります)。
サンプルセクションをぜひ確認してください。そこには各イベントのイベント名を出力するカスタムレポーターの例があります。
コミュニティにとって有用なカスタムレポーターを実装した場合は、ぜひプルリクエストを送ってください。そうすれば、そのレポーターを一般に公開することができます!
また、Launcher
インターフェースを介してWDIO testrunnerを実行する場合、次のようにカスタムレポーターを関数として適用することはできません:
import Launcher from '@wdio/cli'
import CustomReporter from './reporter/my.custom.reporter'
const launcher = new Launcher('/path/to/config.file.js', {
// これは動作しません、CustomReporterはシリアライズできないため
reporters: ['dot', CustomReporter]
})
isSynchronised
までの待機
レポーターがデータを報告するために非同期操作を実行する必要がある場合(例:ログファイルやその他のアセットのアップロード)、カスタムレポーターのisSynchronised
メソッドをオーバーライドして、すべての処理が完了するまでWebdriverIOランナーを待機させることができます。この例は@wdio/sumologic-reporter
で見ることができます:
export default class SumoLogicReporter extends WDIOReporter {
constructor (options) {
// ...
this.unsynced = []
this.interval = setInterval(::this.sync, this.options.syncInterval)
// ...
}
/**
* isSynchronisedメソッドをオーバーライド
*/
get isSynchronised () {
return this.unsynced.length === 0
}
/**
* ログファイルを同期
*/
sync () {
// ...
request({
method: 'POST',
uri: this.options.sourceAddress,
body: logLines
}, (err, resp) => {
// ...
/**
* 転送されたログをログバケットから削除
*/
this.unsynced.splice(0, MAX_LINES)
// ...
}
}
}