Kent Cowgill


Test::StubGenerator - A simple module that analyzes a given source file and automatically generates t/*.t style tests for subroutines/methods it encounters.


  use Test::StubGenerator;

  my $stub = Test::StubGenerator->new(
      file => '/path/to/',
      tidy   => 1,

  print $stub->gen_testfile;

Or, from the command line (split for easier reading):

  $ perl -MTest::StubGenerator -e '
  > my $stub = Test::StubGenerator->new({ file => "" });
  > print $stub->gen_testfile;' > Module.t


Test::StubGenerator is a module that attempts to analyze a given source file and automatically create testing stubs suitable for unit testing your code.

Test::StubGenerator make use of PPI in order to parse your code, looking for constructors and methods for modules (.pm), and subroutines for Perl script files (.pl).

Test::StubGenerator also runs the generated tests through Perl::Tidy before returning the text of the tests to you, though this can be disabled.

The idea for Test::StubGenerator grew out of a vim plugin I wrote that created test stub files in a very similar fashion. However, the line-based nature of vimscript quickly indicated that adding default parameters to the tests would prove to be an exercise in futility. As this was a feature I very much wanted to implement, I naturally turned to Perl, and PPI.


$stub = Test::StubGenerator->new( { file => '' } );


  my %options = (
    file => '/path/to/',

  my $stub - Test::StubGenerator->new( \%options );

The full list of options:


Specify the path to the module or source code file for which you want to generate test stubs.


Alternatively, if the code for which you want to create tests is already in a scalar, pass a reference to that scalar as the named source argument.


Pass a true value to indicate that you'd like your generated tests run through Perl::Tidy before being returned. This is the default. Specify a false value to disable this feature. Note, this will by default use your ~/.perltidyrc file for formatting.


If you have a particular perltidyrc file, specify its location in this option. Otherwise, the default is to use ~/.perltidyrc.


Pass a filename or an open filehandle to direct the output to. If this option isn't specified, then gen_testfile() returns the textual data directly.


Specify a directory for which to save your generated test file.



This is really the only method you need to know - after you've created a Test::StubGenerator object, simply call $teststub->gen_testfile().


Requires PPI and Perl::Tidy to be installed.


"No code provided to Test::StubGenerator"

This means you've attempted to instantiate a new Test::StubGenerator object without specifying a file for Test::StubGenerator to analyze. Either pass a filename for Test::StubGenerator to analyze and create tests for, or a reference to a scalar containing the source code you wish to analyze.

"Unable to initialize PPI document"

This means that the source you've passed to Test::StubGenerator has major problems, and PPI is unable to parse it. At the very least, ensure your code can pass `perl -Mstrict -wc <filename>` before attempting to generate tests for it with Test::StubGenerator.

"No [ packages | subs ] found"

This is just a warning message indicating that Test::StubGenerator didn't find any of the items of the specified type in your code. The functionality that Test::StubGenerator supplies might be less than optimal if the code you're analyzing doesn't contain any subroutines. :)

"No output generated"

This means that Test::StubGenerator wasn't able to produce output in the desired format according to the options passed to the constructor. Possible issues are: 1) a directory doesn't exist, 2) you don't have permission to write to it, 3) the filesystem is full, 4) something is Very Broken.

"Can't call method "gen_testfile"..."

This probably means that you've trapped an exception with eval, but ignored it by not checking if $@ ($EVAL_ERROR) has been set, and your code has attempted to call gen_testfile() without ensuring that creating a Test::StubGenerator object has been sucessfully created and initialized.

"Can't open file for writing: Permission denied"

You have passed an output directory (out_dir) that you don't have permission to write to. Make sure you have the apropriate permission to the directory you wish to create test files in.

"Can't write to file 'filename' in directory 'directory'..."

This means that you have passed an output directory that doesn't exist. Please double check that any directory you specify in the named out_dir parameter to new() exist and are writeable by your effective user id.


PPI, Perl::Tidy


This documentation describes Test::StubGenerator version 0.9.6.


Kent Cowgill,


Please report any requests, suggestions, or bugs via the RT bug-tracking system at is the RT queue for Test::StubGenerator. Please check to see if your bug has already been reported.


Many thanks to the giants whose shoulders I stand upon, including Adam Kennedy, and Steve Hancock.


Copyright (c) 2007-2009 by Kent Cowgill

This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.