"Perl for Perl Newbies" - Part 5 - Good Programming PracticesAutomated TestingDemoTest::More

2.2.1. Test::More

Perl ships with a module called Test::More (which is part of the Test-Simple CPAN distribution, which may be more up-to-date there), that allows one to write and run tests using convenient functions. Here's an example for a test script:

#!/usr/bin/perl

use strict;
use warnings;

use Test::More tests => 7;

use Add2 (qw(add));

# TEST
is (add(0, 0),
    0,
    "0+0 == 0",
);

# TEST
is (add(2, 2),
    4,
    "2+2 == 4",
);

# TEST
is (add(4, 20),
    24,
    "4+20 == 24",
);

# TEST
is (add(20, 4),
    24,
    "20+4 == 24",
);

# TEST
is (add(-2, 8),
    6,
    "(-2)+8 == 6",
);

# TEST
is (add(4, 3.5),
    7.5,
    "4+3.5 == 7.5",
);

# TEST
is (add(3.5, 3.5),
    7,
    "3.5+3.5 == 7"
);

is() is a Test-More built-in that compares a received result ("have") to an expected result ("want") for exact equivalence. There are also ok(), which just tests for truth-hood, is_deeply() which performs a deep comparison of nested data structures, and others.

You may also notice the # TEST comments - these are Test::Count annotations that allow us to keep track of the number of test assertions that we have declared and update it.

Now, the output of this would be:

1..7
ok 1 - 0+0 == 0
ok 2 - 2+2 == 4
ok 3 - 4+20 == 24
ok 4 - 20+4 == 24
ok 5 - (-2)+8 == 6
ok 6 - 4+3.5 == 7.5
ok 7 - 3.5+3.5 == 7

This is in an output format called TAP - The Test Anything Protocol. There are several TAP parsers, which analyse the output and present a human-friendly summary. For example, we can run the test script above using the prove command-line utility that ships with perl 5:

$ prove Test-More-1.t
Test-More-1.t .. ok
All tests successful.
Files=1, Tests=7,  0 wallclock secs ( 0.06 usr  0.01 sys +  0.06 cusr  0.01 csys =  0.14 CPU)
Result: PASS

For more information refer to the following sources:

  1. Test::Tutorial on the CPAN
  2. "Testing with Perl" by Gabor Szabo - comprehensive material of a talk about Perl and testing.
  3. Test::Count - allows one to keep track of the number of assertions in the test file.
  4. Test-Run - an alternative test harness under development (with output in colour and other enhancements).
  5. The Perl Quality Assurance (QA) Project.

Written by Shlomi Fish