Aller au contenu principal

Rapporteur Slack Reporter

wdio-slack-reporter est un package tiers, pour plus d'informations veuillez consulter GitHub | npm

version downloads license webdriverio

Rapporteur de WebdriverIO utilisant Incoming webhook et Web API pour envoyer les résultats à Slack.

📢 Avis Important

Migration vers filesUploadV2 en raison de la dépréciation de files.upload

Capture d'écran de notification Slack

Notification

Politique de support des versions WebdriverIO

Les versions WebdriverIO prises en charge dans ce projet suivent la politique de support de WebdriverIO. La politique de support de WebdriverIO peut être consultée ici.

Installation

La façon la plus simple est de garder @moroo/wdio-slack-reporter comme devDependency dans votre package.json.

{
"devDependencies": {
"@moroo/wdio-slack-reporter": "^9.0.0"
}
}

Vous pouvez simplement le faire par:

  • NPM
npm install @moroo/wdio-slack-reporter --save-dev
  • Yarn
yarn add -D @moroo/wdio-slack-reporter

Les instructions sur la façon d'installer WebdriverIO peuvent être trouvées ici.

Configuration

Pour utiliser le rapporteur, vous devez ajouter slack à votre tableau de rapporteurs dans 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...',
},
},
],
],
};

Options de configuration

Les options de configuration suivantes sont prises en charge. Pour que les notifications soient envoyées, vous devez définir webhook ou web-api. Si web-api et webhook sont tous deux définis, web-api est utilisé.

Webhook (Incoming Webhook)

webhook (Obligatoire)

Incoming Webhook du canal slack vers lequel les notifications doivent être envoyées. Si l'URL n'est pas configurée, les notifications ne seront pas envoyées.

  • Portée: webhook
  • Type: string

username (Optionnel)

La valeur de username apparaîtra dans la notification slack comme l'utilisateur qui l'a envoyée.

  • Portée: webhook
  • Type: string
  • Défaut: "WebdriverIO Reporter"

icon_url (Optionnel)

L'url de l'icône à afficher dans slack

  • Portée: webhook
  • Type: string
  • Défaut: "https://webdriver.io/img/webdriverio.png"

[!TIP] Outre celles-ci, toutes les options définies dans la spécification Slack Incoming Webhook peuvent également être utilisées.

Web API (Slack Bot)

token (Obligatoire)

Web API du canal slack vers lequel les notifications doivent être envoyées. Un jeton d'utilisateur bot est requis. Les jetons d'accès du bot commencent toujours par xoxb. Le jeton du bot nécessite la portée OAuth de chat:write, files:write. Voir ci-dessous pour plus de détails.

  • Portée: web-api
  • Type: string

channel (Obligatoire)

Canal, groupe privé ou canal IM auquel envoyer le message. Peut être un ID encodé ou un nom. Voir ci-dessous pour plus de détails. "Comment trouver l'ID du canal" - stackoverflow -

  • Portée: web-api
  • Type: string

[!TIP] Outre celles-ci, toutes les options définies dans la spécification Slack Web API peuvent également être utilisées.

uploadScreenshotOfFailedCase (Optionnel)

Définissez cette option sur true pour joindre une capture d'écran au cas d'échec.

  • Portée: web-api
  • Type: boolean
  • Défaut: true

notifyDetailResultThread (Optionnel)

Cette option ne fonctionne que lorsque l'option notifyTestFinishMessage est true.

Définissez cette option sur true si vous souhaitez ajouter un thread avec les détails des résultats à la notification des résultats de test publiée sur Slack.

  • Portée: web-api
  • Type: boolean
  • Défaut: true

filterForDetailResults (Optionnel)

Cette option ne fonctionne que lorsque l'option notifyDetailResultThread est true.

Ajoutez le filtre que vous souhaitez à cette option dans le tableau et les résultats détaillés seront filtrés dans Slack et envoyés au thread. (S'il n'y a pas de filtres (tableau vide ou non défini), tous les filtres sont appliqués.) Liste des filtres: passed, failed, pending, skipped

  • Portée: web-api
  • Type: array (passed | failed | pending | skipped)
  • Défaut: ['passed', 'failed', 'pending', 'skipped']

createScreenshotPayload (Optionnel)

Cette option personnalise la charge utile qui est téléchargée de la capture d'écran pour l'échec du test.

  • Portée: web-api
  • Type: function

