web-dev-qa-db-fra.com

Rapport HTML concombre avec rapporteur

J'utilise le rapporteur avec concombre (js). J'aimerais générer des fichiers de rapport, comme avec la version Cucumber-JVM. J'ai vu des exemples d'utilisation de Protractor avec Jasmine, mais pratiquement rien avec Cucumber.

Comment générez-vous des rapports lorsque vous utilisez cette configuration?

L'objectif final est de publier ce rapport dans Jenkins, ou ailleurs, s'il est généré directement en HTML.

Merci!

13
Pedro Lopez

Avec la dernière version de rapporteur (à partir de la version 1.5.0), vous pouvez désormais générer un rapport JSON. Quand j'ai posé cette question il y a environ 7 mois, cette fonctionnalité n'était pas là.

Tout ce que vous avez à faire est d’ajouter ceci à votre fichier protractor-config.json.

resultJsonOutputFile: 'report.json'

Où report.json est l'emplacement du fichier de sortie.

Une fois que vous avez cela, vous pouvez utiliser rapporteur-concombre-junit ( https://www.npmjs.com/package/protractor-cucumber-junit ), cucumberjs-junitxml ( https://github.com/sonyschan/cucumberjs-junitxml ) ou quelque chose de similaire pour transformer le fichier JSON en un fichier XML valide que Jenkins peut afficher.

$ cat report.json | ./node_modules/.bin/cucumber-junit > report.xml

J'espère que cela t'aides.

11
Pedro Lopez

Vous pouvez utiliser cucumber-html-report pour convertir un rapport json en HTML. Ajoutez concombre-html-report à votre projet avec

$ npm install cucumber-html-report --save-dev

Si vous utilisez rapporteur, vous pouvez ajouter le code suivant à hooks.js to

  • Effectuez une capture d'écran du navigateur après chaque scénario ayant échoué pour être attachée au rapport json dans le raccroché.
  • Ecrivez les résultats du test dans un fichier JSON même si la propriété de format opte pour le concombre dit "jolie".
  • Convertissez le rapport json en HTML, y compris les captures d'écran des scénarios ayant échoué.

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);

7
Ola

Lorsque vous utilisez cucumber-html-report de la manière indiquée par l’autre réponse, vous pouvez rencontrer des problèmes avec les versions plus récentes de Cucumber/Protractor/Cucumber-html-report.

Le symptôme est que le fichier index.html est créé mais laissé vide à la fin du test.

Cela s'explique par le fait que cucumber-html-report utilise une écriture de fichier asynchrone et que le rapporteur n'attend pas son achèvement. (Nous utilisions un code qui ressemble étrangement au code dans la réponse.)

Ceci est une configuration de travail:

dans hooks.js, la partie de la capture d’écran reste identique à celle de l’autre réponse:

// 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();
        }
    });
});

dans 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
};

Ce n'est que la configuration directement liée à concombre-html-rapport, le reste est assaisonné au goût.

Assurez-vous que le répertoire de rapport existe avant d'exécuter les tests.

En mettant la création de rapport ici au lieu de l'attacher en tant qu'écouteur Cucumber, Cucumber attendra que l'opération asynchrone soit terminée avant de quitter.

Merci à Ola pour la réponse originale, j'ai découvert le problème asynchrone (à la dure) et je pensais pouvoir faire gagner du temps à quelqu'un qui trouve le même problème.

1
Hopasaurus