I’ve been using Test::More for so long that I sometimes forget about new features that have been added in the last couple years. If you’re like me and would like a refresher, here’s a list of five useful features that you might want to start using. Unless otherwise noted, you will need at least version 0.88 of Test::More.
1. done_testing instead of no_plan 🔗︎
If you don’t know how many tests you are going to run (or don’t want to keep count yourself), you used to have to specify ’no_plan’ at the start of your tests. That can lead to surprises if your tests exit prematurely. Instead, put the done_testing function at the end of your tests. This ensures that all tests actually run.
use strict; use warnings; use Test::More 0.88; ok(1, "first test"); ok(1, "second test"); done_testing;
2. new_ok for object creation 🔗︎
You used to have to create an object and then call isa_ok on it. Now those two can be combined with new_ok. It will also let you pass arguments in an arrayref to be used in the call to new.
use strict; use warnings;
use Test::More 0.88;
require Foo;
my $obj = new_ok("Foo");
# ... use $obj in testing ...
done_testing();
Changed “require_ok” to “require” per Ovid’s comment, below.
3. Add diagnostics only in verbose testing 🔗︎
The old diag function always prints to stderr. Particularly for debugging notes, that can clutter up the output when run under a harness. You can now use the note() function to add diagnostics that are only seen in verbose output.
use strict; use warnings;
use Test::More 0.88;
note("Testing on perl $]");
ok(1, "first test");
done_testing();
4. Explain data structures in diagnostics 🔗︎
I often find myself wanting to dump a data structure in diagnostics, and wind up loading Data::Dumper to do that. Now Test::More can do that for you with the explain() function. The output is a string that you can pass to diag or note.
use strict; use warnings;
use Test::More 0.88;
my $want = { pi => 3.14, e => 2.72, i => -1 };
my $have = get_data();
is_deeply($have, $want) or diag explain $have;
done_testing();
5. Encapsulate related tests in a subtest (0.96) 🔗︎
use strict; use warnings;
use Test::More 0.96;
pass("First test");
subtest 'An example subtest' => sub {
pass("This is a subtest");
pass("So is this");
};
pass("Third test");
done_testing();
Subtests can have their own plan, but if they don’t have one, Test::More acts like there was an implicit done_testing at the end of the code reference. That means you don’t have to keep count of tests in a subtest and things still work safely.
You can use a ‘skip_all’ plan in a subtest, too, which is a useful way of constructing a SKIP block without having to count how many tests are being skipped the way you would with the skip() function.
use strict; use warnings;
use Test::More 0.96;
pass("First test");
subtest 'Like a SKIP block' => sub {
plan 'skip_all' unless $required_condition;
pass("This is a subtest");
# ... many more tests that you don't have to count ...
};
pass("Third test");
done_testing();