\���\¹\���

Test::Base������\���\��\���\��ď�����³��������Џ��·������\���\¹\���\³���¼\���������½��Џ���������

�돪�����돢¡�Test::Base������»���������������\���\¹\������¹�����������㏢�·������������������������������������½��Џ����������ď����я��������¹���̏�¡�perl������\���\¹\���\³���¼\�����������������𡯏��Ð�����������������Џ�����Test::Base���������¹��¡�(*Ž\��Ï��Ž\)\�����돪���������������������������³���������������³\���\¹\���\³���¼\���������½��Џ�����������������������������������¡񡭏������ޏ��������������ҏ��¾���²��Ï��¼��¡�

use strict;
use Test::Base;

filters {
    i => [qw/lines chomp array test_method/],
    e => [qw/lines chomp array/],
};

sub test_method {
    my $data = shift; # �����只�я�����\���\���\���\���\���\¹���̏�����������������������������
    $data->[0] *= 2;
    $data->[1] =~ s/\d//g;
    return $data;
}

run_is_deeply i => 'e';

__END__
===
--- i
1
sasata299
--- e
2
sasata
===
--- i
2
zozom
--- e
4
zozom

test_method������»������������������³�����я������������������������¹��¡�

1. ����ߏ���������2���������������只�я�����\���\���\���\���\���\¹������¼��؏���¼�����������¡�
2. �돫������������䏢������ߏ�����������������������2�����䏢�¹������
3. �����я����������䏢������ߏ�������������¡�ď��»��⏢�̡���������������������������������ď��������½������������¼���������½��䏢����
4. �����只�я�����\���\���\���\���\���\¹�����ҏ����ӏ��¹��¡�

i����input\������¼\��ď�¡�e����expected\������¼\��ď����ҏ��½���·���������¹��¡򏪣¹�������������������������������µ�������������������»���������¾����돢�������·���������������������������ޏ��������¹��¡�

Test::Base������\���\¹\���\³���¼\���������½��Џ��������������­��������������¡�input\������¼\��ď�����expected\������¼\��ď��������Ð���·������\���\��\���\��ď�����������������²���¹��폢�·���������������­���������¹��¡�������¡�돪�½��쏪���쏢���������������ҏ�����³��я��·���������¹��¡�����������������¡�\���\��\���\��ď�����»������������³���������¹���³����������½Ð���������������Ð��¡�\���\¹\���\³���¼\���������½��Џ���������������������������������������³��⏢�������������������������¹�����������������á�����Ï���

lines\���\��\���\���: input\������¼\��ď�����²���¹��Ԣ���������⏢�������������只�я��������·�����������ӏ��¹
chomp\���\��\���\���: \���\¹\������«��������¡񏪳��ӏ����̏�����²���¹��ԏ�����»��⏢����¼���������½��䏢����
array\���\��\���\���: �����只�я�����¼��؏���¼�����������������¡񏪮��只��\���\���\���\���\���\¹���������·�����������ӏ��¹

��̏���������������������¡�input\������¼\��ď�����lines\���\��\���\��ď�¡�chomp\���\��\���\��ď�¡�array\���\��\���\��ď��������������·��������¡�돪�������������test_method\���\��\���\��ď��������������·���������¹��¡��½������·���²�����������¡�expected\������¼\��ď�����lines\���\��\���\��ď�¡�chomp\���\��\���\��ď�¡�array\���\��\���\��ď��������������·������·���²��������ҏ����������㏢�������������������¹��¡����������������Ώ�������¡�\���\���\���\���\���\¹������\���\���\���\���\���\¹�����ҏ�����³��я��¹������������������¡�run_is��������������������������������¡�run_is_deeply������»���������������\���\���\���\���\���\¹������������ď�������»������ҏ�����³��я��·���������������������¹��¡�

