Pular para o conteúdo principal

Reporter do Slack

wdio-slack-reporter é um pacote de terceiros, para mais informações, consulte GitHub | npm

version downloads license webdriverio

Reporter do WebdriverIO usando Incoming webhook e Web API para enviar resultados para o Slack.

📢 Aviso Importante​

Migração para filesUploadV2 devido à descontinuação do files.upload​

Captura de tela da notificação do Slack​

Notification

Política de Suporte para Versões do WebdriverIO​

As versões do WebdriverIO suportadas neste projeto seguem a política de suporte do WebdriverIO. A política de suporte do WebdriverIO pode ser verificada aqui.

Instalação​

A maneira mais fácil é manter @moroo/wdio-slack-reporter como uma devDependency no seu package.json.

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

Você pode simplesmente fazer isso por:

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

Instruções sobre como instalar o WebdriverIO podem ser encontradas aqui.

Configuração​

Para usar o reporter, você precisa adicionar o slack ao seu array de reporters no 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...',
},
},
],
],
};

Opções de Configuração​

As seguintes opções de configuração são suportadas. Para que as notificações sejam enviadas, você deve configurar webhook ou web-api. Se tanto web-api quanto webhook estiverem configurados, web-api será usado.

Webhook (Incoming Webhook)​

webhook (Obrigatório)​

Incoming Webhook do canal do slack para o qual as notificações devem ser enviadas. Se a URL não estiver configurada, as notificações não serão enviadas.

  • Escopo: webhook
  • Tipo: string

username (Opcional)​

O valor de username aparecerá na notificação do slack como o usuário que a enviou.

  • Escopo: webhook
  • Tipo: string
  • Padrão: "WebdriverIO Reporter"

icon_url (Opcional)​

A url do Ícone a ser exibido no slack

  • Escopo: webhook
  • Tipo: string
  • Padrão: "https://webdriver.io/img/webdriverio.png"

[!TIP] Além destes, todas as opções definidas na especificação Slack Incoming Webhook também podem ser usadas.

Web API (Slack Bot)​

token (Obrigatório)​

Web API do canal do slack para o qual as notificações devem ser enviadas. Um token de usuário bot é necessário. Tokens de acesso de bot sempre começam com xoxb. O token de bot requer o escopo OAuth de chat:write, files:write. Veja abaixo para mais detalhes.

  • Escopo: web-api
  • Tipo: string

channel (Obrigatório)​

Canal, grupo privado ou canal IM para enviar mensagem. Pode ser um ID codificado ou um nome. Veja abaixo para mais detalhes. "Como encontrar o ID do canal" - stackoverflow -

  • Escopo: web-api
  • Tipo: string

[!TIP] Além destes, todas as opções definidas na especificação Slack Web API também podem ser usadas.

uploadScreenshotOfFailedCase (Opcional)​

Defina esta opção como true para anexar uma captura de tela ao caso com falha.

  • Escopo: web-api
  • Tipo: boolean
  • Padrão: true

notifyDetailResultThread (Opcional)​

Esta opção só funciona quando a opção notifyTestFinishMessage é true.

Defina esta opção como true se quiser adicionar thread com detalhes dos resultados à notificação de resultados de teste postada no Slack.

  • Escopo: web-api
  • Tipo: boolean
  • Padrão: true

filterForDetailResults (Opcional)​

Esta opção só funciona quando a opção notifyDetailResultThread é true.

Adicione o filtro que você deseja a esta opção para o array e os resultados detalhados serão filtrados no Slack e enviados para a thread. (Se não houver filtros (array vazio ou indefinido), todos os filtros são aplicados.) Lista de filtros: passed, failed, pending, skipped

  • Escopo: web-api
  • Tipo: array (passed | failed | pending | skipped)
  • Padrão: ['passed', 'failed', 'pending', 'skipped']

createScreenshotPayload (Opcional)​

Esta opção personaliza o payload que é carregado na captura de tela para a falha do teste.

  • Escopo: web-api
  • Tipo: function

createResultDetailPayload (Opcional)​

Esta opção personaliza o payload que é notificado com os resultados detalhados do teste.

  • Escopo: web-api
  • Tipo: function

Comum​

title (Opcional)​

Defina esta opção para o título do teste.

  • Escopo: webhook, web-api
  • Tipo: string

resultsUrl (Opcional)​

Forneça um link para os resultados do teste. É um link clicável na notificação.

  • Escopo: webhook, web-api
  • Tipo: string

notifyTestStartMessage (Opcional)​

Defina esta opção como true para enviar notificações de início de teste.

  • Escopo: webhook, web-api
  • Tipo: boolean
  • Padrão: true

notifyFailedCase (Opcional)​

Defina esta opção como true para anexar casos falhos nos resultados do teste relatados ao Slack.

  • Escopo: webhook, web-api
  • Tipo: boolean
  • Padrão: true

notifyTestFinishMessage (Opcional)​

