On Wed, Jul 07, 2004 at 02:42:22PM -0400, Michael G Schwern wrote:
> On Fri, Jun 04, 2004 at 10:18:37PM -0400, Andrew Pimlott wrote:
> > I started using Test::Inline, and I have two related comments.  (I hope
> > this is the right place to bring them up.)
> > 
> > 1.  I don't think that pod2test should do anything more than the minimum
> >     to construct a valid test script.  Anything else that is useful
> >     should be part of the standard Test:: modules.
> 
> pod2test is poorly architected but I don't see anything it does that
> I'd want in a module.  What were you thinking of?

I was mostly thinking about the capturing of STDOUT and STDERR, but I'm
alsa suggesting it as a general principle.  I guess the only other thing
is the automatic

    use Test::More 'no_plan';

This is probably harmless, but on the other hand it's trivial to include
it yourself, so I don't see the point.  Someday we will all be using
Test::Most instead.  (waitaminnit... search.cpan.org... whew, not there
yet)

> > 2.  I don't like it capturing STDOUT and STDERR when I don't ask for it.
> >     I realize that well-behaved tests shouldn't write directly to
> >     STDOUT, but since the point of tests is that code is not always
> >     well-behaved, it's nice to get the clues that STDOUT and STDERR may
> >     provide.  There are of course better ways to capture this output
> >     when that's desired.
> 
> You did ask for it, you used Test::Inline. :)

No, you dunderhead, I used Test::Inline to include my tests in the same
file as my code, but separate enough that the code still works when the
tests don't compile, in a standard, well-supported way.

> Its rarely useful for a test to output to STDOUT.  Can you think of a
> non-contrived example where it would be desirable?  OTOH, example code
> often involves printing.  So trapping STDOUT seems obvious to me.

Well, for one thing, printing directly to STDOUT is documented in Test
and Test::Tutorial.  You may say, you're not supposed to be
sophisticated enough to use Test::Inline and simple enough to print the
results directly; but I don't see why the same test environment
shouldn't be supported everywhere.  However, you're right that in
practice, I haven't missed seeing STDOUT.

I didn't think of your point about example code often printing, because
my test code is not (currently) documentation (and obviously I did not
read the Test::Inline documentation carefully).  On the other hand,
there is generally no need to print in example code; assigning to a
variable will get the point across just as well.

> STDERR is another issue.  Lots of interesting information might go out to
> STDERR during a failure that you'd like to see.  But again, examples
> often call warn.

Missing STDERR was exceedingly annoying for me--at first because I
didn't understand why my test suddenly stopped with no warning, and
subsequently because I had to keep editing my test files in order to see
the missing diagnostics.  I have since removed the capturing from my
copy of pod2test.

> Since trapping STDOUT/ERR is really only useful for example code, maybe
> T::I should stop doing it for test blocks.

This would remove my current pain, but ...

> That still leaves warnings in examples.  One can write "is $__STDERR__, ''"
> but it would happen at every example block and that gets tedious.  Perhaps
> T::I can get smart.  If $__STDERR__ is not looked at in the example_testing
> block an implied "is $__STDERR__, ''" is run.  Simple enough since
> $__STDERR__ is a tied variable.

This doesn't handle the most important case:  What if the example code
died?  You could eval the example code; however every complication you
add risks adding confusion and interfering with the tests themselves.
Another case: there is a warning in the example, and a test failure
in the example_testing, where the warning contained clues about what led
to the failure.  In your scheme, the warning won't be seen.

I think it would be best to make people who want STDOUT and/or STDERR
captured ask for it, on a per-example basis, in the POD.  I don't know
how you'd fit this into POD syntax, however.

Here is another approach:  Import a special "print" and "warn" into main
when running examples, which capture their arguments and don't produce
any output.  This wouldn't handle your getprint example, but it's
probably a 95% solution.

> Also, --no-trap-stdout and --no-trap-stderr options might be in order.

I would much rather encode these directives in the POD than in the
command line.

Andrew

Reply via email to