Test2:...rstTool(3perl) Perl Programmers Reference GuideTest2:...rstTool(3perl)
NAME
Test2::Manual::Tooling::FirstTool - Write your first tool with Test2.
DESCRIPTION
This tutorial will help you write your very first tool by cloning the
ok() tool.
COMPLETE CODE UP FRONT
package Test2::Tools::MyOk;
use strict;
use warnings;
use Test2::API qw/context/;
use base 'Exporter';
our @EXPORT = qw/ok/;
sub ok($;$@) {
my ($bool, $name, @diag) = @_;
my $ctx = context();
return $ctx->pass_and_release($name) if $bool;
return $ctx->fail_and_release($name, @diag);
}
1;
LINE BY LINE
sub ok($;$@) {
In this case we are emulating the ok() function exported by
Test2::Tools::Basic.
ok() and similar test tools use prototypes to enforce argument
parsing. Your test tools do not necessarily need prototypes, like
any perl function you need to make the decision based on how it is
used.
The prototype requires at least 1 argument, which will be forced
into a scalar context. The second argument is optional, and is also
forced to be scalar, it is the name of the test. Any remaining
arguments are treated as diagnostics messages that will only be used
if the test failed.
my ($bool, $name, @diag) = @_;
This line does not need much explanation, we are simply grabbing the
args.
my $ctx = context();
This is a vital line in ALL tools. The context object is the primary
API for test tools. You MUST get a context if you want to issue any
events, such as making assertions. Further, the context is
responsible for making sure failures are attributed to the correct
file and line number.
Note: A test function MUST always release the context when it is
done, you cannot simply let it fall out of scope and be garbage
collected. Test2 does a pretty good job of yelling at you if you
make this mistake.
Note: You MUST NOT ever store or pass around a real context object.
If you wish to hold on to a context for any reason you must use
clone to make a copy "my $copy = $ctx->clone". The copy may be
passed around or stored, but the original MUST be released when you
are done with it.
return $ctx->pass_and_release($name) if $bool;
When $bool is true, this line uses the context object to issue a
Test2::Event::Pass event. Along with issuing the event this will
also release the context object and return true.
This is short form for:
if($bool) {
$ctx->pass($name);
$ctx->release;
return 1;
}
return $ctx->fail_and_release($name, @diag);
This line issues a Test2::Event::Fail event, releases the context
object, and returns false. The fail event will include any
diagnostics messages from the @diag array.
This is short form for:
$ctx->fail($name, @diag);
$ctx->release;
return 0;
CONTEXT OBJECT DOCUMENTATION
Test2::API::Context is the place to read up on what methods the context
provides.
SEE ALSO
Test2::Manual - Primary index of the manual.
SOURCE
The source code repository for Test2-Manual can be found at
https://github.com/Test-More/Test2-Suite/.
MAINTAINERS
Chad Granum <exodist@cpan.org>
AUTHORS
Chad Granum <exodist@cpan.org>
COPYRIGHT
Copyright 2018 Chad Granum <exodist@cpan.org>.
This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
See http://dev.perl.org/licenses/
perl v5.40.1 2026-08-30 Test2:...rstTool(3perl)
Generated by dwww version 1.16 on Sat Oct 3 06:00:43 CEST 2026.