कस्टम रिपोर्टर
आप 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'
}]
],
// ...
}
आप रिपोर्टर को एनपीएम में भी प्रकाशित कर सकते हैं ताकि हर कोई इसका उपयोग कर सके। पैकेज को अन्य रिपोर्टर wdio-<reportername>-reporter
की तरह नाम दें, और इसे wdio
या wdio-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
पर स्ट्रीम करता है, या लॉग फ़ाइल में (रिपोर्टर के विकल्पों के आधार पर)।
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
होने तक प्रतीक्षा करें
यदि आपके रिपोर्टर को डेटा की रिपोर्ट करने के लिए async संचालन निष्प ादित करना है (उदाहरण के लिए लॉग फ़ाइलों या अन्य संपत्तियों का अपलोड) तो आप अपने कस्टम रिपोर्टर में 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)
// ...
}
}
}
इस तरह रनर तब तक प्रतीक्षा करेगा जब तक कि सभी लॉग जानकारी अपलोड नहीं हो जाती।