���������ޏ��������¹������������¡�돪�½������«�����������С돪؏��µ������������������������Filter�����������ď��������µ�����я����������������������������̏��������¹��¡�yaml���������«eval���������«dumper���������«�����������������������¹��¡�¾��䏢�·�������������돪�²¼������\µ\���\���������»²¹������������·�����������Ώ��������������������µ��������¡�

Test::Base::Filter - Test::Base ������\���\���\���\���\���������\���\��\���\���\���\���\¹
���� ���������·������������ /usr/lib/perl5/site_perl/5.8.8/Test/Base/Filter.pm �������ď�����������\½���¼\¹�����ҏ��«���������������« ����

rails³Ð½��� ����\��\���\���\��\���\�����돫�����������������������������³����������

�����������������������돢�������������·�����������Ï�����������¡񏪲�������돪���ď��������¹��¡����������������Ώ�������¡�RSpec on Rails������»���������\Ð���¼\���\���\��я��������¹��¡�RSpec++
rspec-rails������»��������Ï�����������¡�\���\���\¹\������¼\������·��������������������������ď��������\���\���\¹\������¼\������·���������������������µ��������¡�

sudo gem install rspec-rails

�����������돢�����돪�²¼���������������Ï��������·������ rspec-rails ������»��������Ï����Ώ�����\���\���\���\��������������������ҏ�돫�����·���������¹��¡�

[sasata299@localhost] $ ruby script/generate rspec
      exists  lib/tasks
      create  lib/tasks/rspec.rake
      create  script/autospec
      create  script/spec
      create  script/spec_server
      create  spec
      create  spec/rcov.opts
      create  spec/spec.opts
      create  spec/spec_helper.rb

���³��������������¡�script������²¼������spec_server����½Ð�����������ď�������¡�spec\���\���\���\�������½Ð�����������ď�������¡�rake\³\���\���\������̏�����²������µ�����������ď�������¡�¼���������¡�

ruby script/generate rspec_controller samples
ruby script/generate rspec_model sample

���³��������������¡�controller �������돫�½������������Ð�ޏ�Џ��¹������spec\���\���\���\���������������������µ���������������¹��¡�model ����������������������������������ޏ��������������¹��¡�

¼�������DB������돫�����������¹��¡�¼���������migration������������������µ����½���̏���������������¡񏪣¾������SQL�����ҏ������«���������������������������������ޏ����������я��������¹������������¡��³������������rails��������������������������̏�����µ����½���������¹��¡�

# config/database.yml�����ҏ�����½���(ID, PASS, socket)
rake db:create
rake db:create RAILS_ENV=test

DB½Ð�����������ď��¼��¡����������я�����������¹��ԏ��­���������¹��������¡�migration\���\���\���\��������ҏ�����½������·��������¡�\������¼\���\���������돫��������¹��ԏ��������������¹��¡�

# db/migrate/xxx_create_items.yml�����ҏ�����½���
rake db:migrate
rake db:migrate RAILS_ENV=test

\������¼\���\������������µ»���½Ð���������������·�����ď�¡��½���·��������¡�rails������������\������¼\��ď��������������Џ�����\³\���\���\���������½Ð���������������¹��¡�fixture\���\���\���\��������ҏ�돫�����·��������¡�rake\³\���\���\����������돫����������������¹��¡��³��������������������¡�����������������������돪䏢����������������rake\¹\���\���\��\���������»������������������������¹��¡�

require 'active_record'
require 'active_record/fixtures'
namespace :db do
  def load_data(env)
    ActiveRecord::Base.establish_connection(env)
    pattern = File.join(RAILS_ROOT, 'db', 'fixtures', env.to_s, '*.{yml,csv}')
    Dir.glob(pattern).each do |fixture_file|
      table_name = File.basename(fixture_file, '.*')
      Fixtures.create_fixtures('db/fixtures/' + env.to_s, table_name)
    end
  end

  namespace :import do
    desc "Load fixture data into the development database."
    task :development => :environment do
      load_data :development
    end
    
    desc "Load fixture data into the production database."
    task :production => :environment do
      load_data :production
    end
  end
