Pular para o conteúdo principal

Relatório Junit

Um reporter do WebdriverIO que cria relatórios JUnit em XML compatíveis com Jenkins

Instalação

A maneira mais fácil é manter o @wdio/junit-reporter como uma devDependency no seu package.json, via:

npm install @wdio/junit-reporter --save-dev

Instruções sobre como instalar o WebdriverIO podem ser encontradas aqui.

Saída

Este reporter vai produzir um relatório para cada executor, então por sua vez você receberá um relatório xml para cada arquivo de especificação. Abaixo estão exemplos de saída XML para diferentes cenários no arquivo de especificação.

Bloco único de describe

describe('a test suite', () => {
it('a test case', function () {
// do something
// assert something
});
});

se torna

<testsuites>
<testsuite name="a test suite" timestamp="2019-04-18T13:45:21" time="11.735" tests="0" failures="0" errors="0" skipped="0">
<properties>
<property name="specId" value="0"/>
<property name="suiteName" value="a test suite"/>
<property name="capabilities" value="chrome"/>
<property name="file" value=".\test\specs\asuite.spec.js"/>
</properties>
<testcase classname="chrome.a_test_case" name="a_test_suite_a_test_case" time="11.706"/>
</testsuite>
</testsuites>

Bloco aninhado de describe

describe('a test suite', () => {
describe('a nested test suite', function() {
it('a test case', function () {
// do something
// assert something
});
});
});

se torna

<testsuites>
<testsuite name="a test suite" timestamp="2019-04-18T13:45:21" time="11.735" tests="0" failures="0" errors="0" skipped="0">
<properties>
<property name="specId" value="0"/>
<property name="suiteName" value="a test suite"/>
<property name="capabilities" value="chrome"/>
<property name="file" value=".\test\specs\asuite.spec.js"/>
</properties>
</testsuite>
<testsuite name="a nested test suite" timestamp="2019-04-18T13:45:21" time="11.735" tests="0" failures="0" errors="0" skipped="0">
<properties>
<property name="specId" value="0"/>
<property name="suiteName" value="a nested test suite"/>
<property name="capabilities" value="chrome"/>
<property name="file" value=".\test\specs\asuite.spec.js"/>
</properties>
<testcase classname="chrome.a_test_case" name="a nested test suite a test case" time="11.706"/>
</testsuite>
</testsuites>

Múltiplos blocos de describe

describe('a test suite', () => {
it('a test case', function () {
// do something
// assert something
});
});
describe('a second test suite', () => {
it('a second test case', function () {
// do something
// assert something
});
});

se torna

<testsuites>
<testsuite name="a test suite" timestamp="2019-04-18T13:45:21" time="11.735" tests="0" failures="0" errors="0" skipped="0">
<properties>
<property name="specId" value="0"/>
<property name="suiteName" value="a test suite"/>
<property name="capabilities" value="chrome"/>
<property name="file" value=".\test\specs\asuite.spec.js"/>
<testcase classname="chrome.a_test_case" name="a nested test suite a test case" time="11.706"/>
</properties>
</testsuite>
<testsuite name="a second test suite" timestamp="2019-04-18T13:45:21" time="11.735" tests="0" failures="0" errors="0" skipped="0">
<properties>
<property name="specId" value="0"/>
<property name="suiteName" value="a second test suite"/>
<property name="capabilities" value="chrome"/>
<property name="file" value=".\test\specs\asuite.spec.js"/>
</properties>
<testcase classname="chrome.a_second_test_case" name="a_second_test_suite_a_second_test_case" time="11.706"/>
</testsuite>
</testsuites>

Falhas e Erros

Todas as falhas de caso de teste são mapeadas como erros de caso de teste JUnit. Um caso de teste que falhou devido a falha de asserção ou erro será assim:

<testcase classname="chrome.a_test_case" name="a_test_suite_a_test_case" time="0.372">
<failure message="Error: some error"/>
<system-err>
<![CDATA[
Error: some assertion failure
at UserContext.<anonymous> (C:\repo\webdriver-example\test\specs/a_test_suite.spec.js:22:17)
]]>
</system-err>
</testcase>

Configuração

O código a seguir mostra a configuração padrão do test runner do WDIO. Basta adicionar 'junit' como reporter ao array. Para obter alguma saída durante o teste, você pode executar o WDIO Dot Reporter e o WDIO JUnit Reporter ao mesmo tempo:

// wdio.conf.js
module.exports = {
// ...
reporters: [
'dot',
['junit', {
outputDir: './',
outputFileFormat: function(options) { // optional
return `results-${options.cid}.${options.capabilities}.xml`
}
}]
],
// ...
};

