自訂報表
您可以為 WDIO 測試執行器編寫自己的自訂報表,以滿足您的需求。而且這很容易!
您只需建立一個繼承自 @wdio/reporter
套件的節點模組,這樣它就可以接收來自測試的訊息。
基本設定應如下所示
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 👏`)
}
}
請注意,您不能以任何方式延遲測試執行。
所有事件處理常式都應執行同步常式(否則您會遇到競爭條件)。
請務必查看範例章節,您可以在其中找到一個範例自訂報表,該報表會針對每個事件列印事件名稱。
如果您實作了一個對社群有用的自訂報表,請隨時提出 Pull Request,以便我們可以公開此報表!
此外,如果您透過 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-plugin
、wdio-reporter
main
項目應export
報表的執行個體- 報表範例:
@wdio/dot-service
遵循建議的命名模式允許按名稱新增服務
// Add wdio-custom-reporter
export const config = {
// ...
reporter: ['custom'],
// ...
}
將發佈的服務新增至 WDIO CLI 和文件
我們非常感謝每個可以幫助其他人執行更好測試的新外掛程式!如果您建立了這樣的外掛程式,請考慮將其新增至我們的 CLI 和文件中,以便更容易找到。
請透過下列變更提出提取要求