Reporter Slack Reporter
wdio-slack-reporter to pakiet zewnętrzny, więcej informacji można znaleźć na GitHub | npm
Reporter z WebdriverIO wykorzystujący Incoming webhook i Web API do wysyłania wyników do Slack.
📢 Ważna informacja
Migracja do filesUploadV2 z powodu wycofania files.upload
Zrzut ekranu powiadomienia Slack

Polityka wsparcia wersji WebdriverIO
Wersje WebdriverIO wspierane w tym projekcie są zgodne z polityką wsparcia WebdriverIO. Politykę wsparcia WebdriverIO można sprawdzić tutaj.
Instalacja
Najprostszym sposobem jest utrzymywanie @moroo/wdio-slack-reporter
jako devDependency w twoim pliku package.json
.
{
"devDependencies": {
"@moroo/wdio-slack-reporter": "^9.0.0"
}
}
Możesz to łatwo zrobić za pomocą:
- NPM
npm install @moroo/wdio-slack-reporter --save-dev
- Yarn
yarn add -D @moroo/wdio-slack-reporter
Instrukcje dotyczące instalacji WebdriverIO
można znaleźć tutaj.
Konfiguracja
Aby używać reportera, musisz dodać slack do tablicy reporters w pliku wdio.conf.js
// wdio.conf.js
import SlackReporter from '@moroo/wdio-slack-reporter';
export const config: WebdriverIO.Config = {
reporters: [
[
SlackReporter,
{
slackOptions: {
type: 'web-api',
channel: process.env.SLACK_CHANNEL || 'Cxxxxxxxxxx',
token: process.env.SLACK_BOT_TOKEN || 'xoxb-xxxxxxxxxx-xxxxxx...',
},
},
],
],
};
Opcje konfiguracji
Wspierane są następujące opcje konfiguracji.
Aby powiadomienia były wysyłane, musisz ustawić webhook
lub web-api
.
Jeśli zarówno web-api
jak i webhook
są ustawione, używany jest web-api
.
Webhook (Incoming Webhook)
webhook (Wymagane
)
Incoming Webhook kanału slack, do którego powinny być wysyłane powiadomienia. Jeśli URL nie jest skonfigurowany, powiadomienia nie będą wysyłane.
- Zakres:
webhook
- Typ:
string
username (Opcjonalne
)
Wartość username pojawi się w powiadomieniu slack jako użytkownik, który je wysłał.
- Zakres:
webhook
- Typ:
string
- Domyślnie:
"WebdriverIO Reporter"
icon_url (Opcjonalne
)
Adres URL ikony, która będzie wyświetlana w Slack
- Zakres:
webhook
- Typ:
string
- Domyślnie:
"https://webdriver.io/img/webdriverio.png"
[!TIP] Oprócz tych opcji, można również użyć wszystkich opcji zdefiniowanych w specyfikacji Slack Incoming Webhook.
Web API (Slack Bot)
token (Wymagane
)
Web API kanału slack, do którego powinny być wysyłane powiadomienia. Wymagany jest token użytkownika bota. Tokeny dostępu botów zawsze zaczynają się od xoxb
.
Token bota wymaga zakresu OAuth chat:write
, files:write
.
Zobacz poniżej, aby uzyskać więcej szczegółów.
- Zakres:
web-api
- Typ:
string
channel (Wymagane
)
Kanał, prywatna grupa lub kanał IM, do którego wysyłana jest wiadomość. Może być zakodowanym ID lub nazwą. Zobacz poniżej, aby uzyskać więcej szczegółów.
"Jak znaleźć ID kanału" - stackoverflow -
- Zakres:
web-api
- Typ:
string
[!TIP] Oprócz tych opcji, można również użyć wszystkich opcji zdefiniowanych w specyfikacji Slack Web API.
uploadScreenshotOfFailedCase (Opcjonalne
)
Ustaw tę opcję na true, aby dołączyć zrzut ekranu do nieudanego przypadku.
- Zakres:
web-api
- Typ:
boolean
- Domyślnie:
true
notifyDetailResultThread (Opcjonalne
)
Ta opcja działa tylko wtedy, gdy opcja notifyTestFinishMessage jest ustawiona na true.
Ustaw tę opcję na true, jeśli chcesz dodać wątek ze szczegółami wyników do powiadomienia o wynikach testu publikowanego w Slack.
- Zakres:
web-api
- Typ:
boolean
- Domyślnie:
true
filterForDetailResults (Opcjonalne
)
Ta opcja działa tylko wtedy, gdy opcja notifyDetailResultThread jest ustawiona na true.
Dodaj filtry, które chcesz zastosować, do tej tablicy, a szczegółowe wyniki zostaną przefiltrowane w Slack i wysłane do wątku.
(Jeśli nie ma filtrów (tablica jest pusta lub niezdefiniowana), stosowane są wszystkie filtry.)
Lista filtrów: passed
, failed
, pending
, skipped
- Zakres:
web-api
- Typ:
array (passed | failed | pending | skipped)
- Domyślnie:
['passed', 'failed', 'pending', 'skipped']
createScreenshotPayload (Opcjonalne
)
Ta opcja dostosowuje ładunek, który jest przesyłany w postaci zrzutu ekranu dla niepowodzenia testu.
- Zakres:
web-api
- Typ:
function
createResultDetailPayload (Opcjonalne
)
Ta opcja dostosowuje ładunek, który jest powiadamiany o szczegółowych wynikach testu.
- Zakres:
web-api
- Typ:
function
Wspólne
title (Opcjonalne
)
Ustaw tę opcję na tytuł testu.
- Zakres:
webhook
,web-api
- Typ:
string
resultsUrl (Opcjonalne
)
Podaj link do wyników testu. Jest to klikalny link w powiadomieniu.
- Zakres:
webhook
,web-api
- Typ:
string
notifyTestStartMessage (Opcjonalne
)
Ustaw tę opcję na true, aby wysyłać powiadomienia o rozpoczęciu testu.
- Zakres:
webhook
,web-api
- Typ:
boolean
- Domyślnie:
true
notifyFailedCase (Opcjonalne
)
Ustaw tę opcję na true, aby dołączyć nieudane przypadki w wynikach testu raportowanych do Slack.
- Zakres:
webhook
,web-api
- Typ:
boolean
- Domyślnie:
true
notifyTestFinishMessage (Opcjonalne
)
Ustaw tę opcję na true, aby wysyłać powiadomienia o zakończeniu testu.
- Zakres:
webhook
,web-api
- Typ:
boolean
- Domyślnie:
true
useScenarioBasedStateCounts (Opcjonalne
) - Tylko Cucumber
Ustaw tę opcję na true, aby zmienić liczbę stanów z testu (kroków) na opartą na scenariuszu. (Tylko Cucumber)
- Zakres:
webhook
,web-api
- Typ:
boolean
- Domyślnie:
false
emojiSymbols (Opcjonalne
)
Ta opcja zmienia domyślnie ustawiony zestaw emoji.
- Zakres:
webhook
,web-api
- Typ:
object
- Domyślnie:
- passed - ✅
:white_check_mark:
- failed - ❌
:x:
- skipped - ⏸
:double_vertical_bar:
- pending - ❔
:grey_question:
- start - 🚀
:rocket:
- finished - 🏁
:checkered_flag:
- watch - ⏱
:stopwatch:
- passed - ✅
createStartPayload (Opcjonalne
)
Ta opcja dostosowuje ładunek, który jest powiadamiany na początku testu.
- Zakres:
webhook
,web-api
- Typ:
function
createFailedTestPayload (Opcjonalne
)
Ta opcja dostosowuje ładunek, który jest powiadamiany w przypadku niepowodzenia testu.
- Zakres:
webhook
,web-api
- Typ:
function
createResultPayload (Opcjonalne
)
Ta opcja dostosowuje ładunek, który jest powiadamiany o wynikach testu.
- Zakres:
webhook
,web-api
- Typ:
function
Używanie Incoming Webhook
Jeśli używasz webhook, nie możesz używać wątków i przesyłać plików.
Dlatego funkcje związane z upload
i thread
nie są dostępne.
Przykład konfiguracji
// wdio.conf.js
import SlackReporter from "@moroo/wdio-slack-reporter";
export.config = {
reporters: [
[
SlackReporter, {
// Ustaw opcje Slack używające webhook.
slackOptions: {
type: 'webhook',
webhook: process.env.SLACK_WEBHOOK_URL || "https://hooks.slack.com/........",
username: "WebdriverIO Reporter",
"icon-url": "https://webdriver.io/img/webdriverio.png",
},
// Ustaw tytuł testu.
title: 'Slack Reporter Test',
// Ustaw URL wyników testu.
resultsUrl: process.env.JENKINS_URL,
// Ustaw powiadomienie o zakończeniu testu
notifyTestFinishMessage: true,
// Ustaw licznik stanów oparty na scenariuszu (tylko Cucumber)
useScenarioBasedStateCounts: true,
// Dostosuj symbole emoji Slack.
emojiSymbols: {
passed: ':white_check_mark:',
failed: ':x:',
skipped: ':double_vertical_bar:',
pending: ':grey_question:',
start: ':rocket:',
finished: ':checkered_flag:',
watch: ':stopwatch:'
},
// Zastąp funkcję createStartPayload.
createStartPayload: function (runnerStats: RunnerStats): IncomingWebhookSendArguments {
const payload: IncomingWebhookSendArguments = {
// zrób coś...
}
return payload;
},
// Zastąp funkcję createFailedTestPayload.
createFailedTestPayload: function (testStats: TestStats): IncomingWebhookSendArguments {
const payload: IncomingWebhookSendArguments = {
// zrób coś...
}
return payload;
},
// Zastąp funkcję createResultPayload.
createResultPayload: function (runnerStats: RunnerStats, stateCounts: StateCount): IncomingWebhookSendArguments {
const payload: IncomingWebhookSendArguments = {
// zrób coś...
}
return payload;
}
}
],
],
};
Używanie Web API
Aby korzystać z API, potrzebujesz zakresów takich jak poniżej.
chat:write
, files:write
. Zobacz poniżej, aby uzyskać więcej szczegółów.
Przykład konfiguracji
// wdio.conf.js
import SlackReporter from "@moroo/wdio-slack-reporter";
export.config = {
reporters: [
[
SlackReporter, {
// Ustaw opcje Slack używające web-api.
slackOptions: {
type: 'web-api',
token: process.env.SLACK_BOT_TOKEN || "xoxb-xxxxxxxxxx-xxxxxx...",,
channel: process.env.SLACK_CHANNEL || "Cxxxxxxxxxx",
// Ustaw tę opcję na true, aby dołączyć zrzut ekranu do nieudanego przypadku.
uploadScreenshotOfFailedCase: true,
// Ustaw tę opcję na true, jeśli chcesz dodać wątek ze szczegółami wyników do powiadomienia o wynikach testu publikowanego w Slack.
notifyDetailResultThread: true,
// Ustaw filtry dla szczegółowych wyników. (jeśli tablica jest pusta lub niezdefiniowana, stosowane są wszystkie filtry.)
filterForDetailResults: [
'passed',
'failed',
'pending',
'skipped'
],
// Zastąp funkcję createScreenshotPayload.
createScreenshotPayload: function (testStats: TestStats, screenshotBuffer: string | Buffer<ArrayBufferLike>): FilesUploadArguments {
const payload: FilesUploadArguments = {
// zrób coś...
}
return payload;
},
// Zastąp funkcję createResultDetailPayload.
createResultDetailPayload: function (runnerStats: RunnerStats, stateCounts: StateCount): ChatPostMessageArguments {
const payload: ChatPostMessageArguments = {
// zrób coś...
}
return payload;
}
},
// Ustaw tytuł testu.
title: 'Slack Reporter Test',
// Ustaw URL wyników testu.
resultsUrl: process.env.JENKINS_URL,
// Ustaw powiadomienie o zakończeniu testu
notifyTestFinishMessage: true,
// Ustaw licznik stanów oparty na scenariuszu (tylko Cucumber)
useScenarioBasedStateCounts: true,
// Dostosuj symbole emoji Slack.
emojiSymbols: {
passed: ':white_check_mark:',
failed: ':x:',
skipped: ':double_vertical_bar:',
pending: ':grey_question:',
start: ':rocket:',
finished: ':checkered_flag:',
watch: ':stopwatch:'
},
// Zastąp funkcję createStartPayload.
createStartPayload: function (runnerStats: RunnerStats): IncomingWebhookSendArguments {
const payload: IncomingWebhookSendArguments = {
// zrób coś...
}
return payload;
},
// Zastąp funkcję createFailedTestPayload.
createFailedTestPayload: function (testStats: TestStats): IncomingWebhookSendArguments {
const payload: IncomingWebhookSendArguments = {
// zrób coś...
}
return payload;
},
// Zastąp funkcję createResultPayload.
createResultPayload: function (runnerStats: RunnerStats, stateCounts: StateCount): IncomingWebhookSendArguments {
const payload: IncomingWebhookSendArguments = {
// zrób coś...
}
return payload;
}
}
],
],
};
Wspierane API
getResultsUrl
typ:
() => string | undefined
Pobierz URL wyników.
// getResultsUrl.spec.ts
import SlackReporter from '@moroo/wdio-slack-reporter';
describe('Pobierz wartość resultsUrl', function () {
before(function () {
const resultsUrl = SlackReporter.getResultsUrl();
if (resultsUrl) {
// zrób coś...
}
});
it('Zrób coś', function () {
// zrób coś...
});
});
setResultsUrl
typ:
(url: string) => void
Ustaw URL wyników.
(Jest to przydatne, jeśli URL z wynikami testu zmienia się za każdym razem.)
// setResultsUrl.spec.ts
import SlackReporter from '@moroo/wdio-slack-reporter';
import { RESULTS_URL } from '../constants';
describe('Ustaw wartość resultsUrl', function () {
before(function () {
const resultsUrl = RESULTS_URL + new Date().toISOString();
SlackReporter.setResultsUrl(resultsUrl);
});
it('Zrób coś', function () {
// zrób coś...
});
});
uploadFailedTestScreenshot
typ:
(data: string | Buffer<ArrayBufferLike>) => void
Dodaj zrzut ekranu jako wątek do powiadomienia o nieudanym teście.
(Jeśli używasz webhook, spowoduje to wyświetlenie ostrzeżenia i nic nie zrobi.)
// terminal console
WARN @moroo/slack-wdio-reporter: Not using web-api or disabled notifyFailedCase or uploadScreenshotOfFailedCase options.
// wdio.conf.js
export.config = {
afterTest: async function (test, context, result) {
if (error) {
const result = await browser.takeScreenshot();
SlackReporter.uploadFailedTestScreenshot(result);
}
}
}
postMessage
typ:
(payload: ChatPostMessageArguments) => Promise<WebAPICallResult>
Opublikuj wiadomość w Slack.
(Jeśli używasz webhook, spowoduje to błąd.)
// terminal console
ERROR @moroo/slack-wdio-reporter: Not using web-api.
// post.spec.ts
import SlackReporter, {
ChatPostMessageArguments,
WebAPICallResult,
} from '@moroo/wdio-slack-reporter';
describe('Test funkcji Post', function () {
it('Opublikuj wiadomość', async function () {
const payload: ChatPostMessageArguments = {
// zrób coś...
};
const result: WebAPICallResult = await SlackReporter.post(payload);
});
});
upload
typ:
({ payload: FilesUploadArguments; options: FilesUploadV2Options }) => Promise<WebAPICallResult & {files: FilesCompleteUploadExternalResponse[];}>
Prześlij plik do Slack.
(Jeśli używasz webhook, spowoduje to błąd.)
// terminal console
ERROR @moroo/slack-wdio-reporter: Not using web-api.
// upload.spec.ts
import SlackReporter, {
FilesUploadArguments,
WebAPICallResult,
} from '@moroo/wdio-slack-reporter';
describe('Test funkcji Upload', function () {
it('Prześlij pliki', async function () {
const payload: FilesUploadArguments = {
// zrób coś...
};
const options: FilesUploadV2Options = {
waitForUpload: true,
retry: 3,
interval: 1000,
};
const result: WebAPICallResult = await SlackReporter.upload({
payload,
options,
});
});
});
send
typ:
(payload: IncomingWebhookSendArguments) => Promise<IncomingWebhookResult>
Wyślij wiadomość do Slack.
(Jeśli używasz web-api, spowoduje to błąd.)
// terminal console
ERROR @moroo/slack-wdio-reporter: Not using webhook.
// send.spec.ts
import SlackReporter, {
IncomingWebhookSendArguments,
IncomingWebhookResult,
} from '@moroo/wdio-slack-reporter';
describe('Test funkcji Send', function () {
it('Wyślij wiadomość', async function () {
const payload: IncomingWebhookSendArguments = {
// zrób coś...
};
const result: IncomingWebhookResult = await SlackReporter.send(payload);
});
});
Dodawanie zrzutu ekranu
Jeśli chcesz dodać zrzut ekranu jako wątek do powiadomienia o nieudanym teście, dodaj funkcję uploadFailedTestScreenshot
po wykonaniu zrzutu ekranu.
// wdio.conf.js
export.config = {
afterTest: async function (test, context, result) {
if (error) {
const result = await browser.takeScreenshot();
SlackReporter.uploadFailedTestScreenshot(result);
}
}
}
Znane problemy
Brak synchronizacji
Jeśli wystąpi następujący błąd, ustaw reporterSyncInterval
, reporterSyncTimeout
w wdio.conf.js
.
ERROR @wdio/runner: Error: Some reporters are still unsynced: SlackReporter
//wdio.conf.js
export.config = {
//
// Określa, w jakim interwale reporter powinien sprawdzać, czy są zsynchronizowane, jeśli raportują swoje logi asynchronicznie (np. jeśli logi są przekazywane do dostawcy zewnętrznego).
reporterSyncInterval: 500,
// Określa maksymalny czas, jaki reportery mają na zakończenie przesyłania wszystkich swoich logów, zanim zostanie zgłoszony błąd przez testrunner.
reporterSyncTimeout: 20000,
}
Opcja Jasmine - expectationResultHandler
Dodanie funkcji uploadFailedTestScreenshot tutaj również nie działa.
Dzieje się tak dlatego, że funkcja działa po każdym teście, więc aktualny test jest nieznany.
// wdio.conf.js
export.config = {
jasmineOpts: {
// Domyślny limit czasu Jasmine
defaultTimeoutInterval: 60000,
//
// Framework Jasmine umożliwia przechwytywanie każdej asercji w celu rejestrowania stanu aplikacji
// lub strony internetowej w zależności od wyniku. Na przykład, wygodnie jest robić zrzut ekranu za każdym razem
// gdy asercja nie powiedzie się.
expectationResultHandler: function (passed, assertion) {
if (passed) {
return;
}
/*
Dodanie funkcji uploadFailedTestScreenshot tutaj również nie działa.
Dzieje się tak dlatego, że funkcja działa po każdym teście, więc aktualny test jest nieznany.
[x] const result = await browser.takeScreenshot();
[x] SlackReporter.uploadFailedTestScreenshot(result);
*/
},
},
// Dodaj tutaj.
afterTest: async function (test, context, result) {
if (result.error) {
const result = await browser.takeScreenshot();
SlackReporter.uploadFailedTestScreenshot(result);
}
}
}