跳至主要內容

自訂報表

您可以為 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,並使用 wdiowdio-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-pluginwdio-reporter
  • main 項目應 export 報表的執行個體
  • 報表範例:@wdio/dot-service

遵循建議的命名模式允許按名稱新增服務

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

將發佈的服務新增至 WDIO CLI 和文件

我們非常感謝每個可以幫助其他人執行更好測試的新外掛程式!如果您建立了這樣的外掛程式,請考慮將其新增至我們的 CLI 和文件中,以便更容易找到。

請透過下列變更提出提取要求

  • 將您的服務新增至 CLI 模組中支援的報表清單
  • 增強報表清單,以便將您的文件新增至官方 Webdriver.io 頁面

歡迎!我能幫上什麼忙嗎?

WebdriverIO AI Copilot