test::builder(3)
NAME
Test::Builder - Backend for building test libraries
SYNOPSIS
package My::Test::Module;
use Test::Builder;
require Exporter;
@ISA = qw(Exporter);
@EXPORT = qw(ok);
my $Test = Test::Builder->new;
$Test->output('my_logfile');
sub import {
my($self) = shift;
my $pack = caller;
$Test->exported_to($pack);
$Test->plan(@_);
$self->export_to_level(1, $self, 'ok');
}
sub ok {
my($test, $name) = @_;
$Test->ok($test, $name);
}
DESCRIPTION
Test::Simple and Test::More have proven to be popular
testing modules, but they're not always flexible enough.
Test::Builder provides the a building block upon which to
write your own test libraries which can work together.
Construction
- new
- my $Test = Test::Builder->new;
- Returns a Test::Builder object representing the cur
rent state of the test. - Since you only run one test per program, there is one
and only one Test::Builder object. No matter how many times you call new(), you're getting the same object.
(This is called a singleton). - Setting up tests
- These methods are for setting up tests and declaring how
many there are. You usually only want to call one of
these methods. - exported_to
- my $pack = $Test->exported_to;
$Test->exported_to($pack); - Tells Test::Builder what package you exported your
functions to. This is important for getting TODO
tests right. - plan
- $Test->plan('no_plan');
$Test->plan( skip_all => $reason );
$Test->plan( tests => $num_tests ); - A convenient way to set up your tests. Call this and
Test::Builder will print the appropriate headers and
take the appropriate actions. - If you call plan(), don't call any of the other meth
ods below. - expected_tests
- my $max = $Test->expected_tests;
$Test->expected_tests($max); - Gets/sets the # of tests we expect this test to run
and prints out the appropriate headers. - no_plan
- $Test->no_plan;
- Declares that this test will run an indeterminate # of
tests. - has_plan
- $plan = $Test->has_plan
- Find out whether a plan has been defined. $plan is
either "undef" (no plan has been set), "no_plan"
(indeterminate # of tests) or an integer (the number
of expected tests). - skip_all
- $Test->skip_all;
$Test->skip_all($reason); - Skips all the tests, using the given $reason. Exits
immediately with 0. - Running tests
- These actually run the tests, analogous to the functions
in Test::More. - $name is always optional.
- ok
- $Test->ok($test, $name);
- Your basic test. Pass if $test is true, fail if $test
is false. Just like Test::Simple's ok(). - is_eq
- $Test->is_eq($got, $expected, $name);
- Like Test::More's is(). Checks if $got eq $expected.
This is the string version. - is_num
- $Test->is_num($got, $expected, $name);
- Like Test::More's is(). Checks if $got == $expected.
This is the numeric version. - isnt_eq
- $Test->isnt_eq($got, $dont_expect, $name);
- Like Test::More's isnt(). Checks if $got ne
$dont_expect. This is the string version. - isnt_num
- $Test->is_num($got, $dont_expect, $name);
- Like Test::More's isnt(). Checks if $got ne
$dont_expect. This is the numeric version. - like
- $Test->like($this, qr/$regex/, $name);
$Test->like($this, '/$regex/', $name); - Like Test::More's like(). Checks if $this matches the given $regex.
- You'll want to avoid qr// if you want your tests to
work before 5.005. - unlike
- $Test->unlike($this, qr/$regex/, $name);
$Test->unlike($this, '/$regex/', $name); - Like Test::More's unlike(). Checks if $this does not match the given $regex.
- maybe_regex
- $Test->maybe_regex(qr/$regex/);
$Test->maybe_regex('/$regex/'); - Convenience method for building testing functions that
take regular expressions as arguments, but need to
work before perl 5.005. - Takes a quoted regular expression produced by qr//, or
a string representing a regular expression. - Returns a Perl value which may be used instead of the
corresponding regular expression, or undef if it's
argument is not recognised. - For example, a version of like(), sans the useful
diagnostic messages, could be written as:
sub laconic_like {my ($self, $this, $regex, $name) = @_;
my $usable_regex = $self->maybe_regex($regex);
die "expecting regex, found '$regex'0unless $usable_regex;$self->ok($this =~ m/$usable_regex/, $name);- }
- cmp_ok
- $Test->cmp_ok($this, $type, $that, $name);
- Works just like Test::More's cmp_ok().
$Test->cmp_ok($big_num, '!=', $other_big_num);- BAILOUT
- $Test->BAILOUT($reason);
- Indicates to the Test::Harness that things are going
so badly all testing should terminate. This includes
running any additional test scripts. - It will exit with 255.
- skip
- $Test->skip;
$Test->skip($why); - Skips the current test, reporting $why.
- todo_skip
- $Test->todo_skip;
$Test->todo_skip($why); - Like skip(), only it will declare the test as failing
and TODO. Similar to
print "not ok $tnum # TODO $why0;- Test style
- level
- $Test->level($how_high);
- How far up the call stack should $Test look when
reporting where the test failed. - Defaults to 1.
- Setting $Test::Builder::Level overrides. This is typ
ically useful localized:
{local $Test::Builder::Level = 2;
$Test->ok($test);- }
- use_numbers
- $Test->use_numbers($on_or_off);
- Whether or not the test should output numbers. That
is, this if true:
ok 1
ok 2
ok 3- or this if false
ok
ok
ok- Most useful when you can't depend on the test output
order, such as when threads or forking is involved. - Test::Harness will accept either, but avoid mixing the
two styles. - Defaults to on.
- no_header
- $Test->no_header($no_header);
- If set to true, no "1..N" header will be printed.
- no_ending
- $Test->no_ending($no_ending);
- Normally, Test::Builder does some extra diagnostics
when the test ends. It also changes the exit code as
described in Test::Simple. - If this is true, none of that will be done.
- Output
- Controlling where the test output goes.
- It's ok for your test to change where STDOUT and STDERR
point to, Test::Builder's default output settings will not
be affected. - diag
- $Test->diag(@msgs);
- Prints out the given $message. Normally, it uses the
failure_output() handle, but if this is for a TODO test, the todo_output() handle is used. - Output will be indented and marked with a # so as not
to interfere with test output. A newline will be put
on the end if there isn't one already. - We encourage using this rather than calling print
directly. - Returns false. Why? Because diag() is often used in
conjunction with a failing test ("ok() || diag()") it
"passes through" the failure.
return ok(...) || diag(...);- output
- $Test->output($fh);
$Test->output($file); - Where normal "ok/not ok" test output should go.
- Defaults to STDOUT.
- failure_output
- $Test->failure_output($fh);
$Test->failure_output($file); - Where diagnostic output on test failures and diag()
should go. - Defaults to STDERR.
- todo_output
- $Test->todo_output($fh);
$Test->todo_output($file); - Where diagnostics about todo test failures and diag()
should go. - Defaults to STDOUT.
- Test Status and Info
- current_test
- my $curr_test = $Test->current_test;
$Test->current_test($num); - Gets/sets the current test # we're on.
- You usually shouldn't have to set this.
- summary
- my @tests = $Test->summary;
- A simple summary of the tests so far. True for pass,
false for fail. This is a logical pass/fail, so todos
are passes. - Of course, test #1 is $tests[0], etc...
- details
- my @tests = $Test->details;
- Like summary(), but with a lot more detail.
$tests[$test_num - 1] ={ 'ok' => is the test considered apass?actual_ok => did it literally say 'ok'?
name => name of the test (if any)
type => type of test (if any, seebelow).
reason => reason for the above (ifany)};- 'ok' is true if Test::Harness will consider the test
to be a pass. - 'actual_ok' is a reflection of whether or not the test
literally printed 'ok' or 'not ok'. This is for exam
ining the result of 'todo' tests. - 'name' is the name of the test.
- 'type' indicates if it was a special test. Normal
tests have a type of ''. Type can be one of the fol
lowing:
skip see skip()
todo see todo()
todo_skip see todo_skip()
unknown see below- Sometimes the Test::Builder test counter is incre
mented without it printing any test output, for exam
ple, when current_test() is changed. In these cases, Test::Builder doesn't know the result of the test, so
it's type is 'unkown'. These details for these tests
are filled in. They are considered ok, but the name
and actual_ok is left undef. - For example "not ok 23 - hole count # TODO insuffi
cient donuts" would result in this structure:
$tests[22] = # 23 - 1, since arrays start from- 0.
{ ok => 1, # logically, the test passedsince it's todoactual_ok => 0, # in absolute terms, itfailed
name => 'hole count',
type => 'todo',
reason => 'insufficient donuts'}; - todo
- my $todo_reason = $Test->todo;
my $todo_reason = $Test->todo($pack); - todo() looks for a $TODO variable in your tests. If
set, all tests will be considered 'todo' (see
Test::More and Test::Harness for details). Returns
the reason (ie. the value of $TODO) if running as todo
tests, false otherwise. - todo() is pretty part about finding the right package
to look for $TODO in. It uses the exported_to() pack age to find it. If that's not set, it's pretty good
at guessing the right package to look at. - Sometimes there is some confusion about where todo()
should be looking for the $TODO variable. If you want
to be sure, tell it explicitly what $pack to use. - caller
- my $package = $Test->caller;
my($pack, $file, $line) = $Test->caller;
my($pack, $file, $line) = $Test->caller($height); - Like the normal caller(), except it reports according to your level().
THREADS
In perl 5.8.0 and later, Test::Builder is thread-safe.
The test number is shared amongst all threads. This means
if one thread sets the test number using current_test()
they will all be effected.
EXAMPLES
CPAN can provide the best examples. Test::Simple,
Test::More, Test::Exception and Test::Differences all use
Test::Builder.
SEE ALSO
Test::Simple, Test::More, Test::Harness
AUTHORS
Original code by chromatic, maintained by Michael G Schw
ern <schwern@pobox.com>
COPYRIGHT
- Copyright 2002 by chromatic <chromatic@wgz.org>,
- Michael G Schwern <schwern@pobox.com>.
- This program is free software; you can redistribute it
and/or modify it under the same terms as Perl itself. - See http://www.perl.com/perl/misc/Artistic.html