http://www.perlmonks.org?node_id=939699


in reply to Multiple BEGIN blocks in Test::More

The two BEGIN blocks in your second snippet will do the same thing as the three BEGIN blocks in your first snippet, but they are not equivalent.

  1. Compile first BEGIN block.
    1. Compile require Test::More;.
    2. Compile import Test::More;.
  2. Execute first BEGIN block.
    1. Execute require Test::More;.
    2. Execute import Test::More;.
  3. Compile second BEGIN block.
    1. Compile use_ok 'Module::A'.
  4. Execute second BEGIN block.
    1. Execute use_ok 'Module::A'.
  5. Compile third BEGIN block.
    1. Compile use_ok 'Module::B'.
  6. Execute third BEGIN block.
    1. Execute use_ok 'Module::B'.
  7. Compile done_testing;.
  8. End of compile phase.
  9. Execute done_testing;.

vs

  1. Compile first BEGIN block.
    1. Compile require Test::More;.
    2. Compile import Test::More;.
  2. Execute first BEGIN block.
    1. Execute require Test::More;.
    2. Execute import Test::More;.
  3. Compile second BEGIN block.
    1. Compile use_ok 'Module::A'.
    2. Compile use_ok 'Module::B'.
  4. Execute second BEGIN block.
    1. Execute use_ok 'Module::A'.
    2. Execute use_ok 'Module::B'.
  5. Compile done_testing;.
  6. End of compile phase.
  7. Execute done_testing;.

Or in short,

  1. ...
  2. Compile use_ok 'Module::A'.
  3. Execute use_ok 'Module::A'.
  4. Compile use_ok 'Module::B'.
  5. Execute use_ok 'Module::B'.
  6. ...

vs

  1. ...
  2. Compile use_ok 'Module::A'.
  3. Compile use_ok 'Module::B'.
  4. Execute use_ok 'Module::A'.
  5. Execute use_ok 'Module::B'.
  6. ...

In the first, use_ok 'Module::A' could have an effect on how use_ok 'Module::B' is compiled. In the second, it can't.

I agree with Corion, though. There's no reason to use use_ok.

use Test::More tests => 1; use Module::A; use Module::B; pass("Loading modules"); 1;