メインコンテンツにスキップ

カスタムレポーター

WDIOテストランナー用に、ニーズに合わせて調整された独自のカスタムレポーターを作成できます。そして、それは簡単です!

必要なのは、テストからメッセージを受信できるように、@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プロパティに割り当てるだけです。

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'
}]
],
// ...
}

また、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テストランナーを実行する場合、次のようにカスタムレポーターを関数として適用することはできません。

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まで待機

レポーターがデータを報告するために非同期操作(ログファイルやその他のアセットのアップロードなど)を実行する必要がある場合、カスタムレポーターで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でレポーターを公開する

WebdriverIOコミュニティがレポーターをより簡単に利用および発見できるようにするには、次の推奨事項に従ってください。

  • サービスは、この命名規則を使用する必要があります:wdio-*-reporter
  • NPMキーワードを使用します:wdio-pluginwdio-reporter
  • mainエントリは、レポーターのインスタンスをexportする必要があります。
  • レポーターの例:@wdio/dot-service

推奨される命名パターンに従うことで、名前でサービスを追加できます。

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

公開されたサービスをWDIO CLIとドキュメントに追加する

他の人がより良いテストを実行するのに役立つ可能性のある新しいプラグインをすべて高く評価しています!そのようなプラグインを作成した場合は、CLIとドキュメントに追加して、見つけやすくすることを検討してください。

次の変更を加えてプルリクエストを上げてください。

ようこそ! どうすればお手伝いできますか?

WebdriverIO AI Copilot