createResultDetailPayload (Optionnel)

Cette option personnalise la charge utile qui est notifiée des résultats détaillés du test.

  • Portée: web-api
  • Type: function

Commun

title (Optionnel)

Définissez cette option sur le titre du test.

  • Portée: webhook, web-api
  • Type: string

resultsUrl (Optionnel)

Fournissez un lien vers les résultats du test. C'est un lien cliquable dans la notification.

  • Portée: webhook, web-api
  • Type: string

notifyTestStartMessage (Optionnel)

Définissez cette option sur true pour envoyer des notifications de début de test.

  • Portée: webhook, web-api
  • Type: boolean
  • Défaut: true

notifyFailedCase (Optionnel)

Définissez cette option sur true pour joindre les cas échoués dans les résultats de test rapportés à Slack.

  • Portée: webhook, web-api
  • Type: boolean
  • Défaut: true

notifyTestFinishMessage (Optionnel)

Définissez cette option sur true pour envoyer des notifications de fin de test.

  • Portée: webhook, web-api
  • Type: boolean
  • Défaut: true

useScenarioBasedStateCounts (Optionnel) - Seulement Cucumber

Définissez cette option sur true pour changer le comptage d'état de test (étapes) basé à scénario basé. (Seulement Cucumber)

  • Portée: webhook, web-api
  • Type: boolean
  • Défaut: false

emojiSymbols (Optionnel)

Cette option change l'ensemble d'emoji défini par défaut.

  • Portée: webhook, web-api
  • Type: object
  • Défaut:
    • passed - ✅ :white_check_mark:
    • failed - ❌ :x:
    • skipped - ⏸ :double_vertical_bar:
    • pending - ❔ :grey_question:
    • start - 🚀 :rocket:
    • finished - 🏁 :checkered_flag:
    • watch - ⏱ :stopwatch:

createStartPayload (Optionnel)

Cette option personnalise la charge utile qui est notifiée au début du test.

  • Portée: webhook, web-api
  • Type: function

createFailedTestPayload (Optionnel)

Cette option personnalise la charge utile qui est notifiée lors de l'échec du test.

  • Portée: webhook, web-api
  • Type: function

createResultPayload (Optionnel)

Cette option personnalise la charge utile qui est notifiée des résultats du test.

  • Portée: webhook, web-api
  • Type: function

Utiliser l'Incoming Webhook

Si vous utilisez webhook, vous ne pouvez pas utiliser les fils de discussion et le téléchargement.
Par conséquent, les fonctions liées à upload et thread ne sont pas disponibles.

Exemple de configuration

// wdio.conf.js
import SlackReporter from "@moroo/wdio-slack-reporter";

export.config = {
reporters: [
[
SlackReporter, {
// Définir les options Slack utilisées pour 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",
},
// Définir le titre du test.
title: 'Slack Reporter Test',
// Définir l'URL des résultats de test.
resultsUrl: process.env.JENKINS_URL,
// Définir la notification de fin de test
notifyTestFinishMessage: true,
// Définir le comptage d'état basé sur les scénarios (Seulement Cucumber)
useScenarioBasedStateCounts: true,
// Personnaliser les symboles Emoji Slack.
emojiSymbols: {
passed: ':white_check_mark:',
failed: ':x:',
skipped: ':double_vertical_bar:',
pending: ':grey_question:',
start: ':rocket:',
finished: ':checkered_flag:',
watch: ':stopwatch:'
},
// Remplacer la fonction createStartPayload.
createStartPayload: function (runnerStats: RunnerStats): IncomingWebhookSendArguments {
const payload: IncomingWebhookSendArguments = {
// faire quelque chose...
}
return payload;
},
// Remplacer la fonction createFailedTestPayload.
createFailedTestPayload: function (testStats: TestStats): IncomingWebhookSendArguments {
const payload: IncomingWebhookSendArguments = {
// faire quelque chose...
}
return payload;
},
// Remplacer la fonction createResultPayload.
createResultPayload: function (runnerStats: RunnerStats, stateCounts: StateCount): IncomingWebhookSendArguments {
const payload: IncomingWebhookSendArguments = {
// faire quelque chose...
}
return payload;
}
}
],
],
};

Utiliser la Web API

Pour utiliser l'API, vous avez besoin de portées comme celle ci-dessous.
chat:write, files:write. Voir ci-dessous pour plus de détails.

Exemple de configuration

