1
votes

Comment générer un rapport consolidé tout en exécutant les scripts de test du rapporteur en parallèle?

J'ai 15 spécifications dans ma suite de rapporteur. Je souhaite exécuter ces scripts en parallèle et je souhaite générer un rapport consolidé à partir de cette exécution.

J'ai pu exécuter les scripts en parallèle en ajoutant la balise 'shardTestFiles: true "dans le fichier de configuration. Mais, je n'ai pas pu obtenir le rapport consolidé (obtenir le résultat de la dernière spécification exécutée uniquement dans le rapport).

Je recherche une solution pour générer un rapport consolidé tout en exécutant les scripts de rapporteur en parallèle.

Remarque: Utilisation de jasmine reporter pour générer un rapport.


1 commentaires

3 Réponses :


0
votes

Vous pouvez utiliserce rapporteur et fournir une option pour consolider vos résultats de test. Par exemple:

 var Jasmine2HtmlReporter = require('protractor-jasmine2-html-reporter');

    jasmine.getEnv().addReporter(
        new Jasmine2HtmlReporter({
            savePath: 'testReports/',
            screenshotsFolder: 'images',
            takeScreenshotsOnlyOnFailures: true,
            consolidateAll: true,
            consolidate: true,
            cleanDestination: false
        }));


1 commentaires

La configuration que vous avez mentionnée ci-dessus n'a pas consolidé le rapport. Mais, j'ai suivi une autre question de stackoverflow qui a été soulevée avec la même intention que la mienne: stackoverflow.com/questions/39336025/... Le fichier de configuration suivant avait ce que je voulais: github.com/tyaga001/multi-capability-reporting-protractor-/b‌ lob/…



0
votes

J'ai suivi l'approche mentionnée ci-dessous pour répondre à mon besoin.

  1. J'ai gardé le code ci-dessous dans la section onPrepare du fichier de configuration. Cela générera un rapport pour chaque spécification.

    afterLaunch: function afterLaunch() {
        var fs = require('fs');
        var output = '';
        fs.readdirSync('e2e/Results/').forEach(function(file){
          if(!(fs.lstatSync('e2e/Results/' + file).isDirectory()))
            output = output + fs.readFileSync('e2e/Results/' + file);
        });
        fs.writeFileSync('e2e/Results/RegressionTestReport.html', output, 'utf8');
      }
    

    Et gardé le code suivant dans la section afterLaunch qui consolidera tous les rapports générés dans la section onPrepare:

    onPrepare() {
    return new Promise(function (fulfill, reject) {
            browser.getCapabilities().then(function (value) {
              reportName = value.get('webdriver.remote.sessionid') + '_' + value.get('browserName') + '_' + Math.floor(Math.random()*1E16); // eslint-disable-line
              jasmine.getEnv().addReporter(
                new Jasmine2HtmlReporter({
                  savePath: 'e2e/Results',
                  screenshotsFolder: 'images',
                  takeScreenshotsOnlyOnFailures: true,
                  consolidate: true,
                  consolidateAll: true,
                  cleanDestination: false,
                  fileName: "my-report.html",
                  fileName: "regression-test-report.html",
                  fileNamePrefix: reportName,
                })
              );
              fulfill();
            })
          });
        });
    },
    

Défi rencontré après la configuration ci-dessus: j'ai pu consolider le rapport via une exécution parallèle en écrivant la configuration ci-dessus dans le fichier de configuration. Mais, si j'exécute le script une deuxième fois, le rapport le consolidera également (ce que je ne veux pas faire). Faire de la balise «cleanDestination: true» supprimait chaque spécification une fois son exécution terminée. Donc, cela n'a pas fonctionné.

Comment j'ai résolu ce défi? : J'exécutais le script dans jenkins en utilisant un script shell. J'ai donc écrit la commande shell 'rm -fr e2e / Results' pour supprimer le dossier du rapport avant l'exécution du script. Ainsi, le rapport sera supprimé à chaque fois et un nouveau rapport consolidé sera généré avec la dernière exécution.


