WDIO CucumberJS JSON Reporter

A WDIO reporter that creates CucumberJS JSON files for WebdriverIO v8 and up.

What does it do
This reporter will generate a Cucumber JSON file for each feature that is being tested. The JSON file can be used with whatever report you want to use like for example multiple-cucumber-html-reporter.
It will also add metadata about the running instance to the feature file and last but not least, it will give you the opportunity to add attachments to the JSON output.
Installation
The easiest way is to keep wdio-cucumberjs-json-reporter
as a devDependency in your package.json
.
{
"devDependencies": {
"wdio-cucumberjs-json-reporter": "^5.0.0"
}
}
You can simple do it by:
npm install wdio-cucumberjs-json-reporter --save-dev
so it will automatically be added to your package.json
Instructions on how to install WebdriverIO
can be found here.
Configuration
Configure the output directory and the language in your wdio.conf.js file:
export const config = {
reporters: [
'cucumberjs-json',
[ 'cucumberjs-json', {
jsonFolder: '.tmp/new/',
language: 'en',
},
],
],
}
DON'T USE BOTH WAYS OF ADDING THE REPORTER, THIS IS JUST AN EXAMPLE!
Options
jsonFolder
- Type:
String
- Mandatory: No
- Default:
.tmp/json/
The directory where the JSON files, generated by this report, will be stored, relative from where the script is started.
N.B.: If you use a npm script from the command line, like for example npm run test
the jsonFolder
will be relative from the path
where the script is executed. Executing it from the root of your project will also create the jsonFolder
in the root of you project.
language
- Type:
String
- Mandatory: No
- Default:
en
The language in which the Gherkin scenarios are written (defaults to English). The list of language codes and its keywords can be found here.
disableHooks
- Type:
boolean
- Mandatory: No
- Default:
false
Hook details will not be part of generation if this property sets to true
.
reportFilePerRetry
- Type:
boolean
- Mandatory: No
- Default:
true
When a spec is retried the report will be appended to the existing report file from the previous tries if this property is set to false
.
Example:
['cucumberjs-json', { jsonFolder: '.tmp/new/', language: 'en', disableHooks:true}]
Metadata
Note:
This is currently not supported if you are using WebdriverIO V6, WebdriverIO V5 still supports this and WebdriverIO V7 supports it again
As said, this report can automatically store the metadata of the current machine / device the feature has been executed on.
To customize this you can add it by adding the following object to your capabilities
export const config = {
capabilities: [
{
browserName: 'chrome',
'cjson:metadata': {
browser: {
name: 'chrome',
version: '58',
},
app: {
name: 'name.of.app.ipa',
version: '1.2.3',
},
device: 'MacBook Pro 15',
platform: {
name: 'OSX',
version: '10.12.6'
}
},
},
],
};
The metadata object needs to have the cjson
prefix, otherwise it will not work!
Metadata values
metadata.app.name
e.g.: The name of the app.
metadata.app.version
e.g.: The version of the app.
metadata.browser.name
- Type:
string
- Possible values:
internet explorer | edge | chrome | firefox | safari
metadata.browser.version
e.g.: The version of the browser, this can be added manual or retrieved during the execution of the tests to get the exact version number.
metadata.device
e.g.: A name that represents the type of device. For example, if you run it on a virtual machine, you can place it here Virtual Machine
,
or the name of the mobile, like for example iPhone 7 Plus
.
metadata.platform.name
- Type:
string
- Possible values:
windows | osx | linux | ubuntu | android | ios
metadata.platform.version
e.g.: The version of the platform
If you don't provide the browser
-object in the metadata, this module will automatically determine it for you. It will always override it with the most recent value it can determine.
If you don't provide the device
and or the platform
-object it will be defaulted for you to not known
If you don't provide a browser.name
or a browser.version
the module will try to determine this automatically.
Attachment
You have the option to attach data to the JSON file in all these hooks / steps:
- Before(All)
- After(All)
- Given
- When
- Then
- And
The only thing you need to provide is the following code in your step files.
For ES Modules (ESM)
import cucumberJson from 'wdio-cucumberjs-json-reporter';
cucumberJson.attach('just a string');
cucumberJson.attach('just a second string', 'text/plain');
cucumberJson.attach({"json-string": true}, 'application/json');
cucumberJson.attach(await browser.takeScreenshot(), 'image/png');
For CommonJS (CJS)
const { attach } = require("wdio-cucumberjs-json-reporter");
attach('just a string');
attach('just a second string', 'text/plain');
attach({"json-string": true}, 'application/json');
attach(await browser.takeScreenshot(), 'image/png');
Use it with multiple-cucumber-html-reporter
The previous module for WebdriverIO V4, wdio-multiple-cucumber-html-reporter,
had a build in connection with the multiple-cucumber-html-reporter-module. This is not the case for this
reporter because the new setup of WebdriverIO V5 is based on a instance which doesn't allow me to use the onPrepare
and onComplete
hook.
If you still want to use the multiple-cucumber-html-reporter-module you can add the following to your config file.
-
Install the module with
npm install multiple-cucumber-html-reporter --save-dev
-
Add this to your configuration file
import fs from 'node:fs/promises'
import { generate } from 'multiple-cucumber-html-reporter'
export const config = {
onPrepare: () => {
return fs.rm('.tmp/', { recursive: true });
},
onComplete: () => {
generate({
jsonDir: '.tmp/json/',
reportPath: '.tmp/report/',
});
}
}
Older WebdriverIO Versions
THIS MODULE CAN ONLY WORK WITH WebdriverIO V8+!
For V6 please check the docs here and use version 2.0.4
For V5 please check the docs here and use version 1.3.0
THIS MODULE IS NOT A REPLACEMENT OF wdio-multiple-cucumber-html-reporter. THAT MODULE ONLY SUPPORTS WEBDRIVERIO V4 AND ALSO CREATES A REPORT. THIS MODULE ONLY CREATES A JSON, NO REPORT!!