Przejdź do głównej treści

Reporter Slack Reporter

wdio-slack-reporter to pakiet zewnętrzny, więcej informacji można znaleźć na GitHub | npm

version downloads license webdriverio

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

Notification

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:

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

Welcome! How can I help?

WebdriverIO AI Copilot