Reporter do Slack
wdio-slack-reporter é um pacote de terceiros, para mais informações, consulte GitHub | npm
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

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:
- passed - ✅
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);
}
}
}