Defina esta opção como true para enviar notificações de teste finalizado.

  • Escopo: webhook, web-api
  • Tipo: boolean
  • Padrão: true

useScenarioBasedStateCounts (Opcional) - Apenas para Cucumber​

Defina esta opção como true para mudar a contagem de estado de teste (etapas) para baseada em cenário. (Apenas Cucumber)

  • Escopo: webhook, web-api
  • Tipo: boolean
  • Padrão: false

emojiSymbols (Opcional)​

Esta opção altera o emoji definido por padrão.

  • Escopo: webhook, web-api
  • Tipo: object
  • Padrão:
    • passed - ✅ :white_check_mark:
    • failed - ❌ :x:
    • skipped - ⏸ :double_vertical_bar:
    • pending - ❔ :grey_question:
    • start - 🚀 :rocket:
    • finished - 🏁 :checkered_flag:
    • watch - ⏱ :stopwatch:

createStartPayload (Opcional)​

Esta opção personaliza o payload que é notificado no início do teste.

  • Escopo: webhook, web-api
  • Tipo: function

createFailedTestPayload (Opcional)​

Esta opção personaliza o payload que é notificado na falha do teste.

  • Escopo: webhook, web-api
  • Tipo: function

createResultPayload (Opcional)​

Esta opção personaliza o payload que é notificado dos resultados do teste.

  • Escopo: webhook, web-api
  • Tipo: function

Usar o Incoming Webhook​

Se você estiver usando webhook, não pode usar thread e upload.
Portanto, funções relacionadas a upload e thread não estão disponíveis.

Exemplo de Configuração​

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

export.config = {
reporters: [
[
SlackReporter, {
// Configure as Opções do Slack usando 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",
},
// Defina o Título do Teste.
title: 'Slack Reporter Test',
// Defina a URL dos Resultados do Teste.
resultsUrl: process.env.JENKINS_URL,
// Defina a notificação de Teste Finalizado
notifyTestFinishMessage: true,
// Defina a contagem de estado baseada em cenário (Apenas Cucumber)
useScenarioBasedStateCounts: true,
// Personalize os Símbolos de Emoji do Slack.
emojiSymbols: {
passed: ':white_check_mark:',
failed: ':x:',
skipped: ':double_vertical_bar:',
pending: ':grey_question:',
start: ':rocket:',
finished: ':checkered_flag:',
watch: ':stopwatch:'
},
// Substitua a função createStartPayload.
createStartPayload: function (runnerStats: RunnerStats): IncomingWebhookSendArguments {
const payload: IncomingWebhookSendArguments = {
// faça algo...
}
return payload;
},
// Substitua a função createFailedTestPayload.
createFailedTestPayload: function (testStats: TestStats): IncomingWebhookSendArguments {
const payload: IncomingWebhookSendArguments = {
// faça algo...
}
return payload;
},
// Substitua a função createResultPayload.
createResultPayload: function (runnerStats: RunnerStats, stateCounts: StateCount): IncomingWebhookSendArguments {
const payload: IncomingWebhookSendArguments = {
// faça algo...
}
return payload;
}
}
],
],
};

Usar a Web API​

Para usar a API, você precisa de escopos como os abaixo.
chat:write, files:write. Veja abaixo para mais detalhes.

Exemplo de Configuração​

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

export.config = {
reporters: [
[
SlackReporter, {
// Configure as Opções do Slack usando web-api.
slackOptions: {
type: 'web-api',
token: process.env.SLACK_BOT_TOKEN || "xoxb-xxxxxxxxxx-xxxxxx...",,
channel: process.env.SLACK_CHANNEL || "Cxxxxxxxxxx",
// Defina esta opção como true para anexar uma captura de tela ao caso com falha.
uploadScreenshotOfFailedCase: true,
// Defina esta opção como true se quiser adicionar thread com detalhes dos resultados à notificação de resultados de teste postada no Slack.
notifyDetailResultThread: true,
// Defina o Filtro para resultados detalhados. (array vazio ou indefinido, todos os filtros são aplicados.)
filterForDetailResults: [
'passed',
'failed',
'pending',
'skipped'
],
// Substitua a função createScreenshotPayload.
createScreenshotPayload: function (testStats: TestStats, screenshotBuffer: string | Buffer<ArrayBufferLike>): FilesUploadArguments {
const payload: FilesUploadArguments = {
// faça algo...
}
return payload;
},
// Substitua a função createResultDetailPayload.
createResultDetailPayload: function (runnerStats: RunnerStats, stateCounts: StateCount): ChatPostMessageArguments {
const payload: ChatPostMessageArguments = {
// faça algo...
}
return payload;
}
},
// Defina o Título do Teste.
title: 'Slack Reporter Test',
// Defina a URL dos Resultados do Teste.
resultsUrl: process.env.JENKINS_URL,
// Defina a notificação de Teste Finalizado
notifyTestFinishMessage: true,
// Defina a contagem de estado baseada em cenário (Apenas Cucumber)
useScenarioBasedStateCounts: true,
// Personalize os Símbolos de Emoji do Slack.
emojiSymbols: {
passed: ':white_check_mark:',
failed: ':x:',
skipped: ':double_vertical_bar:',
pending: ':grey_question:',
start: ':rocket:',
finished: ':checkered_flag:',
watch: ':stopwatch:'
},
// Substitua a função createStartPayload.
createStartPayload: function (runnerStats: RunnerStats): IncomingWebhookSendArguments {
const payload: IncomingWebhookSendArguments = {
// faça algo...
}
return payload;
},
// Substitua a função createFailedTestPayload.
createFailedTestPayload: function (testStats: TestStats): IncomingWebhookSendArguments {
const payload: IncomingWebhookSendArguments = {
// faça algo...
}
return payload;
},
// Substitua a função createResultPayload.
createResultPayload: function (runnerStats: RunnerStats, stateCounts: StateCount): IncomingWebhookSendArguments {
const payload: IncomingWebhookSendArguments = {
// faça algo...
}
return payload;
}
}
],
],
};

