-
-
Save acdcjunior/c1c7d7ec95060452dd9caff52813d319 to your computer and use it in GitHub Desktop.
| const formatter = function (options) { | |
| const cucumber = require(options.cucumberLibPath); | |
| const common = require('./cucumberjs_formatter_common.js'); | |
| //Need to create an instance to see the summary in the console output | |
| const formatter = new cucumber.Formatter(options); | |
| const summaryFormatter = new cucumber.SummaryFormatter(options); | |
| let currentFeature = ''; | |
| let featureIndex = 0; | |
| /** | |
| * test-run == Feature == testSuite | |
| * test-case == Scenario == testSuite | |
| * test-step == Step == test | |
| */ | |
| options.eventBroadcaster.on('test-run-started', logFeatureStarted.bind()) | |
| options.eventBroadcaster.on('test-run-finished', logFeatureFinished.bind()) | |
| options.eventBroadcaster.on('test-case-started', logTestCaseStarted.bind()) | |
| options.eventBroadcaster.on('test-case-finished', logTestCaseFinished.bind()) | |
| options.eventBroadcaster.on('test-step-started', logStepStarted.bind()) | |
| options.eventBroadcaster.on('test-step-finished', logStepFinished.bind()) | |
| function logStepStarted(event) { | |
| const data = formatter.eventDataCollector.getTestCaseData(event.testCase.sourceLocation); | |
| if (data.pickle.steps[event.index] == null) return; | |
| const stepName = data.pickle.steps[event.index].text; | |
| const stepLine = data.pickle.steps[event.index].locations[0].line; | |
| console.log( | |
| `##teamcity[testStarted name = 'Step: ${common.escape(stepName)}' timestamp='${common.getCurrentDate()}' captureStandardOutput = 'true' locationHint='file:///${getUri() + | |
| ':' + | |
| stepLine}']`); | |
| } | |
| function logStepFinished(event) { | |
| const data = formatter.eventDataCollector.getTestCaseData(event.testCase.sourceLocation); | |
| if (data.pickle.steps[event.index] == null) return; | |
| const stepName = data.pickle.steps[event.index].text; | |
| const result = event.result.status; | |
| let duration = event.result.duration | |
| if (duration === undefined) duration = 0 | |
| switch (result) { | |
| case 'undefined': | |
| console.log(`##teamcity[testFailed name = 'Step: ${common.escape(stepName)}' timestamp='${common.getCurrentDate()}' message='' ]`); | |
| break; | |
| case 'ambiguous': | |
| case 'failed': | |
| console.log(`##teamcity[testFailed name = 'Step: ${common.escape(stepName)}' timestamp='${common.getCurrentDate()}' details='${common.escape( | |
| event.result.exception.stack)}' message='' ]`); | |
| break; | |
| case 'skipped': | |
| console.log(`##teamcity[testIgnored name = 'Step: ${common.escape(stepName)}' timestamp='${common.getCurrentDate()}']`); | |
| break; | |
| } | |
| console.log(`##teamcity[testFinished name = 'Step: ${common.escape(stepName)}' timestamp='${common.getCurrentDate()}' duration='${duration}']`); | |
| } | |
| function getFeatureName() { | |
| const length = Object.keys(formatter.eventDataCollector.gherkinDocumentMap).length | |
| const featureFileName = Object.keys(formatter.eventDataCollector.gherkinDocumentMap)[featureIndex] | |
| if (formatter.eventDataCollector.gherkinDocumentMap[featureFileName].feature === undefined) return null | |
| return formatter.eventDataCollector.gherkinDocumentMap[featureFileName].feature.name | |
| } | |
| function getUri() { | |
| return formatter.cwd + '/' + getFeatureFile() | |
| } | |
| function getFeatureFile() { | |
| return common.escape(Object.keys(formatter.eventDataCollector.gherkinDocumentMap)[featureIndex]); | |
| } | |
| function logFeatureStarted() { | |
| //For cases when feature file exists but contains no content | |
| if (getFeatureName() == null) return; | |
| if (currentFeature === '') { | |
| currentFeature = getFeatureName() | |
| console.log(`##teamcity[enteredTheMatrix timestamp='${common.getCurrentDate()}']\n`) | |
| console.log(`##teamcity[customProgressStatus testsCategory = 'Scenarios' count = '0' timestamp='${common.getCurrentDate()}']`) | |
| } | |
| console.log( | |
| `##teamcity[testSuiteStarted name='Feature: ${common.escape(currentFeature)}' timestamp='${common.getCurrentDate()}' locationHint='file:///${getUri()}']`); | |
| } | |
| function logFeatureFinished() { | |
| console.log(`##teamcity[testSuiteFinished name='Feature: ${common.escape(currentFeature)}' timestamp='${common.getCurrentDate()}']`); | |
| console.log(`##teamcity[customProgressStatus testsCategory = '' count = '0' timestamp = '${common.getCurrentDate()}']`) | |
| featureIndex++; | |
| } | |
| function logTestCaseStarted({sourceLocation}) { | |
| const data = formatter.eventDataCollector.getTestCaseData(sourceLocation); | |
| const featureName = data.gherkinDocument.feature.name | |
| if (featureName !== currentFeature) { | |
| logFeatureFinished() | |
| currentFeature = featureName | |
| logFeatureStarted() | |
| } | |
| console.log(`##teamcity[customProgressStatus type = 'testStarted' timestamp='${common.getCurrentDate()}']`); | |
| console.log(`##teamcity[testSuiteStarted name='Scenario: ${common.escape( | |
| data.pickle.name)}' timestamp='${common.getCurrentDate()}' locationHint='file:///${getUri() + | |
| ':' + | |
| sourceLocation.line}']`); | |
| } | |
| function logTestCaseFinished({sourceLocation}) { | |
| const data = formatter.eventDataCollector.getTestCaseData(sourceLocation); | |
| const result = data.testCase.result.status; | |
| switch (result) { | |
| case 'passed': | |
| console.log(`##teamcity[customProgressStatus type = 'testFinished' timestamp='${common.getCurrentDate()}']`) | |
| break; | |
| case 'ambiguous': | |
| case 'failed': | |
| console.log(`##teamcity[customProgressStatus type = 'testFailed' timestamp='${common.getCurrentDate()}']`) | |
| break; | |
| case 'skipped': | |
| console.log(`##teamcity[customProgressStatus type = 'testSkipped' timestamp='${common.getCurrentDate()}']`) | |
| break; | |
| } | |
| console.log(`##teamcity[testSuiteFinished name='Scenario: ${common.escape(data.pickle.name)}' timestamp='${common.getCurrentDate()}']`); | |
| } | |
| }; | |
| module.exports = formatter |
| const formatter = function (options) { | |
| const cucumber = require(options.cucumberLibPath); | |
| const common = require('./cucumberjs_formatter_common.js'); | |
| //Need to create an instance to see the summary in the console output | |
| const formatter = new cucumber.Formatter(options); | |
| const summaryFormatter = new cucumber.SummaryFormatter(options); | |
| let currentFeature = ''; | |
| let featureIndex = 0; | |
| /** | |
| * test-run == Feature == testSuite | |
| * test-case == Scenario == testSuite | |
| * test-step == Step == test | |
| */ | |
| options.eventBroadcaster.on('test-run-started', logFeatureStarted.bind()) | |
| options.eventBroadcaster.on('test-run-finished', logFeatureFinished.bind()) | |
| options.eventBroadcaster.on('test-case-started', logTestCaseStarted.bind()) | |
| options.eventBroadcaster.on('test-case-finished', logTestCaseFinished.bind()) | |
| options.eventBroadcaster.on('test-step-started', logStepStarted.bind()) | |
| options.eventBroadcaster.on('test-step-finished', logStepFinished.bind()) | |
| function logStepStarted(event) { | |
| const testCaseAttempt = formatter.eventDataCollector.getTestCaseAttempt(event.testCase || event) | |
| if (testCaseAttempt.pickle.steps[event.index] == null) return; | |
| const stepName = testCaseAttempt.pickle.steps[event.index].text; | |
| const stepLine = testCaseAttempt.pickle.steps[event.index].locations[0].line; | |
| console.log( | |
| `##teamcity[testStarted name = 'Step: ${common.escape(stepName)}' timestamp='${common.getCurrentDate()}' captureStandardOutput = 'true' locationHint='file:///${getUri() + | |
| ':' + | |
| stepLine}']`); | |
| } | |
| function logStepFinished(event) { | |
| const testCaseAttempt = formatter.eventDataCollector.getTestCaseAttempt(event.testCase || event) | |
| if (testCaseAttempt.pickle.steps[event.index] == null) return; | |
| const stepName = testCaseAttempt.pickle.steps[event.index].text; | |
| const result = event.result.status; | |
| let duration = event.result.duration | |
| if (duration === undefined) duration = 0 | |
| switch (result) { | |
| case 'undefined': | |
| console.log(`##teamcity[testFailed name = 'Step: ${common.escape(stepName)}' timestamp='${common.getCurrentDate()}' message='' ]`); | |
| break; | |
| case 'ambiguous': | |
| case 'failed': | |
| console.log(`##teamcity[testFailed name = 'Step: ${common.escape(stepName)}' timestamp='${common.getCurrentDate()}' details='${common.escape( | |
| event.result.exception.stack)}' message='' ]`); | |
| break; | |
| case 'skipped': | |
| console.log(`##teamcity[testIgnored name = 'Step: ${common.escape(stepName)}' timestamp='${common.getCurrentDate()}']`); | |
| break; | |
| } | |
| console.log(`##teamcity[testFinished name = 'Step: ${common.escape(stepName)}' timestamp='${common.getCurrentDate()}' duration='${duration}']`); | |
| } | |
| function getFeatureName() { | |
| const length = Object.keys(formatter.eventDataCollector.gherkinDocumentMap).length | |
| const featureFileName = Object.keys(formatter.eventDataCollector.gherkinDocumentMap)[featureIndex] | |
| if (formatter.eventDataCollector.gherkinDocumentMap[featureFileName].feature === undefined) return null | |
| return formatter.eventDataCollector.gherkinDocumentMap[featureFileName].feature.name | |
| } | |
| function getUri() { | |
| return formatter.cwd + '/' + getFeatureFile() | |
| } | |
| function getFeatureFile() { | |
| return common.escape(Object.keys(formatter.eventDataCollector.gherkinDocumentMap)[featureIndex]); | |
| } | |
| function logFeatureStarted() { | |
| //For cases when feature file exists but contains no content | |
| if (getFeatureName() == null) return; | |
| if (currentFeature === '') { | |
| currentFeature = getFeatureName() | |
| console.log(`##teamcity[enteredTheMatrix timestamp='${common.getCurrentDate()}']\n`) | |
| console.log(`##teamcity[customProgressStatus testsCategory = 'Scenarios' count = '0' timestamp='${common.getCurrentDate()}']`) | |
| } | |
| console.log( | |
| `##teamcity[testSuiteStarted name='Feature: ${common.escape(currentFeature)}' timestamp='${common.getCurrentDate()}' locationHint='file:///${getUri()}']`); | |
| } | |
| function logFeatureFinished() { | |
| console.log(`##teamcity[testSuiteFinished name='Feature: ${common.escape(currentFeature)}' timestamp='${common.getCurrentDate()}']`); | |
| console.log(`##teamcity[customProgressStatus testsCategory = '' count = '0' timestamp = '${common.getCurrentDate()}']`) | |
| featureIndex++; | |
| } | |
| function logTestCaseStarted(event) { | |
| const testCaseAttempt = formatter.eventDataCollector.getTestCaseAttempt(event); | |
| const featureName = testCaseAttempt.gherkinDocument.feature.name | |
| if (featureName !== currentFeature) { | |
| logFeatureFinished() | |
| currentFeature = featureName | |
| logFeatureStarted() | |
| } | |
| console.log(`##teamcity[customProgressStatus type = 'testStarted' timestamp='${common.getCurrentDate()}']`); | |
| console.log(`##teamcity[testSuiteStarted name='Scenario: ${common.escape( | |
| testCaseAttempt.pickle.name)}' timestamp='${common.getCurrentDate()}' locationHint='file:///${getUri() + | |
| ':' + | |
| event.sourceLocation.line}']`); | |
| } | |
| function logTestCaseFinished(event) { | |
| const testCaseAttempt = formatter.eventDataCollector.getTestCaseAttempt(event.testCase || event) | |
| const result = testCaseAttempt.result.status; | |
| switch (result) { | |
| case 'passed': | |
| console.log(`##teamcity[customProgressStatus type = 'testFinished' timestamp='${common.getCurrentDate()}']`) | |
| break; | |
| case 'ambiguous': | |
| case 'failed': | |
| console.log(`##teamcity[customProgressStatus type = 'testFailed' timestamp='${common.getCurrentDate()}']`) | |
| break; | |
| case 'skipped': | |
| console.log(`##teamcity[customProgressStatus type = 'testSkipped' timestamp='${common.getCurrentDate()}']`) | |
| break; | |
| } | |
| console.log(`##teamcity[testSuiteFinished name='Scenario: ${common.escape(testCaseAttempt.pickle.name)}' timestamp='${common.getCurrentDate()}']`); | |
| } | |
| }; | |
| module.exports = formatter |
thanks
Perfect, thank you!
Hi all
I have the same problem while running tests
Testing started at 3:21 PM ...
"C:\Program Files\nodejs\node.exe" C:\Workspace\projectName\apps\web\src\main\webapp\loe\tests\node_modules\cucumber\bin\cucumber-js C:\Workspace\projectName\apps\web\src\main\webapp\loe\tests\features\login.feature --format C:\Users\userName\AppData\Roaming\JetBrains\IntelliJIdea2020.1\plugins\CucumberJavaScript\lib\cucumberjs_formatter_v3.js --format-options "{"cucumberLibPath": "C:/Workspace/cxs-accelerators-portal/apps/web/src/main/webapp/loe/tests/node_modules/cucumber/lib"}" --format-options "{"colorsEnabled": true}" --require C:/Workspace/projectName/apps/web/src/main/webapp/loe/tests/features
TypeError: formatter.eventDataCollector.getTestCaseData is not a function
at logTestCaseStarted (C:\Users\userName\AppData\Roaming\JetBrains\IntelliJIdea2020.1\plugins\CucumberJavaScript\lib\cucumberjs_formatter_v3.js:89:47)
at EventEmitter.emit (events.js:327:22)
What is the resolution here?
Error: