Protractor: Repórter Junit

Criado em 28 ago. 2013  ·  42Comentários  ·  Fonte: angular/protractor

Queremos executar testes de transferidor no Jenkins, então seria muito útil se houvesse um repórter junit (como o karma) para que o status dos testes pudesse ser relatado pelo Jenkins

feature request

Comentários muito úteis

Como fazer isso em seu arquivo de configuração de uma maneira apenas um pouco hacky - testei isso com o próprio conjunto de testes do Protractor:

npm install jasmine-reporters

Seu arquivo de configuração:

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 comentários

Meus 2 centavos aqui: se você usa o Grunt como sua ferramenta de compilação, você pode executar seus testes do Protractor usando o grunt-jasmine-node e configurá-lo para obter relatórios semelhantes ao JUnit!

Como fazer isso em seu arquivo de configuração de uma maneira apenas um pouco hacky - testei isso com o próprio conjunto de testes do Protractor:

npm install jasmine-reporters

Seu arquivo de configuração:

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',
};

Aceita o caminho relativo ou absoluto do diretório. O caminho absoluto está funcionando enquanto o caminho relativo não. Eu tentei opções como ../Reports, mas não adianta
jasmine.getEnv().addReporter(
new jasmine.JUnitXmlReporter('xmloutput', true, true));
},

explorado e funcionando, ignore meu último comentário

Eu não era inteligente o suficiente, então esperava que a pasta fosse criada, mas, na verdade, a pasta deve ser criada antes.

@juliemr Como usá-lo com duas instâncias do Protractor em execução em paralelo, por exemplo, via grunt-concurrent ? É necessário para que possamos executar testes no Firefox e Chrome ao mesmo tempo, mas fará um XML substituir o outro, o que confundirá o Jenkins.

Talvez o Protractor deva saber correr em Paralelo por motivos como esse, semelhante ao que o Karma faz?

@mzgol Você tentou fazer com que cada destino sendo executado como uma tarefa simultânea produza um relatório xml junit diferente com base na plataforma? Você pode simplesmente criar uma nova pasta de saída com base no nome de destino.

Você também pode querer examinar os destinos de várias configurações no Jenkins, que permitem executar suas etapas de compilação em paralelo, cada uma com um ambiente limpo. Ele também possui recursos bacanas, como builds de touchstone, e permite que você acelere a simultaneidade melhor do que o grunhido.

Existe configuração semelhante para mocha? (como eu não estou usando Jasmine)

@mzgol Eu tentei a sugestão de jvandyke (obrigado) e está funcionando bem para mim:

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

Obrigado. Está funcionando para mim também:

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

Eu criei um repórter html em cima disso. Por favor, deixe-me saber seus comentários
https://github.com/jintoppy/protractor-html-screenshot-reporter

Pode ser uma ideia adicionar a criação da pasta aos documentos, pois também tropecei nisso @tracycummins !

@juliemr Cansado de todas as opções listadas nas amostras. Eu recebo este erro. Quaisquer indicações apreciadas

/home/jack/prototype/conf.js:19
jasmine.getEnv().addReporter(new jasmine.JUnitXmlReporter('xmloutput', true, true));
^
TypeError: undefined não é uma função
em export.config.onPrepare (/home/jack/prototype/conf.js:19:33)
em Runner.runFilenamesOrFns_ (/home/usr/lib/node_modules/protractor/lib/runner.js:64:9)
em Runner.runTestPreparers (/home/usr/lib/node_modules/protractor/lib/runner.js:91:8)
em runner.controlFlow.execute.then.jasmineNodeOpts (/home/usr/lib/node_modules/protractor/lib/frameworks/jasmine.js:39:12)
em webdriver.promise.ControlFlow.runInNewFrame_ (/home/usr/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:1539:20)
em webdriver.promise.ControlFlow.runEventLoop_ (/home/usr/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver/promise.js:1404:8)
no wrapper como _onTimeout
em Timer.listOnTimeout como ontimeout
==== tarefa assíncrona ====
executar preparadores de teste
em Object.exports.run (/home/usr/lib/node_modules/protractor/lib/frameworks/jasmine.js:38:24)
em driverprovider_.setupEnv.then.then.then.testResult (/home/usr/lib/node_modules/protractor/lib/runner.js:233:28)
em _fulfilled (/home/usr/lib/node_modules/protractor/node_modules/q/q.js:797:54)
em self.promiseDispatch.done (/home/usr/lib/node_modules/protractor/node_modules/q/q.js:826:30)
em Promise.promise.promiseDispatch (/home/usr/lib/node_modules/protractor/node_modules/q/q.js:759:13)
em /home/usr/lib/node_modules/protractor/node_modules/q/q.js:525:49
na descarga (/home/usr/lib/node_modules/protractor/node_modules/q/q.js:108:17)
em process._tickCallback (node.js:423:13)
em Function.Module.runMain (module.js:499:11)


// Um ​​arquivo de configuração de exemplo.
export.config = {
// O endereço de um servidor de selênio em execução.
seleniumAddress: ' http://localhost :4444/wd/hub',
allScriptsTimeout: 30000,
// Capacidades a serem passadas para a instância do webdriver.
capacidades: {
'browserName': 'firefox'
},

// Os padrões de especificação são relativos à corrente trabalhando diretamente quando
// o transferidor é chamado.
especificações: ['example_spec.js'],

// Opções a serem passadas para Jasmine-node.
onPrepare: function() {
require('jasmine-reporters');
jasmine.getEnv().addReporter(new jasmine.JUnitXmlReporter('xmloutput', true, true));
},

// Opções a serem passadas para Jasmine-node.
jasmineNodeOpts: {
showColors: true,
defaultTimeoutInterval: 30000
}
};

oi @jkmurthy

Eu corri para o mesmo problema exato. Na versão mais recente do [email protected] , eles mudaram o nome do módulo. Não há documentação sobre isso, mas está lá neste arquivo.

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

  • Uso:

    • jasmine.getEnv().addReporter(new jasmineReporters.JUnitXmlReporter(opções);

Ainda assim, não consegui fazê-lo funcionar, pois diz o módulo 'jasmineReporters' indefinido.

Então mudei para a versão mais antiga do [email protected] , funcionou perfeitamente. Certifique-se de criar o diretório ao qual você está se referindo como saída nas opções do repórter.

Fazer downgrade de jasmine-reporters para 0.4.1 não funcionou
Tentei com
onPrepare: function() {
var folderName = (new Date()).toString().split(' ').splice(1, 4).join(' ');
var mkdirp = require('mkdirp');
var newFolder = "./reports/" + folderName;
require('jasmine-reporters');

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

Sem sorte ainda

Este é definitivamente um problema para mim. Usando jasmine-reporters 2.0 eu recebo
D:\HgBuild\TPSOneSearch\Unstable\Tyler.TPS.OneSearch\Tyler.TPS.Web.OneSearch\app
\test\e2e\oneSearchChromeConf.js:29
jasmine.getEnv().addReporter(new jasmine.JUnitXmlReporter(uri, t
rue, verdadeiro, ''));
^
TypeError: undefined não é uma função.

alterar "novo jasmine.JUnitXmlReporter" para "jasmineReporters.JUnitXmlReporter" resulta em jasmineReporters é indefinido.

Se eu reverter os repórteres de jasmim de volta para 0.4.1, ele funciona esplendidamente.

jasmine-reporters 2.0 tem API diferente de 1.x; você não pode simplesmente atualizar cegamente; ajuste suas invocações.

Observando o comentário no arquivo junit_reporter.js para JUnitXmlReporter, configurei meu arquivo conf da seguinte forma:

onPrepare: function() {
require('jasmine-reporters');
var opções = {
savePath: 'algum caminho de arquivo',
consolidar: verdadeiro,
useDotNotation: true
};
jasmine.getEnv().addReporter(novo jasmineReporters.JUnitXmlReporter(opções));
},

isso deve funcionar não deveria?
Recebo o seguinte erro "ReferenceError: jasmineReporters não está definido"

/**
* Gera JUnit XML para a execução de especificação fornecida. Existem várias opções
* para controlar onde os resultados são gravados e os valores padrão são
* definido para criar o menor número possível de arquivos .xml. É possível salvar um
* único arquivo XML ou um arquivo XML para cada describe de nível superior ou um
* Arquivo XML para cada describe independente do aninhamento.
*
* Uso:
*
* jasmine.getEnv().addReporter(new jasmineReporters.JUnitXmlReporter(opções);
*
* @param {objeto} [opções]
* @param {string} [savePath] diretório para salvar os arquivos (padrão: '')
* @param {boolean} [consolidateAll] para salvar todos os resultados do teste em um
* arquivo único (padrão: true)
* NOTA: se verdadeiro, {filePrefix} é tratado como o nome completo do arquivo (excluindo
*extensão)
* @param {boolean} [consolidar] se deseja salvar descrições aninhadas dentro do
* mesmo arquivo que seu pai (padrão: true)
* NOTA: true não faz nada se consolidateAll também for true.
* NOTA: false também define consolidateAll como false.
* @param {boolean} [useDotNotation] para separar nomes de suítes com
* pontos em vez de espaços, ou seja, "Class.init" não "Class init" (padrão: true)
* @param {string} [filePrefix] é o valor da string que é anexado ao
* arquivo de saída xml (padrão: junitresults-)
* NOTA: se consolidateAll for true, o padrão é simplesmente "junitresults" e
* este se torna o nome do arquivo real, ou seja, "junitresults.xml"
*/

@john-bridges Você pode envolver seu código em back-ticks? É difícil ler sem ele.

@john-bridges Bem, não é de admirar que a variável jasmineReporters seja indefinida, já que você não a definiu, de fato. Você precisa atribuir o módulo:

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

@mzgol eu sou um idiota, funciona como um encanto. Obrigado por sua ajuda eu aprecio isso.

A versão anterior de jasmine-reporters anexava os repórteres diretamente ao objeto jasmine ; agora atribui à sua própria exportação que é muito melhor.

Eu vejo de onde veio a confusão. ;)

@mzgol concordo, de uma maneira muito melhor, obrigado novamente.

[email protected] suporta Jasmine 2.xe, como observado/discutido acima, tem uma sintaxe e um ponto de entrada diferentes (em seu próprio objeto vs objeto jasmine global). Dito isto, ele _somente_ suporta Jasmine 2.x, não Jasmine 1.x que é o que o Protractor usa. Portanto, embora você possa obter erros passados ​​na configuração do seu transferidor fazendo var jasmineReporters = require('jasmine-reporters'); new jasmineReporters.JUnitXmlReporter(/*...*/); , será difícil obter qualquer saída significativa porque está aguardando os eventos do Jasmine 2.xe a interface do repórter.

A maneira correta de fazer o JUnitXmlReporter funcionar com o Jasmine 1.x é modificar ligeiramente as instruções originais do @juliemr :

npm install jasmine-reporters@~1.0.0

Em seguida, siga o resto de suas instruções normalmente.

Reformulei o README do jasmine-reporters para abordar as maneiras [email protected] difere de [email protected] . Eu também adicionei uma seção específica sobre o uso de repórteres de jasmim com o Protractor, já que a questão surge muito.

Obrigado @ksraja por apontar a documentação seriamente ausente.

Por que esse problema continua sendo fechado, é evidente que esse ainda é um 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();
    },

Lança erro:

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 Descobri que npm install jasmine-reporters instala a versão 1.0.1 por padrão.
Portanto, certifique-se de ter instalado a versão mais recente de jasmine-reporters . Por exemplo

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

Depois disso, atualizei a configuração do transferidor da seguinte forma:

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

Agora jasmine-repórteres está funcionando bem para mim.

Na documentação dos transferidores para atualizar para o framework jasmine2, na seção de repórteres, seria bom se a resposta do @luixaviles fosse documentada. Não consigo imaginar que sou o único que teve dificuldade em descobrir como obter relatórios junit para jasmine2. Concedido, uma vez que eu encontrei isso e reli a documentação atual, é mais claro, mas originalmente eu li erroneamente para significar que os jasmine-reporters não funcionaram (de forma alguma) com o jasmine2. Ter a resposta acima ou um link para o readme dos jasmine-reporters tornaria as coisas um pouco mais fáceis.

tentei os relatórios de jasmim
var jasmineReporters = require('jasmine-reporters');
jasmine.getEnv().addReporter(new jasmineReporters.JUnitXmlReporter('../TestReports/test', true, true));

funcionou bem, mas nenhum arquivo xml foi criado

tentei acessar https://github.com/angular/protractor/blob/master/spec/junitOutputConf.js , mas dá 404

@spatchamatla Seu exemplo está usando uma combinação estranha da sintaxe [email protected] (argumentos ordenados) com o que parece ser o repórter [email protected] (jasmineReporters.JUnitXmlReporter vs jasmine.JUnitXmlReporter).

Tente usar a sintaxe correta para criar o repórter e veja se você vai mais longe.

Modificado a partir do exemplo no README dos jasmine-reporters:

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

Certifique-se de que a pasta '../TestReports/test' existe, pois acho que falha
silenciosamente também.

Na quarta-feira, 15 de abril de 2015 às 16h33, Ben Loveridge [email protected]
escrevi:

@spatchamatla https://github.com/spatchamatla Seu exemplo está usando um
combinação estranha da sintaxe [email protected] (argumentos ordenados)
com o que parece ser o repórter [email protected]
(jasmineReporters.JUnitXmlReporter vs jasmine.JUnitXmlReporter).

Tente usar a sintaxe correta para criar o repórter e veja se você obtém
mais longe.

Modificado a partir do exemplo no README dos jasmine-reporters:

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


Responda a este e-mail diretamente ou visualize-o no GitHub
https://github.com/angular/protractor/issues/60#issuecomment -93451490.

Nunca é uma má ideia, embora os jasmine-reporters usem https://github.com/substack/node-mkdirp para tentar criar o diretório.

@bloveridge @spenoir , fiz downgrade para [email protected] usei o abaixo

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

começou a funcionar, a única desvantagem é criar a pasta no diretório inicial e não na pasta do projeto. Quando tentei usar o caminho da pasta do projeto, ainda diz

Aviso: a gravação do relatório junit falhou para '../TestReports', 'CHROME-41.0.2272.118-TestImpersonationPage.xml'. Razões:
Tentativa de rinoceronte: java não está definido
Tentativa do PhantomJs: a janela não está definida
Tentativa NodeJS: EACCES, permissão negada '/Users/TestReports'

eu criei a pasta manualmente e ainda mostra o acima no console

é 'Protractor/TestReports' o caminho correto e essa pasta existe?

Na quarta-feira, 15 de abril de 2015 às 17h01, spatchamatla [email protected]
escrevi:

@bloveridge https://github.com/bloveridge @spenoir
https://github.com/spenoir , fiz downgrade para [email protected] e
usei o abaixo

//Para relatórios de saída junit
var repórteres = 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));
});

começou a funcionar, a única desvantagem é criar a pasta em casa
diretório em vez da pasta do projeto. Quando eu tentei usar o projeto
caminho da pasta, ainda diz

Tentativa de rinoceronte: java não está definido
Tentativa do PhantomJs: a janela não está definida
Tentativa NodeJS: Argumentos para path.resolve devem ser strings

eu criei a pasta manualmente e ainda mostra o acima no console


Responda a este e-mail diretamente ou visualize-o no GitHub
https://github.com/angular/protractor/issues/60#issuecomment -93460326.

'Protractor/TestReports' é o caminho que foi criado na pasta inicial, então usei

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

e eu criei manualmente

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

quando eu fiz o teste ainda deu
Aviso: a gravação do relatório junit falhou para '../TestReports', 'CHROME-41.0.2272.118-TestImpersonationPage.xml'. Razões:
Tentativa de rinoceronte: java não está definido
Tentativa do PhantomJs: a janela não está definida
Tentativa NodeJS: EACCES, permissão negada '/Users/TestReports'

você pode tentar relaxar as permissões na pasta TestReports, não tenho certeza
depois disso.

Na quarta-feira, 15 de abril de 2015 às 17h10, spatchamatla [email protected]
escrevi:

'Transferidor/TestReports' é o caminho que foi criado na pasta inicial,
então eu usei

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

e eu criei manualmente

[imagem: captura de tela 15/04/2015 às 12 07 09 pm]
https://cloud.githubusercontent.com/assets/4671240/7163457/278cffa6-e368-11e4-9994-2c0b5d33f07c.png

quando eu fiz o teste ainda deu
Aviso: a gravação do relatório junit falhou para '../TestReports',
'CHROME-41.0.2272.118-TestImpersonationPage.xml'. Razões:
Tentativa de rinoceronte: java não está definido
Tentativa do PhantomJs: a janela não está definida
Tentativa NodeJS: EACCES, permissão negada '/Users/TestReports'


Responda a este e-mail diretamente ou visualize-o no GitHub
https://github.com/angular/protractor/issues/60#issuecomment -93466365.

Claro, obrigado @spenoir por suas sugestões e contribuições

ótimo fio. ajudou muito.
pensei que eu tinha um problema - mas não. não consigo encontrar uma maneira de excluir :)
mantenha o bom trabalho.

@jkmurthy @ksraja Parece que o jasmineReports listado é na verdade a exportação da função require.

por exemplo,
var jasmineReporters = require('jasmine-reporters');

O exemplo no readme jasmine-reporters funciona para mim: https://github.com/larrymyers/jasmine-reporters#protractor

Se você só precisa de saída do console, fiquei satisfeito com https://github.com/bcaudan/jasmine-spec-reporter/blob/master/docs/protractor-configuration.md

@josephdpurcell o link que você forneceu também funcionou para mim. Aqui está minha configuração, espero que ajude!
Certifique-se de ter instalado o pacote mkdirp assim como os outros pacotes jasmine 2.xe jasmine-reporters 2.X.
Esta configuração cria a pasta para evitar uma falha silenciosa se a pasta não existir.

   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-'
            }));
         }
    });
Esta página foi útil?
0 / 5 - 0 avaliações