0 commentaires

0
votes

J'ai essayé le protractor-jasmine2-html-reporter combiné avec des suggestions dans la réponse liée mais je n'ai pas aimé la sortie. J'aime la sortie générée par protractor-html-reporter-2 qui fonctionne sur le fichier xml produit par jasmine-reporters . Mais cela n'a aucune option pour travailler avec des rapports générés par plusieurs instances de navigateurs. Après avoir échoué à trouver une solution idéale, j'ai fini par faire ce qui suit dans le fichier de config js du rapporteur:

// add relevant packages in package.json
'use strict';
const HTMLReport = require('protractor-html-reporter-2');
const jasmineReporters = require('jasmine-reporters');
const moment = require('moment');
const os = require('os');
const xmldoc = require('xmldoc');
...
const DATE_FORMAT = 'YYYYMMDD-HHmmss-SSS'; // use any other format that gives unique timestamp
const reportDir = path.join(__dirname, '../report');
...
exports.config = {
    ...
    framework: 'jasmine',
    capabilities: {
        browserName: 'chrome',
        maxInstances: 2,
        shardTestFiles: true,
    },
    beforeLaunch: async function () {
        // clean up report directory
        fs.emptyDirSync(reportDir);
    }, 
    onPrepare: async function () {
         const NOW = moment().format(DATE_FORMAT);
         const reportName = 'index-' + NOW;
         jasmine.getEnv().addReporter(new jasmineReporters.JUnitXmlReporter({
             consolidateAll: true,
             savePath: reportDir,
             filePrefix: reportName,
         }));
    },
    onComplete: async function () {
        // do something after each instance of browser is closed
    },
    afterLaunch: async function (exitCode) {
        // do something after ALL instances of browser are closed
        await consolidateJasmineXmlReports();
    },
    ...     
},
...
async function consolidateJasmineXmlReports() {
    // there may be better ways to write xml out but this works for me
    const files = fs.readdirSync(reportDir).filter(fn => fn.endsWith('.xml'));
    let disabledSum = 0;
    let errorsSum = 0;
    let failuresSum = 0;
    let testsSum = 0;
    let timeSum = 0;
    const allTestSuiteNodes = [];
    for (const file of files) {
        const pathToXml = reportDir + path.sep + file;
        console.log('Reading xml report file: ' + pathToXml);
        const xml = fs.readFileSync(pathToXml);
        const xmlDoc = new xmldoc.XmlDocument(xml);
        const disabled = parseInt(xmlDoc.attr.disabled);
        const errors = parseInt(xmlDoc.attr.errors);
        const failures = parseInt(xmlDoc.attr.failures);
        const tests = parseInt(xmlDoc.attr.tests);
        const time = parseFloat(xmlDoc.attr.time);
        disabledSum += disabled;
        errorsSum += errors;
        failuresSum += failures;
        testsSum += tests;
        timeSum += time;

        const testSuiteNodes = xmlDoc.childrenNamed('testsuite');
        allTestSuiteNodes.push(testSuiteNodes);
    }

    let startXml = `<?xml version="1.0" encoding="UTF-8" ?>`;
    startXml += `<testsuites disabled="` + disabledSum + `" errors="` + errorsSum + `" failures="` + failuresSum + `" tests="` + testsSum + `" time="` + timeSum + `">`;
    const endXml = '</testsuites>';
    allTestSuiteNodes.push(endXml);
    const finalXml = startXml + allTestSuiteNodes.join('\n');
    fs.writeFileSync(reportDir + path.sep + 'consolidated.xml', finalXml, 'utf8');
        
    const testConfig = {            
        outputPath: reportDir,
        outputFilename: 'consolidated',
        ...
    };

    new HTMLReport().from(reportDir + path.sep + 'consolidated.xml', testConfig);
}

Nous utilisons Jenkins pour exécuter les tests et le rapport créé par ci-dessus s'affiche bien dans Jenkins et apparaît également avec précision sur le rapport affiché par le plugin Open Blue Ocean Jenkins .

Voir également:


0 commentaires