-
Notifications
You must be signed in to change notification settings - Fork 7
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
(Cucumber) Skip posting Slack messages when tests or feature files pass #36
Comments
@sherrylenegauci
// wdio.conf.ts
import SlackReporter, {
IncomingWebhookSendArguments,
IncomingWebhookResult,
} from '@moroo/wdio-slack-reporter';
export.config = {
/**
* Gets executed after all tests are done. You still have access to all global variables from
* the test.
* @param {number} result 0 - test pass, 1 - test fail
* @param {Array.<Object>} capabilities list of capabilities details
* @param {Array.<String>} specs List of spec file paths that ran
*/
after: async function (result, capabilities, specs) {
const payload: IncomingWebhookSendArguments = {
// do something...
};
const result: IncomingWebhookResult = await SlackReporter.send(payload);
},
/**
* Gets executed after all workers have shut down and the process is about to exit.
* An error thrown in the `onComplete` hook will result in the test run failing.
* @param {object} exitCode 0 - success, 1 - fail
* @param {object} config wdio configuration object
* @param {Array.<Object>} capabilities list of capabilities details
* @param {<Object>} results object containing test results
*/
onComplete: function (exitCode, config, capabilities, results) {
const payload: IncomingWebhookSendArguments = {
// do something...
};
const result: IncomingWebhookResult = await SlackReporter.send(payload);
},
} |
@morooLee Unfortunately I don't think the above solutions will work for us. I've tried implementing the after() hook above in the configuration file and as explained in the docs:
The wdio slack reporter has very useful functionality, this would be a nice tweak - to be able to turn on and off Slack notifications for different states. |
@morooLee do you think that it would be a feature that you could add please? |
@sherrylenegauci //
// =====
// Hooks
// =====
// WebdriverIO provides a several hooks you can use to interfere the test process in order to enhance
// it and build services around it. You can either apply a single function to it or an array of
// methods. If one of them returns with a promise, WebdriverIO will wait until that promise is
// resolved to continue.
//
/**
* Gets executed once before all workers get launched.
* @param {object} config wdio configuration object
* @param {Array.<Object>} capabilities list of capabilities details
*/
onPrepare: function (config, capabilities) {
},
/**
* Gets executed before a worker process is spawned and can be used to initialize specific service
* for that worker as well as modify runtime environments in an async fashion.
* @param {string} cid capability id (e.g 0-0)
* @param {object} caps object containing capabilities for session that will be spawn in the worker
* @param {object} specs specs to be run in the worker process
* @param {object} args object that will be merged with the main configuration once worker is initialized
* @param {object} execArgv list of string arguments passed to the worker process
*/
onWorkerStart: function (cid, caps, specs, args, execArgv) {
},
/**
* Gets executed after a worker process has exited.
* @param {string} cid capability id (e.g 0-0)
* @param {number} exitCode 0 - success, 1 - fail
* @param {object} specs specs to be run in the worker process
* @param {number} retries number of retries used
*/
onWorkerEnd: function (cid, exitCode, specs, retries) {
},
/**
* Gets executed before initializing the webdriver session and test framework. It allows you
* to manipulate configurations depending on the capability or spec.
* @param {object} config wdio configuration object
* @param {Array.<Object>} capabilities list of capabilities details
* @param {Array.<String>} specs List of spec file paths that are to be run
*/
beforeSession: function (config, capabilities, specs) {
},
/**
* Gets executed before test execution begins. At this point you can access to all global
* variables like `browser`. It is the perfect place to define custom commands.
* @param {Array.<Object>} capabilities list of capabilities details
* @param {Array.<String>} specs List of spec file paths that are to be run
* @param {object} browser instance of created browser/device session
*/
before: function (capabilities, specs, browser) {
},
/**
* Gets executed before the suite starts (in Mocha/Jasmine only).
* @param {object} suite suite details
*/
beforeSuite: function (suite) {
},
/**
* This hook gets executed _before_ every hook within the suite starts.
* (For example, this runs before calling `before`, `beforeEach`, `after`, `afterEach` in Mocha.). In Cucumber `context` is the World object.
*
*/
beforeHook: function (test, context, hookName) {
},
/**
* Hook that gets executed _after_ every hook within the suite ends.
* (For example, this runs after calling `before`, `beforeEach`, `after`, `afterEach` in Mocha.). In Cucumber `context` is the World object.
*/
afterHook: function (test, context, { error, result, duration, passed, retries }, hookName) {
},
/**
* Function to be executed before a test (in Mocha/Jasmine only)
* @param {object} test test object
* @param {object} context scope object the test was executed with
*/
beforeTest: function (test, context) {
},
/**
* Runs before a WebdriverIO command is executed.
* @param {string} commandName hook command name
* @param {Array} args arguments that the command would receive
*/
beforeCommand: function (commandName, args) {
},
/**
* Runs after a WebdriverIO command gets executed
* @param {string} commandName hook command name
* @param {Array} args arguments that command would receive
* @param {number} result 0 - command success, 1 - command error
* @param {object} error error object, if any
*/
afterCommand: function (commandName, args, result, error) {
},
/**
* Function to be executed after a test (in Mocha/Jasmine only)
* @param {object} test test object
* @param {object} context scope object the test was executed with
* @param {Error} result.error error object in case the test fails, otherwise `undefined`
* @param {*} result.result return object of test function
* @param {number} result.duration duration of test
* @param {boolean} result.passed true if test has passed, otherwise false
* @param {object} result.retries information about spec related retries, e.g. `{ attempts: 0, limit: 0 }`
*/
afterTest: function (test, context, { error, result, duration, passed, retries }) {
},
/**
* Hook that gets executed after the suite has ended (in Mocha/Jasmine only).
* @param {object} suite suite details
*/
afterSuite: function (suite) {
},
/**
* Gets executed after all tests are done. You still have access to all global variables from
* the test.
* @param {number} result 0 - test pass, 1 - test fail
* @param {Array.<Object>} capabilities list of capabilities details
* @param {Array.<String>} specs List of spec file paths that ran
*/
after: function (result, capabilities, specs) {
},
/**
* Gets executed right after terminating the webdriver session.
* @param {object} config wdio configuration object
* @param {Array.<Object>} capabilities list of capabilities details
* @param {Array.<String>} specs List of spec file paths that ran
*/
afterSession: function (config, capabilities, specs) {
},
/**
* Gets executed after all workers have shut down and the process is about to exit.
* An error thrown in the `onComplete` hook will result in the test run failing.
* @param {object} exitCode 0 - success, 1 - fail
* @param {object} config wdio configuration object
* @param {Array.<Object>} capabilities list of capabilities details
* @param {<Object>} results object containing test results
*/
onComplete: function (exitCode, config, capabilities, results) {
},
/**
* Gets executed when a refresh happens.
* @param {string} oldSessionId session ID of the old session
* @param {string} newSessionId session ID of the new session
*/
onReload: function(oldSessionId, newSessionId) {
},
/**
* Cucumber Hooks
*
* Runs before a Cucumber Feature.
* @param {string} uri path to feature file
* @param {GherkinDocument.IFeature} feature Cucumber feature object
*/
beforeFeature: function (uri, feature) {
},
/**
*
* Runs before a Cucumber Scenario.
* @param {ITestCaseHookParameter} world world object containing information on pickle and test step
* @param {object} context Cucumber World object
*/
beforeScenario: function (world, context) {
},
/**
*
* Runs before a Cucumber Step.
* @param {Pickle.IPickleStep} step step data
* @param {IPickle} scenario scenario pickle
* @param {object} context Cucumber World object
*/
beforeStep: function (step, scenario, context) {
},
/**
*
* Runs after a Cucumber Step.
* @param {Pickle.IPickleStep} step step data
* @param {IPickle} scenario scenario pickle
* @param {object} result results object containing scenario results
* @param {boolean} result.passed true if scenario has passed
* @param {string} result.error error stack if scenario failed
* @param {number} result.duration duration of scenario in milliseconds
* @param {object} context Cucumber World object
*/
afterStep: function (step, scenario, result, context) {
},
/**
*
* Runs after a Cucumber Scenario.
* @param {ITestCaseHookParameter} world world object containing information on pickle and test step
* @param {object} result results object containing scenario results `{passed: boolean, error: string, duration: number}`
* @param {boolean} result.passed true if scenario has passed
* @param {string} result.error error stack if scenario failed
* @param {number} result.duration duration of scenario in milliseconds
* @param {object} context Cucumber World object
*/
afterScenario: function (world, result, context) {
},
/**
*
* Runs after a Cucumber Feature.
* @param {string} uri path to feature file
* @param {GherkinDocument.IFeature} feature Cucumber feature object
*/
afterFeature: function (uri, feature) {
},
/**
* Runs before a WebdriverIO assertion library makes an assertion.
* @param commandName command name
* @param args arguments that command would receive
*/
beforeAssertion: function (params) {
},
/**
* Runs after a WebdriverIO command gets executed
* @param commandName command name
* @param args arguments that command would receive
* @param result result of the command
* @param error error in case something went wrong
*/
afterAssertion: function (params) {
} |
Hi,
We are currently overriding the reporter implementation and we use the
createResultPayload()
function to post Slack messages on failure after the feature file has finished running. BothnotifyFailedCase
andnotifyTestStartMessage
are set tofalse
, however I need to keepnotifyTestFinishMessage
set to true. As I understandnotifyTestFinishMessage
triggers the createResultPayload() logic whatever the status of the feature file is (passed or failed or skipped). Slack doesn't accept empty strings, it sends 400 response errors back so it doesn't seem like there's a way of bypassing the payload. Would it be possible to offer an option where payload is posted depending on feature file state?We are using the Slack webhook flags.
Thanks,
Sher
The text was updated successfully, but these errors were encountered: