Перейти до основного вмісту

Репортер Junit

Репортер WebdriverIO, який створює XML-звіти формату JUnit, сумісні з Jenkins

Встановлення

Найпростіший спосіб - зберігти @wdio/junit-reporter як devDependency у вашому package.json, через:

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

Інструкції щодо встановлення WebdriverIO можна знайти тут.

Результат

Цей репортер створить звіт для кожного запуску, тому ви отримаєте xml-звіт для кожного файлу специфікації. Нижче наведені приклади виводу XML для різних сценаріїв у файлі специфікації.

Один блок describe

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

стає

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

Вкладений блок describe

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

стає

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

Кілька блоків 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
});
});

стає

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

Невдачі та помилки

Всі невдачі тестових випадків відображаються як помилки тестових випадків JUnit. Невдалий тестовий випадок через помилку або збій перевірки виглядатиме так:

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

Конфігурація

Наступний код показує конфігурацію запуску тестів wdio за замовчуванням. Просто додайте 'junit' як репортер до масиву. Щоб отримати якийсь вивід під час тесту, ви можете запустити WDIO Dot Reporter і WDIO JUnit Reporter одночасно:

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

Підтримуються такі параметри:

outputDir

Визначте каталог, де мають зберігатися ваші xml-файли.

Тип: String
Обов'язково

outputFileFormat

Визначте xml-файли, створені після виконання тесту.

Тип: Object
За замовчуванням: function (opts) { return `wdio-${this.cid}-${name}-reporter.log` }

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

Примітка: options.capabilities - це ваш об'єкт можливостей для цього запуску, тому вказання ${options.capabilities} у рядку поверне [Object object]. Ви повинні вказати, які властивості можливостей ви хочете у своєму імені файлу.

suiteNameFormat

Дає можливість надати власний регулярний вираз для форматування назви набору тестів (наприклад, у вихідному xml).

Тип: Regex,
За замовчуванням: /[^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

Додає атрибут файлу до кожного тестового випадку. Ця конфігурація в першу чергу призначена для CircleCI. Цей параметр надає більш детальну інформацію, але може не працювати на інших платформах CI.

Тип: Boolean,
За замовчуванням: false

packageName

Ви можете розбити пакети за додатковим рівнем, встановивши 'packageName'. Наприклад, якщо ви хочете перебрати набір тестів з різними встановленими змінними середовища:

Тип: String
Приклад:

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

errorOptions

Дозволяє встановити різні комбінації сповіщень про помилки всередині xml.
Враховуючи тест Jasmine, такий як expect(true).toBe(false, 'my custom message'), ви отримаєте таку помилку тесту:

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

Тому ви можете вибрати який ключ буде використовуватися де, дивіться приклад нижче.

Тип: Object,
За замовчуванням: errorOptions: { error: "message" }
Приклад:

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

addWorkerLogs

Необов'язковий параметр, встановіть цей параметр на true, щоб прикріпити журнали консолі з тесту в репортері.

Тип: Boolean
За замовчуванням: false
Приклад:

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

Додавання користувацьких властивостей до тестових випадків

Цей плагін надає функцію addProperty(name, value). Ця функція може бути використана для додавання додаткових властивостей тестового випадку junit до поточного кроку тесту. Ці властивості будуть відображатися у результуючому xml як <property name="${name}" value="${value}" />.

Типовий випадок використання - додавання посилання на проблему або тестовий випадок.

Приклад використання

Приклад для mocha:

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

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

Налаштування Jenkins

Нарешті, вам потрібно повідомити вашому CI-завданню (наприклад, Jenkins), де він може знайти xml-файл. Для цього додайте дію після збірки до вашого завдання, яка виконується після запуску тесту, і вкажіть Jenkins (або вашу бажану CI-систему) на ваші результати тестів XML:

Point Jenkins to XML files

Якщо у вашій CI-системі немає такого кроку після збірки, ймовірно, десь в інтернеті є плагін для цього.


Для отримання додаткової інформації про WebdriverIO, дивіться домашню сторінку.

Welcome! How can I help?

WebdriverIO AI Copilot