Protractor: Reportero Junit

Creado en 28 ago. 2013  ·  42Comentarios  ·  Fuente: angular/protractor

Queremos ejecutar pruebas de transportador en Jenkins, por lo que sería muy útil si hubiera un reportero junit (como lo ha hecho karma) para que Jenkins pueda informar el estado de las pruebas.

feature request

Comentario más útil

¿Cómo hacer esto en su archivo de configuración de una manera ligeramente incómoda? He probado esto con el propio conjunto de pruebas de Protractor:

npm install jasmine-reporters

Su archivo de configuración:

require('jasmine-reporters');

jasmine.getEnv().addReporter(new jasmine.JUnitXmlReporter(
    'outputdir/', true, true));

// The main suite of Protractor tests.
exports.config = {
  seleniumServerJar: './selenium/selenium-server-standalone-2.35.0.jar',
  chromeDriver: './selenium/chromedriver',

  seleniumAddress: 'http://localhost:4444/wd/hub',

  // Spec patterns are relative to this directory.
  specs: [
    '*_spec.js'
  ],

  capabilities: {
    'browserName': 'chrome'
  },

  baseUrl: 'http://localhost:8000',
};

Todos 42 comentarios

Mis 2 centavos aquí: si usa Grunt como su herramienta de compilación, puede ejecutar sus pruebas de Transportador usando grunt-jasmine-node y configurarlo para obtener informes similares a JUnit.

¿Cómo hacer esto en su archivo de configuración de una manera ligeramente incómoda? He probado esto con el propio conjunto de pruebas de Protractor:

npm install jasmine-reporters

Su archivo de configuración:

require('jasmine-reporters');

jasmine.getEnv().addReporter(new jasmine.JUnitXmlReporter(
    'outputdir/', true, true));

// The main suite of Protractor tests.
exports.config = {
  seleniumServerJar: './selenium/selenium-server-standalone-2.35.0.jar',
  chromeDriver: './selenium/chromedriver',

  seleniumAddress: 'http://localhost:4444/wd/hub',

  // Spec patterns are relative to this directory.
  specs: [
    '*_spec.js'
  ],

  capabilities: {
    'browserName': 'chrome'
  },

  baseUrl: 'http://localhost:8000',
};

¿Acepta la ruta relativa o absoluta del directorio? La ruta absoluta funciona mientras que la ruta relativa no. He probado opciones como ../Informes pero no sirve de nada
jazmín.getEnv().addReporter(
new jasmine.JUnitXmlReporter('xmloutput', true, true));
},

explorado y funcionando, ignora mi último comentario

No fui lo suficientemente inteligente, así que esperaba que se creara la carpeta, pero de hecho, la carpeta debe crearse de antemano.

@juliemr ¿Cómo usarlo con dos instancias de Protractor ejecutándose en paralelo, por ejemplo, a través grunt-concurrent ? Es necesario para que podamos ejecutar pruebas en Firefox y Chrome al mismo tiempo, pero hará que un XML reemplace al otro, lo que confundirá a Jenkins.

¿Tal vez Protractor debería saber cómo funcionar en paralelo por razones como esa, de manera similar a lo que hace Karma?

@mzgol ¿Ha intentado hacer que cada objetivo se ejecute como una tarea simultánea que genere un informe junit xml diferente según la plataforma? Simplemente podría crear una nueva carpeta de salida basada en el nombre de destino.

También es posible que desee buscar objetivos de configuración múltiple en Jenkins que le permitan ejecutar sus pasos de compilación en paralelo, cada uno con un entorno limpio. También tiene características ingeniosas como compilaciones de piedra de toque y le permite acelerar la concurrencia mejor que gruñir.

¿Existe una configuración similar para mocha? (ya que no estoy usando Jasmine)

@mzgol Probé la sugerencia de jvandyke (gracias) y me funciona bien:

onPrepare: function(){
        require('jasmine-reporters');
        var capsPromise = browser.getCapabilities();
        capsPromise.then(function(caps){
            var browserName = caps.caps_.browserName.toUpperCase();
            var browserVersion = caps.caps_.version;
            var prePendStr = browserName + "-" + browserVersion + "-";
            jasmine.getEnv().addReporter(new
jasmine.JUnitXmlReporter("protractor_output", true, true,prePendStr));
        });
 },

Gracias. Su trabajo para mí también:

enPreparar: función(){
require('jazmín-reporteros');
var capsPromise = browser.getCapabilities();
capsPromise.then(función(mayúsculas){
var browserName = caps.caps_.browserName.toUpperCase();
var browserVersion = caps.caps_.version;
var prePendStr = browserName + "-" + browserVersion + "-";
jasmine.getEnv().addReporter(nuevo
jasmine.JUnitXmlReporter("protractor_output", true, true,prePendStr));
});
},

He creado un reportero html además de esto. porfavor, dejame saber tus comentarios
https://github.com/jintoppy/transportador-html-screenshot-reporter

¡Podría ser una idea agregar la creación de la carpeta a los documentos ya que también me tropecé con eso @tracycummins !

@juliemr Cansado de todas las opciones enumeradas en las muestras. me sale este error Cualquier sugerencia apreciada

/home/jack/prototipo/conf.js:19
jasmine.getEnv().addReporter(new jasmine.JUnitXmlReporter('xmloutput', true, true));
^
TypeError: indefinido no es una función
en exportaciones.config.onPrepare (/home/jack/prototype/conf.js:19:33)
en Runner.runFilenamesOrFns_ (/home/usr/lib/node_modules/protractor/lib/runner.js:64:9)
en Runner.runTestPreparers (/home/usr/lib/node_modules/protractor/lib/runner.js:91:8)
en runner.controlFlow.execute.then.jasmineNodeOpts (/home/usr/lib/node_modules/protractor/lib/frameworks/jasmine.js:39:12)
en webdriver.promise.ControlFlow.runInNewFrame_ (/home/usr/lib/node_modules/transportador/node_modules/selenium-webdriver/lib/webdriver/promise.js:1539:20)
en webdriver.promise.ControlFlow.runEventLoop_ (/home/usr/lib/node_modules/transportador/node_modules/selenium-webdriver/lib/webdriver/promise.js:1404:8)
en el envoltorio como _onTimeout
en Timer.listOnTimeout como ontimeout
==== tarea asíncrona ====
ejecutar preparadores de prueba
en Object.exports.run (/home/usr/lib/node_modules/protractor/lib/frameworks/jasmine.js:38:24)
en driverprovider_.setupEnv.then.then.then.testResult (/home/usr/lib/node_modules/protractor/lib/runner.js:233:28)
en _cumplido (/home/usr/lib/node_modules/transportador/node_modules/q/q.js:797:54)
en self.promiseDispatch.done (/home/usr/lib/node_modules/transportador/node_modules/q/q.js:826:30)
en Promise.promise.promiseDispatch (/home/usr/lib/node_modules/transportador/node_modules/q/q.js:759:13)
en /home/usr/lib/node_modules/transportador/node_modules/q/q.js:525:49
al ras (/home/usr/lib/node_modules/transportador/node_modules/q/q.js:108:17)
en proceso._tickCallback (node.js:423:13)
en Function.Module.runMain (module.js:499:11)


// Un archivo de configuración de ejemplo.
exportaciones.config = {
// La dirección de un servidor Selenium en ejecución.
dirección de selenio: ' http://localhost :4444/wd/hub',
tiempo de espera de todos los scripts: 30000,
// Capacidades que se pasarán a la instancia de webdriver.
capacidades: {
'nombre del navegador': 'firefox'
},

// Los patrones de especificaciones son relativos al trabajo actual directamente cuando
// se llama al transportador.
especificaciones: ['example_spec.js'],

// Opciones que se pasarán a Jasmine-node.
enPreparar: función () {
require('jazmín-reporteros');
jasmine.getEnv().addReporter(new jasmine.JUnitXmlReporter('xmloutput', true, true));
},

// Opciones que se pasarán a Jasmine-node.
jasmineNodeOpts: {
mostrarColores: verdadero,
intervalo de tiempo de espera predeterminado: 30000
}
};

hola @jkmurthy

Me encontré exactamente con el mismo problema. En la última versión de [email protected] , cambiaron el nombre del módulo. No hay documentación sobre esto, pero está en este archivo.

https://github.com/larrymyers/jasmine-reporters/blob/master/src/junit_reporter.js

  • Uso:

    • jasmine.getEnv().addReporter(nuevo jasmineReporters.JUnitXmlReporter(opciones);

Todavía no pude hacerlo funcionar como dice el módulo 'jasmineReporters' indefinido.

Así que cambié a la versión anterior de [email protected] , funcionó perfectamente. Asegúrese de crear el directorio al que se refiera como salida en las opciones del reportero.

La degradación de jasmine-reporters a 0.4.1 no funcionó
probado con
enPreparar: función () {
var folderName = (nueva Fecha()).toString().split(' ').splice(1, 4).join(' ');
var mkdirp = require('mkdirp');
var nuevaCarpeta = "./informes/" + nombreCarpeta;
require('jazmín-reporteros');

            mkdirp(newFolder, function(err) {
              if (err) {
                console.error(err);
              } else {
                jasmine.getEnv().addReporter(new jasmine.JUnitXmlReporter(newFolder, true, true));
              }
            });
          },

Sin suerte todavía

Este es definitivamente un problema para mí. Usando jasmine-reporters 2.0 obtengo
D:\HgBuild\TPSOneSearch\Unstable\Tyler.TPS.OneSearch\Tyler.TPS.Web.OneSearch\app
\prueba\e2e\oneSearchChromeConf.js:29
jasmine.getEnv().addReporter(nuevo jasmine.JUnitXmlReporter(uri, t
ruda, cierto, ''));
^
TypeError: undefined no es una función.

cambiar "nuevo jasmine.JUnitXmlReporter" a "jasmineReporters.JUnitXmlReporter" da como resultado jasmineReporters no está definido.

Si vuelvo a jasmine-reporters a 0.4.1, funciona espléndidamente.

jasmine-reporters 2.0 tiene una API diferente a la 1.x; no puedes simplemente actualizar a ciegas; ajusta tus invocaciones.

Mirando el comentario en el archivo junit_reporter.js para JUnitXmlReporter, configuré mi archivo conf de la siguiente manera:

onPrepare: función () {
require('jazmín-reporteros');
var opciones = {
savePath: 'alguna ruta de archivo',
consolidar: cierto,
useDotNotation: verdadero
};
jasmine.getEnv().addReporter(nuevo jasmineReporters.JUnitXmlReporter(opciones));
},

esto debería funcionar ¿no?
Recibo el siguiente error "ReferenceError: jasmineReporters no está definido"

/**
* Genera JUnit XML para la ejecución de especificación dada. Hay varias opciones
* para controlar dónde se escriben los resultados, y los valores predeterminados son
* configurado para crear la menor cantidad posible de archivos .xml. Es posible guardar un
* archivo XML único, o un archivo XML para cada describe de nivel superior, o un
* Archivo XML para cada describe independientemente del anidamiento.
*
* Uso:
*
* jasmine.getEnv().addReporter(new jasmineReporters.JUnitXmlReporter(opciones);
*
* @param {objeto} [opciones]
* @param {string} [savePath] directorio para guardar los archivos (predeterminado: '')
* @param {boolean} [consolidateAll] si guardar todos los resultados de las pruebas en un
* archivo único (predeterminado: verdadero)
* NOTA: si es verdadero, {filePrefix} se trata como el nombre de archivo completo (excluyendo
* extensión)
* @param {booleano} [consolidar] si se deben guardar las descripciones anidadas dentro del
* mismo archivo que su padre (predeterminado: verdadero)
* NOTA: true no hace nada si consolidarAll también es cierto.
* NOTA: falso también establece consolidarAll en falso.
* @param {boolean} [useDotNotation] si se separan los nombres de las suites con
* puntos en lugar de espacios, es decir, "Class.init" no "Class init" (predeterminado: verdadero)
* @param {string} [filePrefix] es el valor de cadena que se antepone al
* archivo de salida xml (predeterminado: junitresults-)
* NOTA: si consolidarAll es verdadero, el valor predeterminado es simplemente "junitresults" y
* esto se convierte en el nombre de archivo real, es decir, "junitresults.xml"
*/

@john-bridges ¿Puedes envolver tu código en tildes invertidas? Es difícil leer sin él.

@john-bridges Bueno, no es de extrañar que la variable jasmineReporters no esté definida ya que, de hecho, no la definiste. Necesitas asignar el módulo:

var jasmineReporters = require('jasmine-reporters');

@mzgol Soy un idiota, funciona a las mil maravillas. Gracias por tu ayuda te lo agradezco.

La versión anterior de jasmine-reporters adjuntaba los reporteros directamente al objeto jasmine ; ahora se adjunta a su propia exportación, que es mucho mejor.

Veo de dónde vino la confusión. ;)