API Suportada​

getResultsUrl​

tipo: () => string | undefined

Obtenha a URL dos resultados.

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

describe('Obter o valor de resultsUrl', function () {
before(function () {
const resultsUrl = SlackReporter.getResultsUrl();
if (resultsUrl) {
// faça algo...
}
});
it('Fazer algo', function () {
// faça algo...
});
});

setResultsUrl​

tipo: (url: string) => void

Defina a URL dos resultados.
(Isso é útil se a URL com resultados de teste muda toda vez.)

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

describe('Definir o valor de resultsUrl', function () {
before(function () {
const resultsUrl = RESULTS_URL + new Date().toISOString();
SlackReporter.setResultsUrl(resultsUrl);
});
it('Fazer algo', function () {
// faça algo...
});
});

uploadFailedTestScreenshot​

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

Adicione uma captura de tela como uma thread à notificação de teste com falha.
(Se você estiver usando um webhook, isso exibirá um aviso e não fará nada.)

// console do 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​

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

Poste uma mensagem no Slack.
(Se você estiver usando um webhook, isso gerará um erro.)

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

describe('Teste da Função de Postagem', function () {
it('Postar uma mensagem', async function () {
const payload: ChatPostMessageArguments = {
// faça algo...
};
const result: WebAPICallResult = await SlackReporter.post(payload);
});
});

upload​

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

Carregue um arquivo para o Slack.
(Se você estiver usando um webhook, isso gerará um erro.)

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

describe('Teste da Função de Upload', function () {
it('Carregar arquivos', async function () {
const payload: FilesUploadArguments = {
// faça algo...
};
const options: FilesUploadV2Options = {
waitForUpload: true,
retry: 3,
interval: 1000,
};
const result: WebAPICallResult = await SlackReporter.upload({
payload,
options,
});
});
});

send​

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

Envie uma mensagem para o Slack.
(Se você estiver usando uma web-api, isso gerará um erro.)

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

describe('Teste da Função de Envio', function () {
it('Enviar uma mensagem', async function () {
const payload: IncomingWebhookSendArguments = {
// faça algo...
};
const result: IncomingWebhookResult = await SlackReporter.send(payload);
});
});

Adicionar Captura de Tela​

Se você quiser adicionar uma captura de tela como uma thread à notificação de teste com falha, adicione a função uploadFailedTestScreenshot após tirar a captura de tela.

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

Problemas Conhecidos​

Não Sincronizado​

Se o seguinte erro ocorrer, defina reporterSyncInterval, reporterSyncTimeout no wdio.conf.js.

ERROR @wdio/runner: Error: Some reporters are still unsynced: SlackReporter
//wdio.conf.js
export.config = {
//
// Determina em qual intervalo o reporter deve verificar se estão sincronizados se eles relatam seus logs de forma assíncrona (por exemplo, se os logs são transmitidos para um fornecedor de terceiros).
reporterSyncInterval: 500,
// Determina o tempo máximo que os reporters têm para terminar de fazer o upload de todos os seus logs até que um erro seja lançado pelo testrunner.
reporterSyncTimeout: 20000,
}

Opção do Jasmine - expectationResultHandler​

Adicionar a função uploadFailedTestScreenshot aqui também não funciona.
Isso porque a função funciona após cada teste, então o teste atual é desconhecido.

// wdio.conf.js
export.config = {
jasmineOpts: {
// Timeout padrão do Jasmine
defaultTimeoutInterval: 60000,
//
// O framework Jasmine permite a interceptação de cada asserção para registrar o estado da aplicação
// ou website dependendo do resultado. Por exemplo, é bastante útil tirar uma captura de tela toda vez
// que uma asserção falha.
expectationResultHandler: function (passed, assertion) {
if (passed) {
return;
}
/*
Adicionar a função uploadFailedTestScreenshot aqui também não funciona.
Isso porque a função funciona após cada teste, então o teste atual é desconhecido.

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

// Adicione aqui.
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