Отчет о огурцах HTML с помощью Транспортера
Я использую Транспортир с огурцом (js). Я хотел бы генерировать файлы отчетов так же, как с версией Cucumber-JVM. Я видел примеры при использовании Транспортера с Жасмином, но практически ничего с Огурцом.
Как вы создаете отчеты при использовании этой конфигурации?
Конечная цель - опубликовать этот отчет в Jenkins или где угодно, если они напрямую сгенерированы в HTML.
Спасибо!
Ответы
Ответ 1
С последней версией транспортиратора (начиная с версии 1.5.0) теперь вы можете создать отчет JSON. Когда я задал этот вопрос около 7 месяцев назад, этой функции там не было.
Все, что вам нужно сделать, это добавить это в файл protractor-config.json.
resultJsonOutputFile: 'report.json'
Где report.json - это местоположение выходного файла.
После этого вы можете использовать protractor-cucumber-junit (https://www.npmjs.com/package/protractor-cucumber-junit), cucumberjs-junitxml (https://github.com/sonyschan/cucumberjs-junitxml) или что-то подобное, чтобы преобразовать файл JSON в действительный XML файл, который может отображать Jenkins.
$ cat report.json | ./node_modules/.bin/cucumber-junit > report.xml
Надеюсь, что это поможет.
Ответ 2
Вы можете использовать cucumber-html-report для преобразования json-отчета в HTML. Добавьте cucumber-html-report в свой проект с помощью
$ npm install cucumber-html-report --save-dev
Если вы используете транспортир, вы можете добавить следующий код к hooks.js в
- Возьмите скриншот браузера после каждого неудачного сценария, который будет прикреплен к отчету json в разделе "После завершения".
- Запишите результаты теста в json файл, даже если ваше свойство форматирования окулирования говорит "красиво".
- Преобразование json-отчета в HTML, включая скриншоты для неудачных сценариев.
var outputDir = 'someDir';
this.After(function(scenario, callback) {
if (scenario.isFailed()) {
browser.takeScreenshot().then(function(base64png) {
var decodedImage = new Buffer(base64png, 'base64').toString('binary');
scenario.attach(decodedImage, 'image/png');
callback();
}, function(err) {
callback(err);
});
} else {
callback();
}
});
var createHtmlReport = function(sourceJson) {
var CucumberHtmlReport = require('cucumber-html-report');
var report = new CucumberHtmlReport({
source: sourceJson, // source json
dest: outputDir // target directory (will create if not exists)
});
report.createReport();
};
var JsonFormatter = Cucumber.Listener.JsonFormatter();
JsonFormatter.log = function(string) {
if (!fs.existsSync(outputDir)) {
fs.mkdirSync(outputDir);
}
var targetJson = outputDir + 'cucumber_report.json';
fs.writeFile(targetJson, string, function(err) {
if (err) {
console.log('Failed to save cucumber test results to json file.');
console.log(err);
} else {
createHtmlReport(targetJson);
}
});
};
this.registerListener(JsonFormatter);
Ответ 3
При использовании отчета cucumber-html в ответе на другой ответ вы можете столкнуться с проблемами в новых версиях отчета Cucumber/Protractor/Cucumber-html.
Симптомом является то, что index.html создается, но остается пустым в конце тестового прогона.
Это потому, что cucumber-html-report использует асинхронную запись файла, а транспортир не ждет завершения. (Мы использовали код, который имеет поразительное сходство с кодом в ответе.)
Это рабочая настройка:
в hooks.js держит часть снимка экрана одинаковой от другого ответа:
// Generate a screenshot at the end of each scenario (if failed; configurable to always)
cuke.After(function(scenario, done) {
browser.getProcessedConfig().then(config => {
if (!config.screenshots.onErrorOnly || scenario.isFailed()) {
return browser.driver.takeScreenshot().then(function(png) {
let decodedImage = new Buffer(png.replace(/^data:image\/(png|gif|jpeg);base64,/, ''), 'base64');
scenario.attach(decodedImage, 'image/png');
done();
});
} else {
done();
}
});
});
в файле protractor.conf.js:
var cucumberReportDirectory = 'protractor-report';
var jsonReportFile = cucumberReportDirectory + '/cucumber_report.json';
exports.config = {
cucumberOpts: {
format: 'json:./' + jsonReportFile,
},
onCleanUp: function () {
var CucumberHtmlReport = require('cucumber-html-report');
return CucumberHtmlReport.create({
source: jsonReportFile,
dest: cucumberReportDirectory,
title: 'OptiRoute - Protractor Test Run',
component: new Date().toString()
}).then(console.log).catch(console.log);
},
ignoreUncaughtExceptions: true,
untrackOutstandingTimeouts: true
};
Это только конфигурация, непосредственно связанная с огурцом-html-сообщением, остальное приправлено по вкусу.
Перед запуском тестов убедитесь, что каталог отчетов существует.
Поместив здесь создание отчета вместо того, чтобы присоединить его к слушателю Cucumber, Cucumber будет ждать завершения асинхронной операции до выхода.
Спасибо Ola за оригинальный ответ, я обнаружил асинхронную проблему (трудный путь) и думал, что смогу сэкономить время, когда найдет ту же проблему.
Ответ 4
Попробуйте код ниже, который работает для меня:
Вы можете использовать ниже плагин:
https://www.npmjs.com/package/cucumber-html-reporter
В package.json добавьте ниже зависимости, как показано ниже:
"cucumber-html-reporter": "^5.0.0"
хит команда, как показано ниже:
npm install
Добавьте ниже импорта в ваш cucumberconfig.ts
import * as reporter from "cucumber-html-reporter"
Теперь добавьте ниже ключ в cucumberconfig.ts
onComplete: () => {
//var reporter = require('cucumber-html-reporter');
var options = {
theme: 'bootstrap',
jsonFile: './cucumberreport.json',
output: './cucumberreportsss.html',
reportSuiteAsScenarios: true,
launchReport: true,
metadata: {
"App Version":"0.3.2",
"Test Environment": "STAGING",
"Browser": "Chrome 54.0.2840.98",
"Platform": "Windows 10",
"Parallel": "Scenarios",
"Executed": "Remote"
}
};
reporter.generate(options);
},
Полный файл выглядит как ниже:
import {Config} from 'protractor'
import * as reporter from "cucumber-html-reporter"
export let config: Config = {
directConnect:true,
// set to "custom" instead of cucumber.
framework: 'custom',
// path relative to the current config file
frameworkPath: require.resolve('protractor-cucumber-framework'),
seleniumAddress: 'http://localhost:4444/wd/hub',
// To run script without cucumber use below
//specs: ['typescriptscript.js'],
onComplete: () => {
//var reporter = require('cucumber-html-reporter');
var options = {
theme: 'bootstrap',
jsonFile: './cucumberreport.json',
output: './cucumberreportsss.html',
reportSuiteAsScenarios: true,
launchReport: true,
metadata: {
"App Version":"0.3.2",
"Test Environment": "STAGING",
"Browser": "Chrome 54.0.2840.98",
"Platform": "Windows 10",
"Parallel": "Scenarios",
"Executed": "Remote"
}
};
reporter.generate(options);
},
capabilities: {
'browserName': 'firefox',
'marionette': true,
//shardTestFiles: true,
},
SELENIUM_PROMISE_MANAGER: false,
specs: [
'../Features/*.feature' // accepts a glob
],
// Run feature file for cucumber use below
cucumberOpts: {
// require step definitions
require: [
'./stepDefination/*.js' // accepts a glob
],
format: 'json:cucumberreport.json',
},
jasmineNodeOpts: {
showColors: true,
},
};
Чтобы добавить неудачный скриншот, используйте код ниже
After(function(scenarioResult) {
let self = this;
if (scenarioResult.result.status === Status.FAILED) {
return browser.takeScreenshot()
.then(function (screenshot) {
const decodedImage = new Buffer(screenshot.replace(/^data:image\/png;base64,/, ''), 'base64');
self.attach(decodedImage, 'image/png');
});
}
});