Test::Moreを試してみる

30分プログラム、その352。Perlユニットテストを試してみる。
Test::SimpleとかTest::MoreとかTest::Unitとか多すぎるだろ。第1回 Perlにおけるテストの概要/TAPとは?:Happy Testing Perl|gihyo.jp … 技術評論社あたりを見るかぎりでは、Test::SimpleかTest::Moreが標準的なのかな?

使い方

$ perl counter.pl
ok 1
ok 2 - 10回incしたら、値が10増える
not ok 3 - わざと失敗してみる
#   Failed test 'わざと失敗してみる'
#   at counter.pl line 53.
not ok 4 - わざと失敗してみる
#   Failed test 'わざと失敗してみる'
#   at counter.pl line 54.
#          got: '9'
#     expected: '10'
ok 5 - 失敗しても、次のテストは実行される
1..5
# Looks like you failed 2 tests of 5.

# proveでサマリ表示
$ prove counter.pl
counter....1/?
#   Failed test 'わざと失敗してみる'
#   at counter.pl line 53.

#   Failed test 'わざと失敗してみる'
#   at counter.pl line 54.
#          got: '9'
#     expected: '10'
# Looks like you failed 2 tests of 5.
counter.... Dubious, test returned 2 (wstat 512, 0x200)
 Failed 2/5 subtests

Test Summary Report
-------------------
counter (Wstat: 512 Tests: 5 Failed: 2)
  Failed tests:  3-4
  Non-zero exit status: 2
Files=1, Tests=5,  0 wallclock secs ( 0.02 usr  0.02 sys +  0.04 cusr  0.01 csys =  0.09 CPU)
Result: FAIL

ソースコード

#! /usr/bin/perl
# -*- mode:perl; coding:utf-8 -*-
#
# counter.pl -
#
# Copyright(C) 2008 by mzp
# Author: MIZUNO Hiroki / mzpppp at gmail dot com
# http://howdyworld.org
#
# Timestamp: 2008/08/21 22:59:10
#
# This program is free software; you can redistribute it and/or
# modify it under MIT Lincence.
#

use strict;
use warnings;

# ------------------------------------------------------------
# テスト対象: カウンタ
# ------------------------------------------------------------
package Counter;

sub new {
    my ($class,$n) = @_;
    bless { 'val'=> $n || 0 },$class;
}


sub inc {
    my ($self) = @_;
    ++$self->{'val'};
}

sub dec {
    my ($self) = @_;
    --$self->{'val'};
}

sub val {
    my ($self) = @_;
    $self->{'val'};
}

# ------------------------------------------------------------
# テスト対象: カウンタ
# ------------------------------------------------------------
use Test::More 'no_plan';

my $counter = Counter->new;
ok $counter->val() == 0;

$counter->inc() for(1..10);
ok $counter->val() == 10,'10回incしたら、値が10増える';

$counter->dec();
ok $counter->val() == 10,'わざと失敗してみる';
is $counter->val(),10,'わざと失敗してみる';

ok $counter->val() == 9,'失敗しても、次のテストは実行される';