end

���³��������������¡�db/fixtures/������²¼������fixture\���\���\���\��������ҏ��µ���·���������������������������������������������¹��¡�
db:import:development�����������������ď�������¡�development������²¼��¡�db:import:production�����������������ď�������¡�production������²¼�����������������������ġ������������������¹��¡���������������������test/fixtures������²¼�����ҏ��µ���·���������������­���������¹����

mkdir -p db/fixtures/development

# db/fixtures/development/items.yml�����ҏ�����½���
rake db:import:development

���³������������\������¼\���\���������\������¼\��ď��̏����������Џ��µ���������������·�����ď�¡�
test\���\��\���\���\���\�����������������³»����������������������������������������������������������������¹��������¡�(Ž���Ž��Ρ����Ž���)Ž���Ž���޲Ž���! (Ž���Ž��Ρ����Ž���)Ž���Ž���޲Ž���!

��돪���������������¡�autotest������µ�������돢�·���������¹��¡��\���\¹\��������Џ�����fixture\���\���\���\���������spec/fixtures������²¼�����������ӏ��­���������¹��¡�

export RSPEC=true
ruby script/spec_server
autotest # RAILS_ROOT������¼���¹���

���³��������������¡�controller������model��¡�spec\���\���\���\��������������������ҏ�����¹¹���¹������������¼«����돢����\���\¹\������̏����ӏ��������������¹��¡��³���������¾\���\¹\���\���\����¼\¹\������������¹���������쏢��


Rails\\·\\\\ 183µ»Rails\���\·\���\���\���\��� 183������µ»
������¼��ԏ�¡�¹������� �����µ���
�������������µ��¡�\½\���\���\Ð\���\���\���\���\��\���\���\��\���
�����������������䏢¡�2008-05-31
�����쏢�¹���¹�����������㏢¡�5.0
\���\���\³\��Ώ����ҏ��«������

perl������autotest�����ҏ�돫����������������Ώ�����

�����������䏢¡�ruby������autotest���̏��������²���������·������������������������µ­»��ӏ�����½��Џ��­���������·�����ď�¡�
���½��������������¡�perl����������������ޏ����������������Ï������������̏��������������«����������������»�ߏ���������������������㏢���������Ώ����ď�������¡�Test::Continuous�����������������Ï��������ҏ��«���������ޏ��������·�����ď�¡�

���³���������̏����叢����»��������������ҏ����Џ����ď��·�����������������������я��������¹���ޏ�������¡�Mac::Growl������������\���\���\������¼\������̏���̏�ď�䏢���Ώ����ď�����������\���\���\¹\������¼\�������½Ð���������������������Ï��Ï��Ï�¡���������¡�½Ð���������������ÐAutotest::screen�����Ώ����ď�����������·���²���������screen������\Ð\·���������������½¼�����µ���»�����ď�����

���������������³��������������¡�¼«����̏�������돫��������������·�����ď�����.Ž���Ž���+.(Ž\���Ž\)Ž���+.Ž��Ώ����³�����я�����������������¡�

autotest.pl
#!/usr/bin/perl

use strict;
use warnings;
use Cwd;
use File::Modified;
use Getopt::Long;

my $color = {
    black  => 'dd',
    green  => 'gk',
    red    => 'rw',
    yellow => 'yk',
};

my $all = 0;
GetOptions( all => \$all );

my $statusline = "%`%-w%{=b cw}%n %t%{-}%+w %=";
   
my $ra_list = get_files();
my $m = File::Modified->new( files => $ra_list );

my @changes;
while(1) {
    if (@changes = $m->changed) {
        for (@changes) {
            my $return_code = system "perl -cw $_";
                
            if ($return_code eq '0') {
                my @tmp = split /\//, $_;
                $tmp[-1] =~ s/(.+)\.(pl|pm)/$1.t/;
                my $test = join "/", @tmp;
                my $output = $all ? `prove -v *` : `prove -v $test`;
                    
                print "$output\n";
                send_msg('Testing...', $color->{black});
                sleep 1;
                    
                if ($output =~ m#Failed test:\s+(\d+)#) {
                    my $fail_num = $1;
                    if ($output =~ m#Tests=(\d+),#) {
                        send_msg('Error T:' . $2 . ' F:' . $1, $color->{red});
                    }
                }
                else {
                    send_msg('All success', $color->{green});
                }
            }
            else {
                send_msg('Syntax error', $color->{yellow});
            }
        }
        $m->update; # ½��������²½
    }
    sleep 1;
}

sub get_files {
    my $dir = getcwd;
    my @list = `find $dir/ -regex ".*\.p[lm]"`;
    push @list, `find $dir/ -regex ".*\.t"`;
    chomp for @list;
    return \@list;
}

sub send_msg {
    my ($msg, $color) = @_;
    my $message = qq/%{=b $color} $msg %{-}/;
    $message =~ s/'/\'/g;
    my $cmd = qq{screen -X eval 'hardstatus alwayslastline "%`%-w%{=b cw}%n %t%{-}%+w %= $message"'}; 
    system $cmd;
}

���³���³�����������ӏ����������������������������¹��¡�\���\��\���\���\��\���\������·�����������Ώ��������������������µ��������¡�

»����������������������·��������������¡�
­���autotest.pl������\���\¹���̏�����������������¾���½��������������ӏ�����
­��¹¹���·�����ҡ����»������·�����ď�����\���\��\���\���\���\�����������¡�autotest.pl������¼���¹���
­���½������\���\��\���\���\���\����돪�²¼������\���\���\���\���������¹¹���·�����ҏ�돩�µ�񏪩��쏢����\���\��\���\���
­������½������������������\���\���\���\���������������¹¹���̏�������������¾���¹�����¡񏪤Ð�ޏ�Џ��¹������\���\¹\�������������𡯏��Ð��¡�xyz.pl������¾���¹�����¡�xyz.t����������¼���¹���
­\·���²���������screen������½Ð����

�����������я�����autotest���������¹������������¡돢¡돢¡�����

���⏪����µ­(081104)����
all\���\��\·\���\��я����ҏ����؏��ޏ�����µ�������돢�µ���»��������������¡�µ�������돢�·������\���\��\���\���\���\����돪�²¼���������������������\���\¹\���\³���¼\�������¼���¹��ԏ��µ�����������������������Ï�����½������µ���·���������·�����ď�¡�
autotest.pl --all

������������������������½������µ�����Џ�����������»�ߏ����Ï��ޏ�������¡���������������𡯏����롭�돪����������¹��¡�
���³������������perl������������\���\¹\�����������³«���������������¼��¡�(���­��Ï����������­��Ï������)Ž���

RSpec + Autotest::screen = ��돪�¹���������³«�������������­

���⏪����µ­090704����
RSpec������\���\¹\���\³���¼\���������½��Џ����������ď����������������� - (Ž��Ρ��Ž���)o�ߏ�� sasata299's blog ���������»���»��������𡭏�������������������µ��������¡�

³«������������\���\¹\���\���\����¼\¹\��������������������������ď�����������������¡������­�������*)�����½������»�ߏ�����������������������������������Ruby������\���\¹\�������������������������������������㏢���������������ď�������¡�TDD����\���\¹\�����������³«�������������������Ð���·��������¡�BDD����\���\���\���\���\���������³«���������������������������Ï��������������ҏ��������«���·���������·�����ď�¡�

��������¡�ruby�������������������������������������¹���̏�¡�ruby������������RSpec������������������BDD�����Џ�����\���\������¼\���\������¼\������̏����������������¹��¡�RSpec���������ޏ�����������·���¹½�����������̏��������¹��¡����ď�������¡��½���³�����������������������Џ�����������������������������\���\¹\��������ҏ����ӏ��������»�����ď��������¹�������������̏������������������������ޏ����������я��������¹��������¡�¡�¡�

���½���³��������¡�autotest������½Ð�����ӏ��������¹���쏢�쏢�³��������������¡�\���\���\���\���������������¹¹���̏������������ď�������¡��½���������������Ð�ޏ�Џ��¹������\���\¹\���\³���¼\���������¼«����돢���������ӏ��������»��������������������������¡����������������Ï��������²���������·������\������¼\������������¹��¡�

���³������2�����������ҏ�����������¹������������»��������������¡񏪲���¾���������µ�������̏���������³«����������¹��ԏ�𡯏��½�����Ï��������¹��¡��³���������²���������������������������¡�RSpec + autotest ����������������¹������������»����»������������������������������������¹��¡�¹�����𡯏���������������������������»²¹������������������������������·�����ď�¡�







���Ï��Ï��Ï�������¡����������Ï��³���������������³���������²�����������ġ����������µ��������������¡񏪡���������RSpec������autotest������\���\���\¹\������¼\������·���������·�����ď�¡�(autotest������ZenTest������\���\���\¹\������¼\������¹�����������������Џ��������������¹)

sudo gem install rspec
sudo gem install ZenTest

�����ď�������¡�autotest�����ҏ���돢�«���·��������������������������¡�·���²���������³���������¹�������������̏����������������Џ������������������������¹��¡򏪴���\���\��\���\���\��Ï����������⏢������������𡯏����ď��������������«��������������������������������¡�¡�¡�¾���¼���������\���\¹\���������·���²������̏����䏢���������ԏ�����¹��Џ����я�����������������¾��؏����ӏ��̏����򏪡��叢�������¹��¡�

�����²���������������������������¡�Growl�������������������µ���»���������������������·�����ď���������������·��������¡������̏�¡�»�������돢�������̏�����³«�������������­������Linux����������������Growl�����������������������»������Ž���Ž���(Ž��Ώ��­��\����Ž���)��¢�Ž���޳Ž��Ž��Ž��Ž�����Windows��������������¡�snarl�����������������Ï����쏪����»��������������������������¹���̏��Ï��Ï���

���Ï��Ï�����»�ߏ����������������������ď�������¡������µ���½�����Ï������������̏������������ď����я��������¹���쏢�쏢�½�������¾������ Autotest::screen ��¡�ZenTest������\���\���\¹\������¼\������¹���������м«����돪���쏢����\���\���\¹\������¼\������µ���������������������������¹��¡��³������������»��������Ï�������¡�������¡�������¡�������¡����������я�����

1) \���\���\���\���������¹¹»��Џ�����¼«����돢����\���\¹\������̏����ӏ�������¡��·���«������
2) ���½������·���²�������screen������\¹\������¼\���\¹\���\���\��я��������½¼�����µ����������������

�����������������Ï�������������������Ï��������³������������¼������½���·���������������������������¹���쏢�쏢�³������������\���\¹\¹\������������¹��¡�
���³���������«������������\���\¹\���������½��Џ��­���������̏�����³«���������·���������������������¾(*Ž\��Ï��Ž\)\����������������»\��\���\���\���\���³«��������¡�

«³

�����Ώ�����\���\���\���\�������.autotest�������������³�����я�����������������¡�
Autotest.add_discovery do
  "rspec" # use Autotest::Rspec
end

Autotest.add_hook :initialize do |at|
  at.add_mapping(/([\w\0-9]+)\.rb$/) {|f, matched|
    "spec/#{matched[1]}_spec.rb"
  }
end

require 'autotest/screen'

class Autotest

  # Autotest::Screen������������µ������µ������������������������:ran_command�����ҏ����̏����Џ��·�����������������ď�����
  HOOKS[:ran_command].clear
end

require 'autotest/redgreen'

Autotest::HOOKS.delete(:interrupt)
Autotest::Screen.statusline = "%`%-w%{=b cw}%n %t%{-}%+w %="

class Autotest::Screen
  SCREEN_COLOR[:yellow] = 'yk'

  Autotest.add_hook :run_command do |at|
    if at.files_to_test.empty? or /models/ =~ at.files_to_test.keys[0]
      message 'Testing...' if execute?
    end
  end

  Autotest.add_hook :ran_command do |at|
    return unless execute?

    output = at.results.join
    total, failed, pending, syntax_err = 0, 0, 0, false

    if /(\d+) examples?, (\d+) failures?(?:, (\d+) pendings?)?/ =~ output
      total   = $1.to_i
      failed  = $2.to_i
      pending = $3.to_i
    elsif /syntax error/ =~ output or output == "\n"
      syntax_err = true
    end

    if syntax_err
      message "Syntax error", :yellow
    elsif failed >= 1
      message "T:#{total} F:#{failed} p:#{pending}", :red
    elsif pending >= 1 
      message "T:#{total} F:#{failed} P:#{pending}", :green
    else
      message "All success", :green
    end
  end
end

perl������\���\¹\���������prove���¹�����㏢�·

��돪������������������������perl�������������²���������·���µ������µ������̏��������������������­������sasata299���������¹��¡��³�����я��Ð�����я�����(�����­_���µ`)\���
���򏩡��䏢����CPAN������\���\���\¹\������¼\���(make test)������������»���������������������������������prove\³\���\���\���������������������������½��Џ��­�����ď�����������»�ߏ��������������¹��¡��³�����я��������������������������¹��¡�

t/00_compile...........ok
t/01_base..............ok
t/02_test_more.........ok
t/03_test_exception....ok
t/04_prints_ok.........ok
t/05_stderr_ok.........ok
t/06_blocks............ok
t/98_perlcritic........ok
t/pod..................ok

\���\¹\���\³���¼\���������½��Џ����������ď��������­��¡�

perl t/hoge.t

�����������������������������������������я��������¹���̏�¡��³���������������������«���������������������·��¡�¼«��돫�����\���\���\������¼\���������\���\¹\���������»��������������������ď��������¹��������������¡�����¼�������쏢����\���\¹������»������������·���������������������������­���������������ޏ��������»�����я�¡��³�����я�����������������������¡�

perl -Ilib t/hoge.t

���·���«��������¡񏪴��ď�ԏ�����\���\¹\��������ҏ����»��Џ�����������½Ð�����������������������������Ï��������¹��¡�¡�¡�

perl -Ilib t/*

���������«½��Џ������������������돫������������䏢����\���\¹\���������½��쏢�������������������·���������������������¹(��¡����­��\����)

���½���³������prove������½Ð�����ӏ��������¹��¡��³������������Test::Harness������\���\���\¹\������¼\������¹�������������돫�½���������\���\���\¹\������¼\������µ������������\���\¹\��������Џ�����\³\���\���\������������¹��¡�����������¡�CPAN������»������������������������Ð�����ď���̏����Џ��������������������������������·�����������Ï�¡�

# -v,  --verbose     Print all test lines.
# -l,  --lib         Add ����lib���� to the path for your tests (-Ilib).
# -r,  --recurse     Recursively descend intdirectories.
prove -vlr t

���³���������������ޏ�������¡�t\���\��\���\���\���\����돪�²¼���������������������\���\¹\���\³���¼\���������\���\��\���\������·��������������������������¡��·���«������\��\������¼���̏�������������¾���¹��������������������ӏ��������½¼�����·���������������������������¹��¡����������̏����������Ï��쏢�쏢���������������Ï��³������������»��������������������������򏪿³���̏����������������»�����я�¡�prove++
karaage299 at gmail.com
��돪������������µ­»���
\���\��\���\���\���\���