@mzgol Estoy de acuerdo, de una manera mucho mejor, gracias de nuevo.

[email protected] es compatible con Jasmine 2.x y, como se observó/discutió anteriormente, tiene una sintaxis y un punto de entrada diferentes (en su propio objeto frente al objeto global jasmine ). Dicho esto, _solo_ admite Jasmine 2.x, no Jasmine 1.x, que es lo que usa Protractor. Por lo tanto, si bien es posible que pueda superar los errores en la configuración de su transportador haciendo var jasmineReporters = require('jasmine-reporters'); new jasmineReporters.JUnitXmlReporter(/*...*/); , tendrá dificultades para obtener un resultado significativo porque está esperando los eventos de Jasmine 2.x y la interfaz del reportero.

La forma correcta de hacer que JUnitXmlReporter funcione con Jasmine 1.x es modificar ligeramente las instrucciones originales de @juliemr :

npm install jasmine-reporters@~1.0.0

Luego siga el resto de sus instrucciones normalmente.

He revisado el README de jasmine-reporters para abordar las formas en que [email protected] difiere de [email protected] . También agregué una sección específica sobre el uso de jasmine-reporters con Protractor ya que la pregunta surge mucho.

Gracias @ksraja por señalar la grave falta de documentación.

¿Por qué este problema sigue cerrándose? Es evidente que todavía es un problema.

    onPrepare: function() {

        require('jasmine-reporters');
        jasmine.getEnv().addReporter(new jasmine.JUnitXmlReporter('test-target/', true, true));

        browser.driver.get('http://localhost:9000');
        require('./test/e2e/models/login-page').login();
    },

Lanza error:

Running "protractor:e2e" (protractor) task

