in reply to Re^5: Does anybody write tests first?
in thread Does anybody write tests first?

Sorry, but you'll have to explain to me how testing that perl can load a module detected a bug...

Module loading in Perl 5 is not transactional. If there's a compilation error halfway through the code and the rest of the module fails to compile, all of the symbols defined in the first half and all of the side effects executed as a result of compiling the first half are still in effect.

The best way I've found to detect that is to use the return value of use_ok:

use_ok( 'Some::Module' ) or exit;

If the module fails to load completely, the test file will stop execution right there.

Replies are listed 'Best First'.
Re^7: Does anybody write tests first?
by BrowserUk (Pope) on Feb 22, 2008 at 21:00 UTC

    I guess must be being thick here, but...

    If you do not use use_ok, then what symbols are defined in or by the module prior to the compilation error is irrelevant, because the script that uses that module will be aborted:

    C:\test>type package Existant; fi( 'A' == 'B' ) { print 'hi' } 1; C:\test>perl -le"use Existant; print 'Hi';" syntax error at line 2, near ") {" Compilation failed in require at -e line 1. BEGIN failed--compilation aborted at -e line 1.

    So, if all you are going to do if the use_ok fails, is exit, you've gone to a lot of trouble for nothing.

    And along the way you've thrown away all that nice information telling you what went wrong and where.

    Any way I look at that, it is a net loss. And a major one that requires me to write another script or one-liner and run it in order to retrieve that information.

    Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
    "Science is about questioning the status quo. Questioning authority".
    In the absence of evidence, opinion is indistinguishable from prejudice.
      And along the way you've thrown away all that nice information...

      I haven't; it's part of the diagnostic information emitted by use_ok().

      The biggest advantage for me is that failures of this type get captured and recorded in the same way as all other test failures; they go through the uniform interface of TAP where my existing toolchain needs no modification to highlight these errors.