Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

Re^4: Does anybody write tests first?

by chromatic (Archbishop)
on Feb 22, 2008 at 08:32 UTC ( #669482=note: print w/ replies, xml ) Need Help??


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

Testing that perl can load a module and converting the result into a 0.05% change in a statistic is stupid.

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


Comment on Re^4: Does anybody write tests first?
Re^5: Does anybody write tests first?
by BrowserUk (Pope) on Feb 22, 2008 at 11:31 UTC
    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.
      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.

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others studying the Monastery: (13)
As of 2014-07-10 19:13 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    When choosing user names for websites, I prefer to use:








    Results (215 votes), past polls