++ed by:
1 non-PAUSE user
Author image Asim Jalis


Test::Extreme - A Perlish unit testing framework


  # In ModuleOne.pm combine unit tests with code

  package ModuleOne;
  use Test::Extreme;
  sub foo { return 23 };
  sub test_foo { assert_equals foo, 23 }    

  # at the end of the module 

  run_tests 'ModuleOne' if $0 =~ /ModuleOne\.pm$/;

  # To run the tests in this module on the command line type

  perl ModuleOne.pm

  # If you have tests in several modules (say in ModuleOne.pm,
  # ModuleTwo.pm and ModuleThree.pm, create test.pl containing
  # precisely the following:

  use ModuleOne;
  use ModuleTwo;
  use ModuleThree;

  run_tests 'ModuleOne', 'ModuleTwo', 'ModuleThree', 

  # Then run these tests on the command line with

  perl test.pl

  # If you prefer to get Perl's classic "ok/not ok" output use
  # replace run_tests with run_tests_as_script in all of the
  # above

  # Also take a look at Test/Extreme.pm which includes its own
  # unit tests for how to instrument a module with unit tests


Test::Extreme is a Perlish port of the xUnit testing framework. It is in the spirit of JUnit, the unit testing framework for Java, by Kent Beck and Erich Gamma. Instead of porting the implementation of JUnit we have ported its spirit to Perl.

The target market for this module is Perlish people everywhere who value laziness above all else.

Test::Extreme is especially written so that it can be easily and concisely used from Perl programs without turning them into Java and without inducing object-oriented nightmares in innocent Perl programmers. It has a shallow learning curve. The goal is to adopt the unit testing idea minus the OO cruft, and to make the world a better place by promoting the virtues of laziness, impatience and hubris.


You test a given unit (a script, a module, whatever) by using Test::Extreme, which exports the following routines into your namespace:

  assert $x            - $x is true
  assert_true $x       - $x is true
  assert_false $x      - $x is not true
  assert_passed        - the last eval did not die ($@ eq "")
  assert_failed        - the last eval caused a die ($@ ne "")
  assert_some $x       - $x is true
  assert_none          - $x is false
  assert_equals $x, $y - recursively tests arrayrefs, hashrefs
                         and strings to ensure they have the same 
  assert_contains $string, $list 
                       - $list contains $string assert_subset 
                         $element_list, $list - $element_list is 
                         a subset of $list (both are arrayrefs)
  assert_is_array $x   - $x is an arrayref
  assert_is_hash $x    - $x is a hashref
  assert_is_string $x  - $x is a scalar
  assert_size N, $list - the arrayref contains N elements
  assert_keys ['k1', 'k2'], $hash 
                       - $hash contains k1, k2 as keys

  run_tests_as_script  - run all tests in package main and emit
                         Perl's classic "ok/not ok" style output

  run_tests_as_script NS1, NS2, ...
                       - run all tests in package main, NS1,
                         NS2, and so on and emit Perl's classic 
                         "ok/not ok" style output

  run_tests            - run all tests in package main

  run_tests NS1, NS2, ...
                       - run all tests in package main, NS1,
                         NS2, and so on

For an example on how to use these assert take a look at Test/Extreme.pm which includes it own unit tests and illustrates different ways of using these asserts.

The function run_tests finds all functions that start with the word test (preceded by zero or more underscores) and runs them one at a time. It looks in the 'main' namespace by default and also looks in any namespaces passed to it as arguments.

Running the tests generates a status line (a "." for every successful test run, or an "F" for any failed test run), a summary result line ("OK" or "FAILURES!!!") and zero or more lines containing detailed error messages for any failed tests.

To get Perl's classic "ok/not ok" style output (which is useful for writing test scripts) use run_tests_as_script instead of run_tests.


See also “JUnit Cookbook” by Kent Beck, Erich Gamma http://junit.sourceforge.net/doc/cookbook/cookbook.htm for examples of how to write small unit tests around your code, and for the philosophy of test-driven development.


Asim Jalis <asimjalis@gmail.com>. Special thanks to http://metaprose.com for giving me the free time to work on this.


Copyright (C) 2002-2012 by Asim Jalis <asimjalis@gmail.com>.

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.12.4 or, at your option, any later version of Perl 5 you may have available.

See http://www.perl.com/perl/misc/Artistic.html.

1 POD Error

The following errors were encountered while parsing the POD:

Around line 511:

Non-ASCII character seen before =encoding in '“JUnit'. Assuming UTF-8