/Users/212400520/PredixExperience/predix-dashboard/node_modules/jasmine-reporters/src/jasmine.console
_reporter.js:2
    if (! jasmine) {
          ^
ReferenceError: jasmine is not defined
    at /Users/212400520/PredixExperience/predix-dashboard/node_modules/jasmine-reporters/src/jasmine.
console_reporter.js:2:11
    at Object.<anonymous> (/Users/212400520/PredixExperience/predix-dashboard/node_modules/jasmine-re
porters/src/jasmine.console_reporter.js:144:3)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at Object.<anonymous> (/Users/212400520/PredixExperience/predix-dashboard/node_modules/jasmine-re
porters/src/load_reporters.js:1:63)
    at Module._compile (module.js:456:26)
>> 
Fatal error: protractor exited with code: 8

@jonniespratley Descubrí que npm install jasmine-reporters instala la versión 1.0.1 de forma predeterminada.
Por lo tanto, asegúrese de haber instalado la última versión de jasmine-reporters . Por ejemplo

npm install jasmine-reporters@~2.0.3 --save-dev

Después de eso, actualicé la configuración del transportador de la siguiente manera:

var jasmineReporters = require('jasmine-reporters');
exports.config = {
    framework: 'jasmine2',
    //...  
    //Other configurations...
    //...  
    onPrepare: function () {
        jasmine.getEnv().addReporter(new jasmineReporters.JUnitXmlReporter({
            savePath: '..',
            consolidateAll: false
        }));
    },
    jasmineNodeOpts: {
        showColors: true,
        defaultTimeoutInterval: 60000,
        print: function() {}
    }
};

Ahora jasmine-reporters me funciona bien.

En la documentación de transportadores para actualizar a jasmine2 framework, en la sección de reporteros sería bueno que la respuesta de @luixaviles estuviera documentada. No puedo imaginar que sea el único que tuvo dificultades para descubrir cómo obtener informes junit para jasmine2. De acuerdo, una vez que encontré esto y volví a leer la documentación actual, es más claro, pero originalmente lo leí por error para indicar que jasmine-reporters no funcionaba (en absoluto) con jasmine2. Tener la respuesta anterior, o un enlace al archivo Léame de jasmine-reporters facilitaría un poco las cosas.

probé los informes de jazmín
var jasmineReporters = require('jasmine-reporters');
jasmine.getEnv().addReporter(new jasmineReporters.JUnitXmlReporter('../TestReports/test', true, true));

funcionó bien, pero no se ha creado ningún archivo xml

Traté de llegar a https://github.com/angular/protractor/blob/master/spec/junitOutputConf.js , pero da 404

@spatchamatla Su ejemplo está usando una extraña combinación de sintaxis [email protected] (argumentos ordenados) con lo que parece ser el reportero [email protected] (jasmineReporters.JUnitXmlReporter vs jasmine.JUnitXmlReporter).

Intente usar la sintaxis correcta para crear el reportero y vea si avanza.

Modificado del ejemplo en el LÉAME de jasmine-reporters:

var junitReporter = new jasmineReporters.JUnitXmlReporter({
    savePath: '../TestReports/test'
});
jasmine.getEnv().addReporter(junitReporter);

Asegúrese de que exista la carpeta '../TestReports/test' ya que creo que falla
en silencio también.

El miércoles 15 de abril de 2015 a las 4:33 p. m., Ben Loveridge [email protected]
escribió:

@spatchamatla https://github.com/spatchamatla Su ejemplo está usando un
extraña combinación de sintaxis [email protected] (argumentos ordenados)
con lo que parece el reportero [email protected]
(jasmineReporters.JUnitXmlReporter frente a jasmine.JUnitXmlReporter).

Intente usar la sintaxis correcta para crear el reportero y vea si obtiene
más.

Modificado del ejemplo en el LÉAME de jasmine-reporters:

var junitReporter = new jasmineReporters.JUnitXmlReporter({
savePath: '../TestReports/prueba'
});
jasmine.getEnv().addReporter(junitReporter);


Responda a este correo electrónico directamente o véalo en GitHub
https://github.com/angular/protractor/issues/60#issuecomment -93451490.

Nunca es una mala idea, aunque los reporteros de jasmine usarán https://github.com/substack/node-mkdirp para intentar crear el directorio.

@bloveridge @spenoir , bajé de categoría a [email protected] y usé lo siguiente

   //For junit output reports
        var reporters = require('jasmine-reporters');
        var capsPromise = browser.getCapabilities();
        capsPromise.then(function (caps) {
            var browserName = caps.caps_.browserName.toUpperCase();
            var browserVersion = caps.caps_.version;
            var prePendStr = browserName + "-" + browserVersion + "-";
            jasmine.getEnv().addReporter(new jasmine.JUnitXmlReporter('Protractor/TestReports', true, true, prePendStr));
        });

comenzó a funcionar, el único inconveniente es que crea la carpeta en el directorio de inicio en lugar de en la carpeta del proyecto. Cuando intenté usar la ruta de la carpeta del proyecto, todavía dice

Advertencia: error al escribir el informe junit para '../TestReports', 'CHROME-41.0.2272.118-TestImpersonationPage.xml'. Razones:
Intento de Rhino: java no está definido
Intento de PhantomJs: la ventana no está definida
Intento de NodeJS: EACCES, permiso denegado '/Users/TestReports'

creé la carpeta manualmente y todavía muestra lo anterior en la consola

¿Es 'Transportador/TestReports' la ruta correcta y existe esa carpeta?

El miércoles 15 de abril de 2015 a las 5:01 p. m., spatchamatla [email protected]
escribió:

@bloveridge https://github.com/bloveridge @spenoir
https://github.com/spenoir , bajé a [email protected] y
usó lo siguiente

//Para informes de salida junit
var reporteros = require('jazmín-reporteros');
var capsPromise = browser.getCapabilities();
capsPromise.then(función (mayúsculas) {
var browserName = caps.caps_.browserName.toUpperCase();
var browserVersion = caps.caps_.version;
var prePendStr = browserName + "-" + browserVersion + "-";
jasmine.getEnv().addReporter(new jasmine.JUnitXmlReporter('Transportador/TestReports', true, true, prePendStr));
});

comenzó a funcionar, el único inconveniente es crear la carpeta en casa
directorio en lugar de en la carpeta del proyecto. Cuando traté de usar el proyecto
ruta de la carpeta, todavía dice

Intento de Rhino: java no está definido
Intento de PhantomJs: la ventana no está definida
Intento de NodeJS: los argumentos para path.resolve deben ser cadenas

creé la carpeta manualmente y todavía muestra lo anterior en la consola


Responda a este correo electrónico directamente o véalo en GitHub
https://github.com/angular/protractor/issues/60#issuecomment -93460326.

'Transportador/TestReports' es la ruta que se creó en la carpeta de inicio, luego usé

jasmine.getEnv().addReporter(new jasmine.JUnitXmlReporter('../TestReports', true, true, prePendStr));

y lo creé manualmente

screen shot 2015-04-15 at 12 07 09 pm

cuando realicé la prueba, todavía da
Advertencia: error al escribir el informe junit para '../TestReports', 'CHROME-41.0.2272.118-TestImpersonationPage.xml'. Razones:
Intento de Rhino: java no está definido
Intento de PhantomJs: la ventana no está definida
Intento de NodeJS: EACCES, permiso denegado '/Users/TestReports'

podría intentar relajar los permisos en la carpeta TestReports, no estoy seguro
después.

El miércoles 15 de abril de 2015 a las 5:10 p. m., spatchamatla [email protected]
escribió:

'Transportador/TestReports' es la ruta que se ha creado en la carpeta de inicio,
entonces usé

jasmine.getEnv().addReporter(new jasmine.JUnitXmlReporter('../TestReports', true, true, prePendStr));

y lo creé manualmente

[imagen: captura de pantalla 2015-04-15 a las 12 07 09 pm]
https://cloud.githubusercontent.com/assets/4671240/7163457/278cffa6-e368-11e4-9994-2c0b5d33f07c.png

cuando realicé la prueba, todavía da
Advertencia: error al escribir el informe junit para '../TestReports',
'CHROME-41.0.2272.118-TestImpersonationPage.xml'. Razones:
Intento de Rhino: java no está definido
Intento de PhantomJs: la ventana no está definida
Intento de NodeJS: EACCES, permiso denegado '/Users/TestReports'


Responda a este correo electrónico directamente o véalo en GitHub
https://github.com/angular/protractor/issues/60#issuecomment -93466365.

Claro, gracias @spenoir por tus sugerencias y aportes.

gran hilo ayudó mucho
Pensé que tenía un problema, pero no lo tengo. no puedo encontrar una manera de eliminar :)
sigue con el buen trabajo.

