Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

Re^5: Does anybody write tests first?

by BrowserUk (Pope)
on Feb 22, 2008 at 11:31 UTC ( #669527=note: print w/ replies, xml ) Need Help??


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

And yet I've seen it catch real bugs in real code.

Sorry, but you'll have to explain to me how testing that perl can load a module detected a bug, that you would have missed by allowing perl to report:

Can't locate object method "new" via package "Some::Module" (perhaps you forgot to load "Some::Module"?) at...

?


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.


Comment on Re^5: Does anybody write tests first?
Download Code
Re^6: Does anybody write tests first?
by chromatic (Archbishop) on Feb 22, 2008 at 18:57 UTC
    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.

      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 Existant.pm package Existant; fi( 'A' == 'B' ) { print 'hi' } 1; C:\test>perl -le"use Existant; print 'Hi';" syntax error at Existant.pm 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.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://669527]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others romping around the Monastery: (12)
As of 2014-08-01 04:32 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite superfluous repetitious redundant duplicative phrase is:









    Results (256 votes), past polls