Skip to content
schwern edited this page Nov 15, 2011 · 2 revisions

Writing tests for a test library is a bit special.

We test ourselves with a separate test library called t/test.pl. It comes from the Perl core. t/test.pl implements most of the Test::More interface, and then some, without relying on it. This lets us test ourselves even when we're broken. For all practical purposes, use it like Test::More.

Here is a test boilerplate:

#!/usr/bin/env perl -w

# A short explanation of what this test is doing

use strict;
use warnings;

BEGIN { require "t/test.pl" }

note "What this block of tests is doing"; {
    ...test code here...
}

note "What this other block of tests is doing"; {
    ...test code here...
}

...and so on...

done_testing;

Test blocks serve to split the test up into manageable chunks, both in terms of variable scope and how much you have to read. They also forgive not putting a name on each and every test.

Each test block should strive to handle one method or one situation. For example...

note "Passing result"; {
    my $result = Test::Builder2::Result->new_result( pass => 1 );

    is $result->type, 'pass';
    ok $result->is_pass;
    ok !$result->is_fail;
    ok !$result->is_todo;
    ok !$result->is_skip;
    ok $result;
}

note "Failing result"; {
    my $result = Test::Builder2::Result->new_result( pass => 0 );

    is $result->type, 'fail';
    ok !$result->is_pass;
    ok $result->is_fail;
    ok !$result->is_todo;
    ok !$result->is_skip;
    ok !$result;
}