Alien-Selenium
view release on metacpan or search on metacpan
inc/My/Tests/Below.pm view on Meta::CPAN
#!perl -Tw
# Copyright Dominique Quatravaux 2006 - Licensed under the same terms as Perl itself
use strict;
use warnings;
use 5.006; # "our" keyword
=head1 NAME
B<My::Tests::Below> - invoke a test suite at the end of a module.
=head1 SYNOPSIS
package MyPackage;
<the text of the package goes here>
require My::Tests::Below unless caller();
1;
__END__
use MyPackage;
# And there you go with your test suite
=head1 DESCRIPTION
DOMQ is a guy who releases CPAN packages from time to time - you are
probably frobbing into one of them right now.
This package is a helper that supports my coding style for unit tests
so as to facilitate relasing my code to the world.
=head2 How it works
The test code is written in L<perlmodlib> style, that is, at the
bottom of the Perl module to test, after an __END__ marker. This way
of organizing test code is not unlike L<Test::Inline>, by Adam Kennedy
et al, in that it keeps code, documentation and tests in the same
place, encouraging developers to modify all three at once.
I like to use L<Test::Group> for the unit perlmodlib-style unit tests,
because counting and recounting my tests drives me nuts :-). However
C<My::Tests::Below> itself is testing-framework agnostic (its own
self-test suite, for instance, uses only plain old L<Test::More>).
Invoking C<require My::Tests::Below> from anywhere (the idiomatic form
is shown in L</SYNOPSIS>) results in the block of code after the
__END__ marker being run at once. Due to the way this construct abuses
the Perl module mechanism, My::Tests::Below cannot be require()d or
use()d for any other purpose, hence the funny name.
=head3 Why not use Test::Inline then?
Well, for a variety of reasons:
=over
=item *
modules written with tests at the end syntax-highlight almost
perfectly under Emacs :-), which is far from being the case for tests
written in the POD
=item *
removing the My::Tests::Below altogether from the installed version
of a package is straightforward and does not alter line
numbering. (See L<My::Module::Build>)
=item *
no pre-processing step (e.g. C<inline2test>) and no temporary file
creation is required with My::Tests::Below. This goes a long ways
towards shortening the debugging cycle (no need to re-run "./Build
code" nor "make" each time)
=item *
L<Test::Inline> has a lot of dependencies, and using it would cause
the installation of small modules to become unduly burdensome.
=back
=cut "
package My::Tests::Below;
use strict;
use File::Temp ();
our $VERSION = 2.0;
## This is done at the top level, not in a sub, as "require
## My::Tests::Below" is what gets the ball rolling:
our $singleton = __PACKAGE__->_parse(\*main::DATA, caller(0));
unless (defined $singleton) {
die "My::Tests::Below invoked, but no tests were found below!";
}
close(main::DATA);
$singleton->run();
( run in 0.925 second using v1.01-cache-2.11-cpan-e1769b4cff6 )