Przejdź do głównej treści

Raportowanie Junit

Reporter WebdriverIO, który tworzy raporty JUnit w formacie XML kompatybilne z Jenkins

Instalacja

Najłatwiejszym sposobem jest utrzymanie @wdio/junit-reporter jako devDependency w twoim pliku package.json, poprzez:

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

Instrukcje jak zainstalować WebdriverIO można znaleźć tutaj.

Wynik

Ten reporter wygeneruje raport dla każdego uruchomienia, więc w rezultacie otrzymasz raport XML dla każdego pliku specyfikacji. Poniżej znajdują się przykłady danych wyjściowych XML dla różnych scenariuszy w pliku specyfikacji.

Pojedynczy blok describe

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

staje się

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

Zagnieżdżony blok describe

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

staje się

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

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

staje się

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

Niepowodzenia i błędy

Wszystkie niepowodzenia przypadków testowych są mapowane jako błędy przypadków testowych JUnit. Niepowodzenie przypadku testowego z powodu błędu asercji lub błędu będzie wyglądać tak:

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

Konfiguracja

Poniższy kod pokazuje domyślną konfigurację testera wdio. Wystarczy dodać 'junit' jako reporter do tablicy. Aby uzyskać jakieś dane wyjściowe podczas testu, możesz uruchomić WDIO Dot Reporter i WDIO JUnit Reporter jednocześnie:

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

Obsługiwane są następujące opcje:

outputDir

Zdefiniuj katalog, w którym mają być przechowywane pliki xml.

Typ: String
Wymagane

outputFileFormat

Zdefiniuj pliki xml tworzone po wykonaniu testu.

Typ: Object
Domyślnie: function (opts) { return `wdio-${this.cid}-${name}-reporter.log` }

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

Uwaga: options.capabilities to obiekt capabilities dla tego runnera, więc określenie ${options.capabilities} w ciągu znaków zwróci [Object object]. Musisz określić, które właściwości capabilities chcesz w nazwie pliku.

suiteNameFormat

Daje możliwość dostarczenia niestandardowego regex do formatowania nazwy zestawu testów (np. w wyjściowym xml).

Typ: Regex,
Domyślnie: /[^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

Dodaje atrybut pliku do każdego przypadku testowego. Ta konfiguracja jest głównie dla CircleCI. To ustawienie zapewnia bogatsze szczegóły, ale może nie działać na innych platformach CI.

Typ: Boolean,
Domyślnie: false

packageName

Możesz podzielić pakiety na dodatkowy poziom, ustawiając 'packageName'. Na przykład, jeśli chcesz iterować przez zestaw testów z różnymi zmiennymi środowiskowymi:

Typ: String
Przykład:

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

errorOptions

Pozwala ustawić różne kombinacje powiadomień o błędach wewnątrz xml.
Dla testu Jasmine, takiego jak expect(true).toBe(false, 'my custom message'), otrzymasz taki błąd testu:

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

Dlatego możesz wybrać który klucz będzie używany gdzie, zobacz przykład poniżej.

Typ: Object,
Domyślnie: errorOptions: { error: "message" }
Przykład:

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

addWorkerLogs

Opcjonalny parametr, ustaw ten parametr na true, aby dołączyć logi konsoli z testu w reporterze.

Typ: Boolean
Domyślnie: false
Przykład:

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

Dodawanie niestandardowych właściwości do testów

Wtyczka ta udostępnia funkcję addProperty(name, value). Funkcja ta może być używana do dodawania dodatkowych właściwości testcase junit do aktualnie wykonywanego kroku testowego. Te właściwości będą raportowane w wynikowym pliku xml jako <property name="${name}" value="${value}" />.

Typowym przypadkiem użycia jest dodanie linku do zgłoszenia lub przypadku testowego.

Przykład użycia

Przykład dla mocha:

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

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

Konfiguracja Jenkins

Na koniec musisz poinformować swoje zadanie CI (np. Jenkins), gdzie może znaleźć plik xml. Aby to zrobić, dodaj akcję post-build do swojego zadania, która zostanie wykonana po uruchomieniu testu i wskaż Jenkinsowi (lub wybranemu systemowi CI) na twoje wyniki testów XML:

Point Jenkins to XML files

Jeśli w twoim systemie CI nie ma takiej akcji post-build, prawdopodobnie istnieje do tego wtyczka gdzieś w Internecie.


Więcej informacji na temat WebdriverIO można znaleźć na stronie głównej.

Welcome! How can I help?

WebdriverIO AI Copilot