Test::Class script

Ovid on 2006-08-02T09:59:08

I've probably posted this before, but it's just here so I google it later and find it easily. Note that one difference between this and some other Test::Class driver scripts is that this script assumes that all packages in TEST_DIR are test class packages which should be loaded. Thus, I don't have to have a bunch of "use" lines in this script and forget when I've added another class.

Also, note that the else condition allows me to put the following in my .vimrc:

noremap ,T  :!perl t/test_class_tests.t %

That lets me run a test class while I'm editing it.

#!/usr/bin/perl

use strict;
use warnings;
use File::Find::Rule;
use UNIVERSAL::require;

use constant TEST_DIR => 't/tests/';
use lib 'lib', 't/lib/', TEST_DIR;

sub file_to_module ($) {
    my $file = shift;
    $file =~ s/^@{[TEST_DIR]}//;
    $file =~ s/\.pm$//;
    $file =~ s{/}{::}g;
    warn $file, $/;
    return $file;
}

BEGIN {
    # tests must be loaded in a begin block or they will not be run.
    unless (@ARGV) {
        foreach
            my $file ( File::Find::Rule->file->name('*.pm')->in(TEST_DIR) )
        {
            ( file_to_module $file )->require or die $@;
        }
    }
    else {
        my $file = shift;
        unless ( -e $file ) {
            die "Could not locate file ($file)";
        }
        ( file_to_module $file )->require or die $@;
    }
}
Test::Class->runtests;


Room for improvement

Aristotle on 2006-08-02T23:56:06

First of all: unless ... else ...? What were you thinking? :)

Secondly: sticking the TEST_DIR removal in file_to_module seems like a violation of separatation of concerns. Yeah, I know this script is small, but it still bugged me when I did it in a small script of my own. My suggestion would be to fix it the same way as I did:

use File::Spec::Functions qw( abs2rel );

# ...

# file_to_module which does not concern itself with TEST_DIR

# ...

( file_to_module abs2rel $file, TEST_DIR )->require or die $@;

The script could generally stand some File::Spec attention…