@jkmurthy @ksraja Parece que los jasmineReports enumerados son en realidad la exportación de la función requerida.

p.ej,
var jasmineReporters = require('jasmine-reporters');

El ejemplo en el archivo Léame de jasmine-reporters funciona para mí: https://github.com/larrymyers/jasmine-reporters#protractor

Si solo necesita la salida de la consola, me complació https://github.com/bcaudan/jasmine-spec-reporter/blob/master/docs/protractor-configuration.md

@josephdpurcell el enlace que proporcionó también funcionó para mí. Aquí está mi configuración, ¡espero que ayude!
Asegúrese de haber instalado el paquete mkdirp, así como los demás paquetes jasmine 2.x y jasmine-reporters 2.X.
Esta configuración crea la carpeta para evitar una falla silenciosa si la carpeta no existe.

   var folderName = ('output_folder');
    var mkdirp = require('mkdirp');
    mkdirp(folderName, function(err) {
      if (err) {
        console.error(err);
       } else {
          var jasmineReporters = require('jasmine-reporters');
          jasmine.getEnv().addReporter(new jasmineReporters.JUnitXmlReporter({
            consolidateAll: true,
            savePath: folderName,
             filePrefix: 'xmloutput-'
            }));
         }
    });
¿Fue útil esta página
0 / 5 - 0 calificaciones