// wdio.conf.js
import SlackReporter from "@moroo/wdio-slack-reporter";

export.config = {
reporters: [
[
SlackReporter, {
// Définir les options Slack utilisées pour web-api.
slackOptions: {
type: 'web-api',
token: process.env.SLACK_BOT_TOKEN || "xoxb-xxxxxxxxxx-xxxxxx...",,
channel: process.env.SLACK_CHANNEL || "Cxxxxxxxxxx",
// Définissez cette option sur true pour joindre une capture d'écran au cas d'échec.
uploadScreenshotOfFailedCase: true,
// Définissez cette option sur true si vous souhaitez ajouter un thread avec des détails de résultats à la notification des résultats de test publiée sur Slack.
notifyDetailResultThread: true,
// Définir le filtre pour les résultats détaillés. (tableau vide ou non défini, tous les filtres sont appliqués.)
filterForDetailResults: [
'passed',
'failed',
'pending',
'skipped'
],
// Remplacer la fonction createScreenshotPayload.
createScreenshotPayload: function (testStats: TestStats, screenshotBuffer: string | Buffer<ArrayBufferLike>): FilesUploadArguments {
const payload: FilesUploadArguments = {
// faire quelque chose...
}
return payload;
},
// Remplacer la fonction createResultDetailPayload.
createResultDetailPayload: function (runnerStats: RunnerStats, stateCounts: StateCount): ChatPostMessageArguments {
const payload: ChatPostMessageArguments = {
// faire quelque chose...
}
return payload;
}
},
// Définir le titre du test.
title: 'Slack Reporter Test',
// Définir l'URL des résultats de test.
resultsUrl: process.env.JENKINS_URL,
// Définir la notification de fin de test
notifyTestFinishMessage: true,
// Définir le comptage d'état basé sur les scénarios (Seulement Cucumber)
useScenarioBasedStateCounts: true,
// Personnaliser les symboles Emoji Slack.
emojiSymbols: {
passed: ':white_check_mark:',
failed: ':x:',
skipped: ':double_vertical_bar:',
pending: ':grey_question:',
start: ':rocket:',
finished: ':checkered_flag:',
watch: ':stopwatch:'
},
// Remplacer la fonction createStartPayload.
createStartPayload: function (runnerStats: RunnerStats): IncomingWebhookSendArguments {
const payload: IncomingWebhookSendArguments = {
// faire quelque chose...
}
return payload;
},
// Remplacer la fonction createFailedTestPayload.
createFailedTestPayload: function (testStats: TestStats): IncomingWebhookSendArguments {
const payload: IncomingWebhookSendArguments = {
// faire quelque chose...
}
return payload;
},
// Remplacer la fonction createResultPayload.
createResultPayload: function (runnerStats: RunnerStats, stateCounts: StateCount): IncomingWebhookSendArguments {
const payload: IncomingWebhookSendArguments = {
// faire quelque chose...
}
return payload;
}
}
],
],
};

API prise en charge

getResultsUrl

type: () => string | undefined

Obtenir l'URL des résultats.

// getResultsUrl.spec.ts
import SlackReporter from '@moroo/wdio-slack-reporter';

describe('Obtenir la valeur resultsUrl', function () {
before(function () {
const resultsUrl = SlackReporter.getResultsUrl();
if (resultsUrl) {
// faire quelque chose...
}
});
it('Faire quelque chose', function () {
// faire quelque chose...
});
});

setResultsUrl

type: (url: string) => void

Définir l'URL des résultats.
(Ceci est utile si l'URL avec les résultats de test change à chaque fois.)

// setResultsUrl.spec.ts
import SlackReporter from '@moroo/wdio-slack-reporter';
import { RESULTS_URL } from '../constants';

describe('Définir la valeur resultsUrl', function () {
before(function () {
const resultsUrl = RESULTS_URL + new Date().toISOString();
SlackReporter.setResultsUrl(resultsUrl);
});
it('Faire quelque chose', function () {
// faire quelque chose...
});
});

uploadFailedTestScreenshot

type: (data: string | Buffer<ArrayBufferLike>) => void

Ajouter une capture d'écran en tant que thread à la notification de test échoué.
(Si vous utilisez un webhook, cela affichera un avertissement et ne fera rien.)

// console du terminal
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

type: (payload: ChatPostMessageArguments) => Promise<WebAPICallResult>

Publier un message sur Slack.
(Si vous utilisez un webhook, cela générera une erreur.)

// console du terminal
ERROR @moroo/slack-wdio-reporter: Not using web-api.
// post.spec.ts
import SlackReporter, {
ChatPostMessageArguments,
WebAPICallResult,
} from '@moroo/wdio-slack-reporter';

describe('Test de la fonction Post', function () {
it('Publier un message', async function () {
const payload: ChatPostMessageArguments = {
// faire quelque chose...
};
const result: WebAPICallResult = await SlackReporter.post(payload);
});
});

upload

type: ({ payload: FilesUploadArguments; options: FilesUploadV2Options }) => Promise<WebAPICallResult & {files: FilesCompleteUploadExternalResponse[];}>

Télécharger un fichier sur Slack.
(Si vous utilisez un webhook, cela générera une erreur.)

// console du terminal
ERROR @moroo/slack-wdio-reporter: Not using web-api.
// upload.spec.ts
import SlackReporter, {
FilesUploadArguments,
WebAPICallResult,
} from '@moroo/wdio-slack-reporter';

describe('Test de la fonction Upload', function () {
it('Télécharger des fichiers', async function () {
const payload: FilesUploadArguments = {
// faire quelque chose...
};
const options: FilesUploadV2Options = {
waitForUpload: true,
retry: 3,
interval: 1000,
};
const result: WebAPICallResult = await SlackReporter.upload({
payload,
options,
});
});
});

send

type: (payload: IncomingWebhookSendArguments) => Promise<IncomingWebhookResult>

Envoyer un message à Slack.
(Si vous utilisez une web-api, cela générera une erreur.)

// console du terminal
ERROR @moroo/slack-wdio-reporter: Not using webhook.
// send.spec.ts
import SlackReporter, {
IncomingWebhookSendArguments,
IncomingWebhookResult,
} from '@moroo/wdio-slack-reporter';

describe('Test de la fonction Send', function () {
it('Envoyer un message', async function () {
const payload: IncomingWebhookSendArguments = {
// faire quelque chose...
};
const result: IncomingWebhookResult = await SlackReporter.send(payload);
});
});

Ajouter une capture d'écran

Si vous souhaitez ajouter une capture d'écran en tant que thread à la notification de test échoué, ajoutez la fonction uploadFailedTestScreenshot après avoir pris la capture d'écran.

// wdio.conf.js
export.config = {
afterTest: async function (test, context, result) {
if (error) {
const result = await browser.takeScreenshot();
SlackReporter.uploadFailedTestScreenshot(result);
}
}
}

Problèmes connus

Non synchronisé

Si l'erreur suivante se produit, définissez reporterSyncInterval, reporterSyncTimeout dans wdio.conf.js.

ERROR @wdio/runner: Error: Some reporters are still unsynced: SlackReporter
//wdio.conf.js
export.config = {
//
// Détermine à quel intervalle le rapporteur doit vérifier s'ils sont synchronisés s'ils rapportent leurs journaux de manière asynchrone (par exemple, si les journaux sont diffusés vers un fournisseur tiers).
reporterSyncInterval: 500,
// Détermine le temps maximum dont disposent les rapporteurs pour terminer le téléchargement de tous leurs journaux jusqu'à ce qu'une erreur soit générée par le testrunner.
reporterSyncTimeout: 20000,
}

Option Jasmine - expectationResultHandler

L'ajout de la fonction uploadFailedTestScreenshot ici ne fonctionne pas non plus.
C'est parce que la fonction fonctionne après chaque test, donc le test actuel est inconnu.

// wdio.conf.js
export.config = {
jasmineOpts: {
// Délai d'attente par défaut de Jasmine
defaultTimeoutInterval: 60000,
//
// Le framework Jasmine permet l'interception de chaque assertion afin de journaliser l'état de l'application
// ou du site Web en fonction du résultat. Par exemple, il est assez pratique de prendre une capture d'écran chaque fois
// qu'une assertion échoue.
expectationResultHandler: function (passed, assertion) {
if (passed) {
return;
}
/*
L'ajout de la fonction uploadFailedTestScreenshot ici ne fonctionne pas non plus.
C'est parce que la fonction fonctionne après chaque test, donc le test actuel est inconnu.

[x] const result = await browser.takeScreenshot();
[x] SlackReporter.uploadFailedTestScreenshot(result);
*/
},
},

// Ajoutez-le ici.
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