Skip to content

feat: support parallel in before/afterAll hooks #2140

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

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 54 additions & 0 deletions features/before_after_all_hooks_parallel.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
Feature: Before/AfterAll hooks in parallel

When running in parallel, Cucumber-JS runs some code on a "Co-ordinator" process,
but all the user code runs in a "Worker" process.

When defining BeforeAll/AfterAll hooks, you can choose whather to run them on
the coordinator, the worker, or both.

Background:
Given a file named "features/a.feature" with:
"""
Feature: some feature
Scenario: first scenario
Given first step

Scenario: second scenario
Given second step
"""

Scenario: Just run the AfterAll hooks once, on the coordinator

Given a file named "features/support/hooks.js" with:
"""
const {AfterAll, HookParallelMode, Given} = require('@cucumber/cucumber')
const {expect} = require('chai')

let counter = 0

Given('first step', function() {
counter ++
expect(counter).to.eql(1)
})

Given('second step', function() {
counter ++
expect(counter).to.eql(1)
})

AfterAll({ parallelMode: HookParallelMode.WORKER_ONLY }, function() {
counter ++
console.log('worker: ', counter)
expect(counter).to.eql(2)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure this will work once we implement the changes - because the workers are in different Node.js processes, they won't be acting on the same counter variable, so I think it will always be 1 assuming the workers take one scenario each.

What might be worth pursuing instead is having each flavour of the hook console.log a string with the some of environment variables that Cucumber sets for the parallel runtime e.g CUCUMBER_WORKER_ID and then assert on that being in the output with a Then the output contains the text: step (see other features) - a bit messy but should work.

})

AfterAll({ parallelMode: HookParallelMode.COORDINATOR_ONLY }, function() {
counter ++
console.log('coordinator: ', counter)
expect(counter).to.eql(1)
})
"""
When I run cucumber-js with `--parallel 2`
Then it passes

Rule: Coordinator's AfterAll hook should run after the Workers' AfterAllHooks
4 changes: 4 additions & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,10 @@ export {
} from './support_code_library_builder/world'
export { parallelCanAssignHelpers }

export const HookParallelMode = {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This could be a TS enum

WORKER_ONLY: 'worker-only',
COORDINATOR_ONLY: 'coordinator-only',
}
export {
ITestCaseHookParameter,
ITestStepHookParameter,
Expand Down