Cucumber hooks BeforeAll and AfterAll


#1

hey there,
the short version:
right now Cucumber provides hooks Before and After to be run around
every
step, I have notice some use case where BeforeAll and AfterAll hooks
would
be useful.
are ther plans that they be provided? what you think would be the best
place
to do it (mother_step.rb)? any ideas about this could be accomplished?

the long version:

playing with culerity, which according to the author:

  • when running cucumber culerity spawns a new jruby process (that’s the
    IO.popen call) - this way cucumber runs in plain old ruby (and you can
    work
    with your models for test setup etc.) and only celerity runs in jruby
  • from then on all communication has to go through pipes (in, out) so i
    am
    passing the browser config through those pipes to the newsly spawned
    jruby
    process
  • when a test fails the jruby process doesn’t get killed, that’s the
    java
    processes you see. don’t have a good idea how to solve this yet. for now
    you
    will have to kill those processes by hand.

that has improved since now there’s a first attempt for built in support
to
kill orfan java processes at:

culerity trick happen at step_definitions/common_celerity.rb Before and
After hooks, where you build and kill a spawned jruby around every step.
There it is easy to see the gain if we could do those in an around All
steps
manner

what do you think?

cheers,
joaquin


#2

On Sun, Feb 15, 2009 at 2:21 PM, Joaquin Rivera P.
removed_email_address@domain.invalid wrote:

hey there,
the short version:
right now Cucumber provides hooks Before and After to be run around every
step, I have notice some use case where BeforeAll and AfterAll hooks would
be useful.
are ther plans that they be provided? what you think would be the best place
to do it (mother_step.rb)? any ideas about this could be accomplished?

BeforeAll is equivalent to just calling code up in env.rb.
AfterAll is equivalent to registering a ruby at_exit hook in your
env.rb.

Of course they don’t have to go in your env.rb, you could put them in
another file, and then require them from env.rb or just let cucumber
auto-load them if they’re in your support/ directory.

processes you see. don’t have a good idea how to solve this yet. for now you


Zach D.
http://www.continuousthinking.com
http://www.mutuallyhuman.com


#3

Zach D. wrote:

BeforeAll is equivalent to just calling code up in env.rb.
AfterAll is equivalent to registering a ruby at_exit hook in your env.rb.

Of course they don’t have to go in your env.rb, you could put them in
another file, and then require them from env.rb or just let cucumber
auto-load them if they’re in your support/ directory.

To illustrate what Zach is saying here is an example I used on the
wiki[1] before:

Global setup

ActionMailer::Base.delivery_method = :test
ActionMailer::Base.perform_deliveries = true

Before do
# Scenario setup
ActionMailer::Base.deliveries.clear
end

After do
# Scenario teardown
Database.truncate_all
end

at_exit do
# Global teardown
TempFileManager.clean_up
end

HTH,
Ben

http://wiki.github.com/aslakhellesoy/cucumber/migration-from-rspec-stories


#4

On Sun, Feb 15, 2009 at 8:47 PM, Ben M. removed_email_address@domain.invalid wrote:

would
be useful.
are ther plans that they be provided? what you think would be the best
place
to do it (mother_step.rb)? any ideas about this could be accomplished?

BeforeAll is equivalent to just calling code up in env.rb.
AfterAll is equivalent to registering a ruby at_exit hook in your env.rb.

I updated the most relevant wiki page with this info:
http://wiki.github.com/aslakhellesoy/cucumber/hooks

Aslak


#5

On 15 Feb 2009, at 19:47, Ben M. wrote:

end

HTH,
Ben

I still think it would be nice if you could write

BeforeAll do
ActionMailer::Base.delivery_method = :test
ActionMailer::Base.perform_deliveries = true
end

AfterAll do

Global teardown

TempFileManager.clean_up
end

Yes it’s equivalent (largely), but it does make the intent more
clear. And expressing intent is a big part of Cucumber (and RSpec)
IMHO.

Ashley


http://www.patchspace.co.uk/


http://twitter.com/ashleymoran


#6

cool thanks,
joaquin

2009/2/15 Ben M. removed_email_address@domain.invalid


#7

On Tue, Feb 17, 2009 at 3:32 PM, Ashley M.
removed_email_address@domain.invalid wrote:

Before do

Global teardown

ActionMailer::Base.perform_deliveries = true
end

AfterAll do

Global teardown

TempFileManager.clean_up
end

Yes it’s equivalent (largely), but it does make the intent more clear.
And expressing intent is a big part of Cucumber (and RSpec) IMHO.

The main problem w/ this for me is that before(:all) in RSpec means
something different here (before(:all) the examples in one group).
There is also a rarely used before(:suite), which is more akin to what
you’re proposing here. So if we add Before[… some scope …], I’d
prefer it be aligned (or at least not conflict) w/ RSpec’s meaning (so
ppl don’t have to remember which to use where).

May I propose:

Before(:suite)

or

Before(:all_features)

??


#8

On Tue, Feb 17, 2009 at 10:32 PM, Ashley M.
removed_email_address@domain.invalid wrote:

Before do

Global teardown

ActionMailer::Base.perform_deliveries = true
end

AfterAll do

Global teardown

TempFileManager.clean_up
end

Yes it’s equivalent (largely), but it does make the intent more clear.
And expressing intent is a big part of Cucumber (and RSpec) IMHO.

You can express intent with a comment in this case. I don’t want to
invent constructs that do nothing. Gold plating.

Aslak