As seguintes opções são suportadas:

outputDir

Defina um diretório onde seus arquivos xml devem ser armazenados.

Tipo: String
Obrigatório

outputFileFormat

Defina os arquivos xml criados após a execução do teste.

Tipo: Object
Padrão: function (opts) { return `wdio-${this.cid}-${name}-reporter.log` }

outputFileFormat: function (options) {
return 'mycustomfilename.xml';
}

Nota: options.capabilities são suas capacidades para esse executor, então especificar ${options.capabilities} em sua string retornará [Object object]. Você deve especificar quais propriedades de capabilities deseja no nome do arquivo.

suiteNameFormat

Dá a capacidade de fornecer regex personalizado para formatação do nome da suite de teste (por exemplo, no xml de saída).

Tipo: Regex,
Padrão: /[^a-zA-Z0-9@]+/

// wdio.conf.js
module.exports = {
// ...
reporters: [
'dot',
['junit', {
outputDir: './',
suiteNameFormat: /[^a-zA-Z0-9@]+/
outputFileFormat: function(options) { // optional
return `results-${options.cid}.${options.capabilities}.xml`
}
}]
],
// ...
};

addFileAttribute

Adiciona um atributo de arquivo a cada caso de teste. Esta configuração é principalmente para CircleCI. Esta configuração fornece detalhes mais ricos, mas pode quebrar em outras plataformas de CI.

Tipo: Boolean,
Padrão: false

packageName

Você pode dividir pacotes por um nível adicional configurando 'packageName'. Por exemplo, se você quisesse iterar sobre uma suíte de teste com diferentes variáveis de ambiente definidas:

Tipo: String
Exemplo:

// wdio.conf.js
module.exports = {
// ...
reporters: [
'dot',
['junit', {
outputDir: './',
packageName: process.env.USER_ROLE // chrome.41 - administrator
}]
]
// ...
};

errorOptions

Permite definir várias combinações de notificações de erro dentro do xml.
Dado um teste Jasmine como expect(true).toBe(false, 'my custom message') você receberá este erro de teste:

{
matcherName: 'toBe',
message: 'Expected true to be false, \'my custom message\'.',
stack: 'Error: Expected true to be false, \'my custom message\'.\n at UserContext.it (/home/mcelotti/Workspace/WebstormProjects/forcebeatwio/test/marco/prova1.spec.js:3:22)',
passed: false,
expected: [ false, 'my custom message' ],
actual: true
}

Portanto, você pode escolher qual chave será usada onde, veja o exemplo abaixo.

Tipo: Object,
Padrão: errorOptions: { error: "message" }
Exemplo:

// wdio.conf.js
module.exports = {
// ...
reporters: [
'dot',
['junit', {
outputDir: './',
errorOptions: {
error: 'message',
failure: 'message',
stacktrace: 'stack'
}
}]
],
// ...
};

addWorkerLogs

Parâmetro opcional, defina este parâmetro como true para anexar logs do console do teste no relatório.

Tipo: Boolean
Padrão: false
Exemplo:

// wdio.conf.js
module.exports = {
// ...
reporters: [
'dot',
['junit', {
outputDir: './',
addWorkerLogs: true
}]
],
// ...
};

Adicionando propriedades personalizadas aos casos de teste

Este plugin fornece uma função addProperty(name, value). Esta função pode ser usada para adicionar propriedades adicionais do caso de teste junit à etapa de teste em execução no momento. Essas propriedades serão relatadas no xml resultante como <property name="${name}" value="${value}" />.

O caso de uso típico para isso é adicionar um link para um problema ou um caso de teste.

Exemplo de uso

Um exemplo para mocha:

import { addProperty } from '@wdio/junit-reporter'

describe('Suite', () => {
it('Case', () => {
addProperty('test_case', 'TC-1234')
})
})

Configuração do Jenkins

Por último, mas não menos importante, você precisa informar ao seu job de CI (por exemplo, Jenkins) onde ele pode encontrar o arquivo xml. Para isso, adicione uma ação pós-build ao seu job que é executada após o teste ter sido executado e aponte o Jenkins (ou seu sistema de CI desejado) para seus resultados de teste XML:

Point Jenkins to XML files

Se não houver tal etapa pós-construção em seu sistema de CI, provavelmente existe um plugin para isso em algum lugar na internet.


Para mais informações sobre o WebdriverIO, consulte a página inicial.

Welcome! How can I help?

WebdriverIO AI Copilot