.\" Automatically generated by Pod::Man v1.37, Pod::Parser v1.32 .\" .\" Standard preamble: .\" ======================================================================== .de Sh \" Subsection heading .br .if t .Sp .ne 5 .PP \fB\\$1\fR .PP .. .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. | will give a .\" real vertical bar. \*(C+ will give a nicer C++. Capital omega is used to .\" do unbreakable dashes and therefore won't be available. \*(C` and \*(C' .\" expand to `' in nroff, nothing in troff, for use with C<>. .tr \(*W-|\(bv\*(Tr .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' 'br\} .\" .\" If the F register is turned on, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . nr % 0 . rr F .\} .\" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .hy 0 .if n .na .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "Test::Class::Load 3" .TH Test::Class::Load 3 "2008-01-07" "perl v5.8.8" "User Contributed Perl Documentation" .SH "VERSION" .IX Header "VERSION" Version 0.02 .SH "SYNOPSIS" .IX Header "SYNOPSIS" .Vb 2 \& use Test::Class::Load qw(t/tests t/lib); \& Test::Class->runtests; .Ve .SH "EXPORT" .IX Header "EXPORT" None. .SH "DESCRIPTION" .IX Header "DESCRIPTION" \&\f(CW\*(C`Test::Class\*(C'\fR typically uses a helper script to load the test classes. It often looks something like this: .PP .Vb 1 \& #!/usr/bin/perl -T .Ve .PP .Vb 2 \& use strict; \& use warnings; .Ve .PP .Vb 1 \& use lib 't/tests'; .Ve .PP .Vb 3 \& use MyTest::Foo; \& use MyTest::Foo::Bar; \& use MyTest::Foo::Baz; .Ve .PP .Vb 1 \& Test::Class->runtests; .Ve .PP This causes a problem, though. When you're writing a test class, it's easy to forget to add it to the helper script. Then you run your huge test suite and see that all tests pass, even though you don't notice that it didn't run your new test class. Or you delete a test class and you forget to remove it from the helper script. .PP \&\f(CW\*(C`Test::Class::Load\*(C'\fR automatically finds and loads your test classes for you. There is no longer a need to list them individually. .SH "BASIC USAGE" .IX Header "BASIC USAGE" Using \f(CW\*(C`Test::More::Load\*(C'\fR is as simple as this: .PP .Vb 1 \& #!/usr/bin/perl -T .Ve .PP .Vb 2 \& use strict; \& use warnings; .Ve .PP .Vb 1 \& use Test::Class::Load 't/tests'; .Ve .PP .Vb 1 \& Test::Class->runtests; .Ve .PP That will search through all files in the \f(CW\*(C`t/tests\*(C'\fR directory and automatically load anything which ends in \f(CW\*(C`.pm\*(C'\fR. You should only put test classes in those directories. .PP If you have test classes in more than one directory, that's \s-1OK\s0. Just list all of them in the import list. .PP .Vb 6 \& use Test::Class::Load qw< \& t/customer \& t/order \& t/inventory \& >; \& Test::Class->runtests; .Ve .SH "ADVANCED USAGE" .IX Header "ADVANCED USAGE" One problem with this style of testing is that you run \fIall\fR of the tests every time you need to test something. If you want to run only one test class, it's problematic. The easy way to do this is to change your helper script by deleting the \f(CW\*(C`runtests\*(C'\fR call: .PP .Vb 1 \& #!/usr/bin/perl -T .Ve .PP .Vb 2 \& use strict; \& use warnings; .Ve .PP .Vb 1 \& use Test::Class::Load 't/tests'; .Ve .PP Then, just make sure that all of your test classes inherit from your own base class which runs the tests for you. It might looks something like this: .PP .Vb 1 \& package My::Test::Class; .Ve .PP .Vb 2 \& use strict; \& use warnings; .Ve .PP .Vb 1 \& use base 'Test::Class'; .Ve .PP .Vb 1 \& INIT { Test::Class->runtests } # here's the magic! .Ve .PP .Vb 1 \& 1; .Ve .PP Then you can run an individual test class by using the \f(CW\*(C`prove\*(C'\fR utility, tell it the directory of the test classes and the name of the test package you wish to run: .PP .Vb 1 \& prove -lv -It/tests Some::Test::Class .Ve .PP You can even automate this by binding it to a key in \f(CW\*(C`vim\*(C'\fR: .PP .Vb 1 \& noremap ,t :!prove -lv -It/tests % .Ve .PP Then you can just type \f(CW\*(C`,t\*(C'\fR ('comma', 'tee') and it will run the tests for your test class or the tests for your test script (if you're using a traditional \f(CW\*(C`Test::More\*(C'\fR style script). .PP Of course, you can still run your helper script with \f(CW\*(C`prove\*(C'\fR, \f(CW\*(C`make test\*(C'\fR or \f(CW\*(C`./Build test\*(C'\fR to run all of your test classes. .PP If you do that, you'll have to make sure that the \f(CW\*(C`\-I\*(C'\fR switches point to your test class directories. .SH "SECURITY" .IX Header "SECURITY" \&\f(CW\*(C`Test::Class::Load\*(C'\fR is taint safe. Because we're reading the class names from the directory structure, they're marked as tainted when running under taint mode. We use the following ultra-paranoid bit of code to untaint them. Please file a bug report if this is too restrictive. .PP .Vb 1 \& my ($package) = $_package =~ /^([[:word:]]+(?:::[[:word:]]+)*)$/; .Ve .SH "AUTHOR" .IX Header "AUTHOR" Curtis \*(L"Ovid\*(R" Poe, \f(CW\*(C`\*(C'\fR .SH "BUGS" .IX Header "BUGS" Please report any bugs or feature requests to \f(CW\*(C`bug\-test\-class\-load@rt.cpan.org\*(C'\fR, or through the web interface at . I will be notified, and then you'll automatically be notified of progress on your bug as I make changes. .SH "ACKNOWLEDGMENTS" .IX Header "ACKNOWLEDGMENTS" Thanks to David Wheeler for the idea and Adrian Howard for \f(CW\*(C`Test::Class\*(C'\fR. .SH "COPYRIGHT & LICENSE" .IX Header "COPYRIGHT & LICENSE" Copyright 2006 Curtis \*(L"Ovid\*(R" Poe, all rights reserved. .PP This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.