Vai al contenuto principale

Reporter Junit

Un reporter WebdriverIO che crea report JUnit basati su XML compatibili con Jenkins

Installazione

Il modo più semplice è mantenere @wdio/junit-reporter come devDependency nel tuo package.json, tramite:

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

Le istruzioni su come installare WebdriverIO possono essere trovate qui.

Output

Questo reporter produrrà un report per ogni runner, quindi a sua volta riceverai un report xml per ogni file spec. Di seguito ci sono esempi di output XML relativi a diversi scenari nel file spec.

Blocco describe singolo

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

diventa

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

Blocco describe annidato

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

diventa

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

Blocco describe multiplo

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

diventa

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

Fallimenti ed Errori

Tutti i fallimenti dei casi di test sono mappati come errori di casi di test JUnit. Un caso di test fallito a causa di un fallimento di asserzione o di un errore apparirà così:

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

Configurazione

Il seguente codice mostra la configurazione predefinita del test runner WDIO. Basta aggiungere 'junit' come reporter nell'array. Per ottenere un output durante il test, puoi eseguire il WDIO Dot Reporter e il WDIO JUnit Reporter contemporaneamente:

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

Sono supportate le seguenti opzioni:

outputDir

Definisce una directory dove i tuoi file xml devono essere archiviati.

Tipo: String
Obbligatorio

outputFileFormat

Definisce i file xml creati dopo l'esecuzione del test.

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

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

Nota: options.capabilities sono le tue capabilities per quel runner, quindi specificando ${options.capabilities} nella tua stringa restituirà [Object object]. Devi specificare quali proprietà delle capabilities vuoi nel tuo nome file.

suiteNameFormat

Offre la possibilità di fornire regex personalizzate per formattare il nome della suite di test (ad esempio, nell'xml di output).

Tipo: Regex,
Default: /[^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

Aggiunge un attributo file a ogni testcase. Questa configurazione è principalmente per CircleCI. Questa impostazione fornisce dettagli più ricchi ma potrebbe non funzionare su altre piattaforme CI.

Tipo: Boolean,
Default: false

packageName

Puoi suddividere i pacchetti per un livello aggiuntivo impostando 'packageName'. Ad esempio, se volessi iterare su una suite di test con diverse variabili d'ambiente impostate:

Tipo: String
Esempio:

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

errorOptions

Consente di impostare varie combinazioni di notifiche di errore all'interno dell'xml.
Dato un test Jasmine come expect(true).toBe(false, 'my custom message') otterrai questo errore di test:

{
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
}

Pertanto, puoi scegliere quale chiave sarà utilizzata dove, vedi l'esempio di seguito.

Tipo: Object,
Default: errorOptions: { error: "message" }
Esempio:

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

addWorkerLogs

Parametro opzionale, imposta questo parametro su true per allegare i log della console dal test nel reporter.

Tipo: Boolean
Default: false
Esempio:

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

Aggiungere proprietà personalizzate ai testcase

Questo plugin fornisce una funzione addProperty(name, value). Questa funzione può essere utilizzata per aggiungere proprietà aggiuntive del testcase junit al passaggio di test attualmente in esecuzione. Queste proprietà verranno riportate nell'xml risultante come <property name="${name}" value="${value}" />.

Un caso d'uso tipico è l'aggiunta di un collegamento a un problema o a un caso di test.

Esempio di utilizzo

Un esempio per mocha:

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

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

Configurazione Jenkins

Infine devi dire al tuo job CI (ad es. Jenkins) dove può trovare il file xml. Per farlo, aggiungi un'azione post-build al tuo job che viene eseguita dopo che il test è stato eseguito e indica a Jenkins (o al tuo sistema CI desiderato) i tuoi risultati di test XML:

Point Jenkins to XML files

Se non esiste una fase post-build di questo tipo nel tuo sistema CI, probabilmente esiste un plugin per questo da qualche parte su internet.


Per ulteriori informazioni su WebdriverIO, visita la homepage.

Welcome! How can I help?

WebdriverIO AI Copilot