Test::Reuse - Reusable Test::More tests in classes
Test::Reuse was created for the sole purpose of writing really easy-to-use, reusable tests. You can create tests in a class, use your class name in the test (which will also deploy all Test::More features for you), then you can use specific tests from that class. You can also pass arguments to these tests.
use
OK, say we have the very same test running in several different tests. You don't want to just keep copy and pasting that code because it clutters up space when it doesn't need to. So we start by writing the test class to where our reusable tests will be imported from.
package MyTestClass; use Test::Reuse; subtest 'is_it_ok' => sub { my $test = shift; for (@_) { ok $_, "$_ seems just fine!"; } };
The subtest method in class that uses Test::Reuse actually stores the tests that are reusable. It won't actually run a subtest. The first argument will always be the test class name. In this instance it is MyTestClass. Now let's write the actual test.
subtest
Test::Reuse
#!perl use MyTestClass; use_test 'is_it_ok', qw<1 2 3 4 0 5>; runtests();
That's it. We use use_test followed by the subtest name. You can supply optional arguments afterwards if you like. Remember to always call runtests when you're done, which is identical to done_testing. In the above example it will loop through all of numbers in the array we provided and will obviously fail on the fifth argument (the 0). You can also run use_test within the test class to control the flow a bit more.
use_test
runtests
done_testing
package MyTestClass; use Test::Reuse; subtest 'is_it_ok' => sub { my $test = shift; if (@_) { for (@_) { ok $_, "$_ seems just fine!"; } } else { use_test 'show_problem', 'No arguments for is_it_ok'; } }; subtest 'show_problem' => sub { my ($test, $text) = @_; note "Woops!: ${text}"; };
Test::Reuse uses all the methods from Test::More, but there are a couple that are used just in this module.
Calls a test from the test class. They must be defined in the test class using subtest
use_test 'method_name', qw<optional arguments here>; use_test 'my_test';
Technically this works exactly the same as Test::More's subtest in your test file, but in the test class it simply defines a reusable test.
subtest 'reusable_test_name' => sub { my $test_class = shift; note "Running from ${test_class}"; };
I don't like the way done_testing looks, so swapped it for runtests. But you are welcome to use either one in your code. This MUST be run at the bottom of your normal test file (.t), or it will freak out. Which is pretty normal if you don't declare a plan.
This module is still new, so there are plenty. The main one at the moment being that you can only use ONE reusable test class per test. It really sucks, I know. In the future I would love to be able to reuse tests from multiple classes, but at the moment it only works with one.
Brad Haywood <brad@perlpowered.com>
You may distribute this code under the same terms as Perl itself, because Perl is awesome, and so are you for using it.
To install Test::Reuse, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Test::Reuse
CPAN shell
perl -MCPAN -e shell install Test::Reuse
For more information on module installation, please visit the detailed CPAN module installation guide.