Perl web app 테스트전략
-
Upload
jeen-lee -
Category
Technology
-
view
1.773 -
download
0
description
Transcript of Perl web app 테스트전략
+;HB�2;8��FF�Ɨĕƚ�޼
�% )6' ���.$' 3
&EH;7D�+;HB�2EHAI>EF��� �
+;HB�2;8��FF�Ɨĕƚ���
2�-)$)"��
Ŝ¹�ŐXŊƗĕƚ�IJŲ�ĩV�ġ���/���ũŎŕV�ġ���
Ɨĕƚ�Žŋ�¡ũj�ă÷�ŝŏ�ĮĖ��
�=;D:7
+;HB�/;IJ?D=�İ��ƱĆ
+;HB�È�ğ��Ɨĕƚƌª
0$�/;IJ��.;B;D?KC��+>7DJEC%.
�EDJ?DKEKI�$DJ;H=H7J?ED��/H7L?I��$��%;DA?DI
+;HB�/;IJ?D=
https://metacpan.org/source/JJNAPIORK/Catalyst-Runtime-5.90016/t
�+�)�Ŏ�_Ŏ�ß«�ß©İ��ŏÂd�ƗĕƚƌªV�ŔĖ��
https://metacpan.org/source/JJNAPIORK/Catalyst-Runtime-5.90016/t/dead_recursive_chained_attributes.t
Ɨĕƚ���FHEL;�È�ęƳƯ���
TestAnythingProtocol
Ɨĕƚgl��/�+�ƷĘʼnÈ�ƃƦ���
cpantesters.org
Number of CPAN Distributions on CPAN
26,171
2012. 10. 19
Number of CPAN Testers Reports
23,816,487
2012. 10. 19
�Ƅ�Ô¬ĩĆ
�
ĸÐÝ
!�$'��
!�$'��
!�$'��
�+�)�/;IJ;H�V�£ĩũĊľ�
>JJF���M?A?9F7DJ;IJ;HIEH=�M?A?�";JJ?D=.J7HJ;:
���V�����
+;HB�Ɨĕƚ�ƌªÎ�ĩ´d�Ġyľ�
Test::ClassTest::Deep
Test::FITesqueTest::TCP
Test::MockObject
Test::mysqld
Test::Git
Test::YAMLTest::....
/;IJ������Ɛj�ġÏ�Ė��
Test::Simple
Test::More
Test::Most
Test::Simple
ok( <expression>, <description> );
Test::Simple#!/usr/bin/env perluse strict;use warnings;use Test::Simple tests => 3;
sub is_number_two {returnshift == 2;}
my$var = 'JEEN is married to Hanny-Mama';ok(1+1 == 2, '1+1 = 2');ok($var =~ /married/, 'JEEN is married');ok(is_number_two(2), 'is_number(2) returns true?');
Test::Moreok( <expression>, <description> );is( <got>, <expected>, <description>);isnt( <got>, <expected>, <description>);like( <got>, <expected>, <description>);unlike( <got>, <expected>, <description>);isa_ok( <got>, <expected> );is_deeply( <HASH>, <HASH>, <description> );
SKIP: {}TODO: {}
Test::More#!/usr/bin/env perl use strict; use warnings; use Test::Base tests => 4;
my$var = 'JEEN is married'; my%hash1 = (is_solo => 1,gender => 'male');
my%hash2 = (is_solo => 1,gender => 'male',);ok(1+1 == 2, '1+1 = 2');is(1+1, 2, '1+1 = 2');like($var, qr/married/, 'JEEN is married');is_deeply(\%hash1, \%hash2, 'equal hashes');
ŕŗƭ�Ɨĕƚ�mÇ�İƩĐª�ƫ�
SŅ�Ɔħş�kf�ĕƐÒƚÎ�Ɨĕƚƌª�ƷĘʼnÈ�ğÝ�
�Ŭİ�ŀġƫd�ƢÚŋ�è}Ć��
sÀƭ�ÐƢƚÎ�Ô¬ĩ���ē�Ŕe�T
�. ��Ļ
TAP::Formatter::HTML
QŏÂd�ÖŏŨR
Sķķ���sc�Ż�Ư�Ư���
sÂd�ƫÝ�j^�İd���ŋ�glã��Ĕd�Āġ�epľ��T
Sŏ¿�ĘʼnÈ�ýŭĬƫd�Ƥƶƫj�ÖŏŨT
#!/usr/bin/env perluse strict;use warnings;use utf8;use Test::More tests => 2;
BEGIN{binmodeSTDOUT, ':utf8';};
subtest '001) 의존모듈 확인' => sub { use_ok 'LWP::UserAgent'; use_ok 'URI'; use_ok 'URI::QueryParam';};
my$host = $ENV{TARGET_HOST} || 'http://test-domain-blah-blah';
my$ua = LWP::UserAgent->new();$ua->timeout(10);
subtest '002) XSS' => sub {while(<DATA>) {s/[\r\n]//g;my$uri = URI->new($host . $_);my@query_param = $uri->query_param;my$param_count = scalar@query_param;formy$idx (1 .. $param_count) {$uri->query_form({$uri->query_form,$query_param[$idx-1] => "<script>alert('xss');</script>" });my$res_xss = $ua->get($uri); unlike($res_xss->decoded_content, qr{<script>alert\('xss '\);</script>}); } }};
done_testing();
__DATA__..................
t/ 001-xss.t 002-sql-injection.t 003-directory-indexing.t 004-filedownload.t 005-path-location.t 006-os-command.t ... ... ...
Sj^���ijw�ŀġƭ�ƗĕƚƌªV�¢ġV��řÝŋ�øũĊľ�T
$ prove -v tt/001-xss.t ..1..2ok 1 - 001) 모듈 의존성 확인 ok 1 LWP::UserAgent ok 2 URI ok 3 URI::QueryParamok 2 - 002) XSS ok .... ok .... ok .......
All tests successful.Files=xx, Tests=xxx, x wallclock secs ( 0.xx usr 0.xx sys + 0.xx cusr 0.xx csys = x.xx CPU)Result: PASS
SsÐj�ŏaÈ�ŀÐ��ŀġƭ�ÐƢƚÎÔ¬ĩ��dľ��T
S�Ƈj� N9;Bİ�uÈ�ĝũĊľ�T
kkŎ�ŝ��òŊ�ƁĐƭŏ�
/>;�:E9KC;DJ�?I�7J�B;7IJ���
sÁ�2;8��FF�/;IJ?D=Ŋ�ĩ´d�
� ��#//+�-;GK;IJ��$DFKJ�
����#//+�-;IFEDI;�*KJFKJ�
���Q�R�[ŏ�Ŕ��Ų�ƻŐQ�R�[ŏ�Ŕ��Ų�ƻŐQ�R�[ŏ�Ŕ��Ų�ƻŐ
~Ő�ľ�
use strict;use warnings;use utf8;use Test::More;
use Catalyst::Test 'MySocial::App';use HTTP::Request::Common;use JSON::XS;use MySocial::App;
my$reply = "악플은 최소한입니다.";
my$photo = MySocial::App->path_to('root', 'static', 'images', 'profile', 'pict22.jpg');my$res = request( POST "/rate/1/comment","X-Social-Token" => "f9a077fae03cf63bc4b351344531bde91f0f26c9","Content_Type" => "form-data",Content => [reply => $reply,photo => [ $photo->stringify, $photo->stringify, "Content-Type" => "image/jpg" ], ]);
my$data = JSON::XS::decode_json($res->content);
ok($data->{success}, "리퀘스트 성공");ok($data->{comment}, "코멘트가 있습니다.");ok($data->{comment}->{id}, "코멘트 ID 가 제대로 존재합니다.");ok($data->{comment}->{reply}eq$reply, "코멘트 내용이 입력한 값과 동일합니다.");ok($data->{comment}->{user}, "코멘트 입력자가 존재합니다.");
done_testing();
���������&04&23
����������&2/.-2&
�����(&$*
����K� �v��j��L
└── t ├── 00100_controller_User.t ├── 00101_controller_User_signup.t ├── 00102_controller_User_signin-out.t ├── 00103_controller_User_get_user.t ├── 00104_controller_User_friend.t ├── 00105_controller_User_get_friends.t ├── 00106_controller_User_unfriend.t ├── 00107_controller_User_update_info.t ├── 00108_controller_User_suggested_users.t ├── 00109_controller_User_get_users.t ├── 00110_controller_User_update_devicetoken.t ├── 00200_controller_Ask.t ├── 00201_controller_Ask_add.t ├── 00202_controller_Ask_get_ask.t ├── 00203_controller_Ask_get_asks.t ├── 00204_controller_Ask_comment.t ├── 00205_controller_Ask_get_comments.t ├── 00206_controller_Ask_delete_comment.t ├── 00300_controller_Venue.t ├── 00301_controller_Venue_add.t ├── 00302_controller_Venue_get_venue.t ├── 00303_controller_Venue_get_venues.t ├── 00304_controller_Venue_report.t ├── 00305_controller_Venue_get_photos.t ├── 00306_controller_Venue_get_photo.t
├── 00400_controller_Scrap.t ├── 00401_controller_Scrap_add_category.t ├── 00402_controller_Scrap_get_categories.t ├── 00403_controller_Scrap_delete_category.t ├── 00404_controller_Scrap_add.t ├── 00405_controller_Scrap_get_scraps.t ├── 00406_controller_Scrap_delete_scrap.t ├── 00500_controller_Rate.t ├── 00501_controller_Rate_add.t ├── 00502_controller_Rate_get_rate.t ├── 00503_controller_Rate_get_rates.t ├── 00504_controller_Rate_comment.t ├── 00505_controller_Rate_get_comments.t ├── 00506_controller_Rate_delete_comment.t ├── 00506_controller_Rate_delete_comment.t.html ├── 00600_controller_Notification.t ├── 00601_controller_Notification_add.t ├── 00602_controller_Notification_get_notifications.t ├── model_API.t └── view_JSON.t
z����K� �v��j��L
use strict;use warnings;use Test::More tests => 4;use Test::WWW::Mechanize; my $id = 'your_naver_id';my $passwd = 'your_naver_password';my $reply = 'Check! :)';chomp($reply); my $url = 'http://nid.naver.com/nidlogin.login';my $mech = WWW::Mechanize->new();$mech->get_ok($url, ‘로그인페이지에 접속’);my $res = $mech->submit_form_ok({ form_name => 'frmNIDLogin', fields => { id => $id, pw => $passwd },}, ‘폼 서브밋성공’); my $base_url = 'http://cafe.naver.com/AttendanceView.nhn';my $check_urls = "$base_url?search.clubid=18062050&search.menuid=6"; $mech->get_ok($check_url, ‘카페에 접속’);$mech->field('content', $reply);$mech->submit();$mech->content_like(qr/$reply/, ‘댓글 등록확인’);
���E��&.4+�/,����WjXj�IQ���?�C��L�D�_����¡���
Ŧ����Ĩƭ�ĶĽĄƼ�ëąŋ�jÅƱĆ�ŖĉƮē�
�óť¤�#//+�ÐƎĕƚ��ŝƯƫŲ�ģŊ��ŏƖƐw
��Štrƭŏ�ŇƽƭŲ��Ŭö¤��ŏƖ
sÁ�Ɨĕƚ��ŏƖ��ĩ´d�
� ��Ɨĕƚ����Ĉš
(O.,'�.7D:8EN�/;IJ��COIGB:�LI
ŴŶ�Ɨĕƚ��
����ƀw�Ɨĕƚ��ŏƖč�Ūý
schema.sqlCREATE TABLE ...CREATE TABLE ......
data.sql / jsonINSERT INTO ...INSERT INTO ......
DBIx::Class::FixturesDBIx::Class::Migration
ƹŊ�!7A;��ŏƖ�ąĉ�o��>;7J;H���7J7��!7A;H�
����sÐj�ä�Ɨĕƚ�¢Ðw
ġ{ğj
��ğj
è}ğj
�ėğj
0$�/;IJ?D=
ăę�ľŰ�Ņ]ëİĆ�ĆðŸõ�
Ƒ¸ŏīƚŸİ
��ƀşŏ�Øƅţ�Ŕ��
ŏÂd�ƫÝ�ĩ³�d�ā��¶j�ŜÂd�ƫÝ�µ�ĩ³�d�ā��¶j
�@7N�V�ĩŷj�Ŝŷj�%7L7I9H?FJ�(1��ƧÃŒłƐV
ĩŷjŜŷj�éōƷŅăŏƚV�ĩŷjŜŷj
.;B;D?KC
>JJF���@;;DJ?IJEHO9EC�I;7H9>�.;B;D?KC
ŕŗƭ��ÆŎ�ƿŝ¬ŋ�ŻjƱũĊľ
.;B;D?KC��.;B;D?KC.;B;D?KC�-� 2;8�H?L;H
bMw�����R����A����Xwj�`��dg��G�pR@���S����A�����qRL��GxRL�"5"2$1)/3��LR�^dl��i��F��JRY���
��&+&-)4,�.1&� ��2&-%!*&72!�����"$$&/3!"+&13��
�����
.;B;D?KC��.;B;D?KC.;B;D?KC�-� 2;8�H?L;H
3
ßèőww�Ģ¬Ƹ�İĆ��.;B;D?KC�2;8�H?L;HÎŏĿƱĆ�0$�ƗĕƚÎ�Ʈ�ē�Ŕ�j
ƫŲÔ�ėƈÛ�Ɩå�ŋ�ůw��Ćðśŏ¬İd�Ğ��ƓŲ�ģ��ćƕőŲ�
s¿�ăº¬İd�ćƕŲV�¥
�4#;7:B;II�2;8I?J;�/;IJ?D=5
�("-3.,���)2�"�(&"%+&22� &#�)3�6)3(��"5"�$1)/3����
SsÁ�Ɨĕƚƌª��%.�È�ƱĦ£��T
SƠ�ğŕj�ŏÂd�ßŐ�Ó�İ�T
2?=>J
>JJF���C;J79F7DEH=�CE:KB;�2?=>J
2?=>J���2;8IE9A;J���+>7DJEC%.�
ŢWW�ăĿîò���Í��kùƱĦ�Ʈ�c¬��ÕġŲj
222��(;9>7D?P; .;B;D?KC 2?=>J
ơŏŲ�Št �=;J�45� �=;J�45� �L?I?J�45�
ƑÑ�9B?9A6B?DA�45�
�9B?9A68KJJED�45��9B?9A�45� �<?D:�45��9B?9A��
ƣİ�[�Ųš �I;J6<?;B:�45���<?D:6;B;C;DJ�45�
�I;D:6A;OI�45��<?D:�45��I;J�45�
%.�ęƳ 3 �;N;9KJ;6I9H?FJ�45� �;N;9KJ;�45�
2H?J;�*D9;��HKD�7DOM>;H;
��HEMD?;���HEMI;H�?DJ;=H7J?ED�<H7C;MEHA
use Test::More;use Brownie::Session;
# external servermy $session = Brownie::Session->new( driver => 'Mechanize', app_host => 'http://app.example.com:5000',);
# PSGI appmy $session = Brownie::Session->new( driver => 'Mechanize', app => sub { ...(PSGI app)... },);
�1.6-)&���1)5&1���&$("-)8&�1.6-)&���1)5&1���&+&-)4,�&15&1
�1.6-)&���1)5&1�� )'(3�F�m��r~
ª¸ŏðÔ�Yġ�ŀÝ�~�ƛš�ƸĕƚĂÔ�ġ�¸�]ëŬŐ�ŅĩƨÐƊŏĎİ��ƱĆ
�ô�Ŏ�ĆðÎ�·ŀŲ�ģj�Ɨĕƚ�V�
222��(;9>7D?P; .;B;D?KC 2?=>J �HEMD?;
ơŏŲ�Št �=;J�� �=;J�� �L?I?J�� �L?I?J��
ƑÑ�9B?9A6B?DA��
�9B?9A68KJJED���9B?9A�4'*��/*-5�
�<?D:�43+�/#5��9B?9A��
�9B?9A6ED��
ƣİ�[�Ųš�I;J6<?;B:��
<EHC ����QL7BK;R���<?D:6;B;C;DJ�45��I;D:6A;OI�41�'0 5�
�<?D:�43+�/#5��I;J�41�'0 5�
�<?BB6?D��
%.�ęƳ 3 �;N;9KJ;6I9H?FJ�� �;N;9KJ;�� �;N;9KJ;6I9H?FJ��
2H?J;�*D9;��HKD�7DOM>;H;��
ƫŲÔ�ĩ¯yŲ��Qw÷ŝŐ�ăĿRİ�Ŭşŋ�§j�Ŕwİ��WWŎ�ª¸ŏðV�VŴ�jŇŎ�w�ŋ�ăĿƫw�ņƱĆ��
Ŧ���jĚƱĦ
sÁ�Ɨĕƚ��ĩ´d�Ʈyľ�
�Ɨĕƚ��ăºŏ�Ɨĕƚ��ƭñÔ�Ɨĕƚ�gl���ʼnÈ�Ɨĕƚ�ÐƢƚ��ıċÈ�Ɨĕƚ�ÐƢƚ��ŐĒƱĆ�Ɨĕƚ�ÐƢƚ��ĕƔƨ¾È
Ɨĕƚ��ŏÂd�ƫÝ
�Ɨĕƚ��ăºŏ���wiV�Ɨĕƚ��ƭñÔ���iđ�Ɨĕƚ�gl���ʼnÈ���ĤÐå�Ɨĕƚ�ÐƢƚ��ıċÈ���Ņ��Ɨĕƚ�ÐƢƚ��ŐĒƱĆ���s��õwŧd�Ɨĕƚ�ÐƢƚ��ĕƔƨ¾È���
Ɨĕƚ��ŏÂd��
�EDJ?DKEKI�$DJ;=H7J?ED
ĐƧƚńĩ�kƬİĆ��ŲđŝŐ�ƘƯ�9EDJ?DKEKI�?DJ;=H7J?ED���$�Ŋ�ŲđŝʼnÈ�ƍÐƜ�ƉƚÊŋ�ŝĿƫ��ƧÈĊĕÎ�ęƳƫ��cŏ��
�ŖŊ��ņŎ�Ŗĭ��þñƭ�ŝĿ�ŲđŝŐ�ƘƯŊ�ß«�]ëŋ�ĺËƭ�¨İ�ƍÐƜ�ƉƚÊŋ�ŝĿƫ��jŞŝŐ�îòŋ��ſƫ��îòʼnÈĆ�ĐƧƚńĩŎ�ŵŝ�ƴĄl�ĐƧƚńĩÎ�ïƢƫ���aÐ��ėXŋ�ūŏ���ƀşŏ�ØƂĩţ�Ŕ�
>JJF���AEM?A?F;:?7EH=�M?A?�ŲđŝŐ6ƘƯ
/H7L?I��$��#EIJ;:��EDJ?DKEKI�$DJ;=H7J?ED�
<EH�J>;�EF;D�IEKH9;�9ECCKD?JO
+H;/H7L?I��$
M��/H7L?I��$
$ tree├── .gitignore├── .shipit
├── .travis.yml├── Changes├── MANIFEST.SKIP├── Makefile.PL├── README.md├── bin│ └── zamakist├── lib│ └── App│ ├── Zamakist│ │ ├── Handler│ │ │ └── GOM.pm│ │ ├── Media.pm│ │ └── Role│ │ └── Reportable.pm│ └── Zamakist.pm└── t ├── 00_compile.t ├── 01_find_permalink.t └── test_file └── The.Mentalist.S04E01.HDTV.XviD-ASAP.[VTV].Scarlet.Ribbons.avi
language: perlperl:-"5.16"-"5.14"-"5.12"-"5.10"
Using worker: ppp3.worker.travis-ci.org:php-1
$ cd ~/builds$ git clone --depth=100 --quiet git://github.com/JEEN/p5-App-Zamakist.git JEEN/p5-App-Zamakist$ cd JEEN/p5-App-Zamakist$ git checkout -qf df10bdfea286c9933c345c84206eaa90b8f298a6$ perlbrew use 5.16$ perl --version
This is perl 5, version 16, subversion 0 (v5.16.0) built for i686-linux
Copyright 1987-2012, Larry Wall
Perl may be copied only under the terms of either the Artistic License or theGNU General Public License, which may be found in the Perl 5 source kit.
Complete documentation for Perl, including FAQ lists, should be found onthis system using "man perl" or "perldoc perl". If you have access to theInternet, point your browser at http://www.perl.org/, the Perl Home Page.
$ cpanm --versioncpanm (App::cpanminus) version 1.5017$ cpanm --quiet --installdeps --notest .Successfully installed Text-CharWidth-0.04Successfully installed Text-UnicodeBox-0.03Successfully installed XML-XPathEngine-0.13Successfully installed HTML-Tree-5.02Successfully installed HTML-TreeBuilder-XPath-0.14Successfully installed HTML-Selector-XPath-0.14Successfully installed Web-Query-0.08Successfully installed Term-ReadLine-Zoid-0.078 distributions installed$ perl Makefile.PL && make testinclude /home/travis/builds/JEEN/p5-App-Zamakist/inc/Module/Install.pminclude inc/Module/Install/Metadata.pminclude inc/Module/Install/Base.pminclude inc/Module/Install/Makefile.pmCannot determine perl version info from lib/App/Zamakist.pminclude inc/Module/Install/Scripts.pminclude inc/Module/Install/Include.pminclude inc/Test/More.pminclude inc/Module/Install/WriteAll.pminclude inc/Module/Install/Win32.pminclude inc/Module/Install/Can.pminclude inc/Module/Install/Fetch.pmWriting Makefile for App::ZamakistWriting MYMETA.yml and MYMETA.jsonWriting META.ymlcp lib/App/Zamakist/Media.pm blib/lib/App/Zamakist/Media.pmcp lib/App/Zamakist.pm blib/lib/App/Zamakist.pmcp lib/App/Zamakist/Role/Reportable.pm blib/lib/App/Zamakist/Role/Reportable.pmcp lib/App/Zamakist/Handler/GOM.pm blib/lib/App/Zamakist/Handler/GOM.pmcp bin/zamakist blib/script/zamakist/home/travis/perl5/perlbrew/perls/5.16/bin/perl "-Iinc" -MExtUtils::MY -e 'MY->fixin(shift)' -- blib/script/zamakistPERL_DL_NONLAZY=1 /home/travis/perl5/perlbrew/perls/5.16/bin/perl "-MExtUtils::Command::MM""-e""test_harness(0, 'inc', 'blib/lib', 'blib/arch')" t/*.tt/00_compile.t ......... okt/01_find_permalink.t .. 5/7 # http://search.gomtv.com/searchjm.gom?key=The.Mentalist.S04E01.HDTV.XviD-ASAP.%5BVTV%5D.Scarlet.Ribbons&preface=0# http://gom.gomtv.com/jmdb/view.html?intSeq=808364&preface=0&spage=1Wide character in print at /home/travis/perl5/perlbrew/perls/5.16/lib/5.16.0/Test/Builder.pm line 1759.# [통합] The.Mentalist.S04E01.HDTV.XviD-ASAPt/01_find_permalink.t .. okAll tests successful.Files=2, Tests=8, 10 wallclock secs ( 0.03 usr 0.01 sys + 1.79 cusr 0.10 csys= 1.93 CPU)
Result: PASSDone. Build script exited with: 0
k]¤�"?J>K8�-;FE�Ô�/H7L?I��$�V�V�
#;7:B;II��HEMI;H�Ɨĕƚ��V�
�7J787I;�®Ŏ�Ĉš��V�
ij¾VŲ�īĩ¬��ŲŃ
>JJF���78EKJJH7L?I9?EH=�:E9I�
/H7L?I��$���FHE:K9J�Ŀ�ƌªÎ�Ġ�±�èºųƫŲ�àƫ��¸��Ɵ�ġ»İĆ
%;DA?DI�Î�z�¬įĖ��
ļ�%;DA?DI�ŐV�
Ʀùƭ�)EJ?<?97J?ED�ŲŃ�-..� C7?B�$(�Ʀùƭ�ĈƇV�Ĕj��Ĉšŏ�Ĕj
Ʀùƭ�-;FEHJ?D=�w�Ʀùƭ�ƞőŲâƦùƭ�ƨ¾sŐƦùƭ�%7L7Ʀùƭ
sc��Ŕj���� ��İ
S�EDJ?DEKI�$DJ;=H7J?EDT�mÇ�nňŋ�¬Ŋ�c��Ŕj
Jenkins Job A
Job B
Job C
Build #1
Build #2
Build #3
%;DA?DI�Ŏ�w÷ŝŐ�oť
W�ƉȬŊ�*8@;9J�Ĺ�ÙƇ£j�W�*8@;9J�¬Ŋ�3('�ƞőÈ��ŏƖŎ�ĵđĉŋ�õřêĖ��
Scheduler ProjectBuild
Checkout/Update
SCM : SVN/Git
PostBuild
Builder : batch/shell
Workspace
Build
Recorder : Clover/Checkstyle
Notifier : Email/IM
ľ¿�ĘʼnÈ�Łųœ��
��ƫŲÔ�%;DA?DI���%7L7<H?;D:BO�ƭ�ĄƼ
�Ɨĕƚ�ƢÚŊ��Ƈj�@0D?J�ƨ¾sŐ�Ô¬ÅÝ�%7L7���İ�íǀ��c��%7L7�ÿª�w÷�ĈšŊ�(7L;D�Ù�Ĭ���]��%7L7��FFB?97J?ED�ŋ�wéʼnÈ�ĈÞ
Ɨĕƚ�ƢÚŏ�@0D?J�ŏ¸�y�+;HB�w÷�Ɨĕƚ�ƢÚŐ�/�+�Î�@0D?J�ʼnÈ�è|Ý�£e���
s��ßÍeʼn�y��ŏ¿�_�Ʊ÷�ăº�üÈs��ëƤŕË�Ŧ�żġøĦŲ
s»��Ģ£Ý�"EE=B;���.J79AEL;H<BEM��
sÂd�ƱĆ�żġ���Ĩƭ�îò¬
+;HB�ƾĬÐƫd
/�+�U�%0D?J
�BEL;H��EL;H7=;�-;FEHJ
�>;9AIJOB;��D7BOI?I
/�+��!EHC7JJ;H��%0D?J
�;L;B���EL;H��-;FEHJ���BEL;H
+;HB��(;JH?9I��'?J;
+;HB�ƾĬÐƫd
/�+�U�%0D?J /�+��!EHC7JJ;H��%0D?J
$ prove -lv --timer --formatter TAP::Formatter::JUnit t/*
0I7=;
ƗĕƚÎ�ņžÁ�ęƳėƋĆ
+;HB�ƾĬÐƫd
$ cover -report clover
0I7=;
�BEL;H��EL;H7=;�-;FEHJ �;L;B���EL;H��-;FEHJ���BEL;H
9BEL;HNCB�ƞőŋ�ąĉƱĆ
+;HB�ƾĬÐƫd
$ measureperl-checkstyle --max_sub_lines 60 \ --max_sub_mccabe_complexity 10 \ --directory lib > checkstyle-result.xml
0I7=;
ƭ�ÜĐªŎ�Ɓ��xŏ������ÜĐªŎ�Ɓ��ăŏƑÈÙƝ�öŘ��� �
�>;9AIJOB;��D7BOI?I +;HB��(;JH?9I��'?J;
ăŏƑÈÙƝ�öŘ��� ����İ��(.,"2�����$�"#&V��R@O��a�JV�>��B�{��<^��h��yn���ŏ��ŏ�ŲƤÎ�ăĿƫÝ�Đĕ�ƌªÎ�ƘƱ�ćƷŝʼnÈ� ÒŝŐ�hÈ�µ��úwŎ�ēÎ�Ɵ�Ʈ�ē�Ŕ��(9�78;İ�°ÍÝ��ZhL��a�JV��]Y}R�|��F�=���fŏ¸j�ƭ��ŏ��ŐXŎ�wĪÆİ�mƭ�ĴoİĆ��;��HB�BoQ}R�Bo��i��F��[��i:��9�<Ő�cʼnÈ�ìƵŤw�±âİ�Ŭľƫ�
ĩ³�]ëŕV�ćƷŝʼnÈ� ÒŝŐ�hÈV���]��£��ƌªÎ�Ŗĉƫj�Ŕ�Ý��ŏ�ē��s�ÜĐªİĆ�ëąƫj�Ŕ��őŋ�iđ�ƂŝƮ�±��w�wĪÆŎ�Ŀ½ŋ��¼��ï�ŏĄ�ƀlƫ��cŏ�¤��ŐXŎ�ß«��w�wĪİ�ù�ŋ�ũŲ�ģ��X�ƭ�ÜĐªV�ăĿƫw���Ĕj�ķÌV���ëąƫ��cʼnÈ�œű£į
�� D;H@OV������İ�ēƳƭ�ƭ�Ĵo�gl��ăŏƑÈÙƝ�öŘ�Ĺ�ûĺŞĉ�Xİ��\Æƭ�ĄmmiV�Ŕ��cʼnÈ�ìƵŤ��a�J:����NjF�uT�^d� U������s�Y��a�J:�� ���NjteF�@� U��\P����R�ckƲ�
http://www.ibm.com/developerworks/kr/aix/library/au-cleancode/
�O9BEC7J?9��ECFB;N?JO
if ($var) +1
if ($var && $var2) +2
if ($var || $var2) +2
unless ($var) +1
my $var = $solo || ‘couple’; +1
my $var = $yongbin eq ‘is_couple’ ? 1 : 0; +2
ŏŹƱĆ�hƥŔ��ƏŮ��
�hƥŊ�ŲĥćİĆ�ŢkƱũďĖ���
39 sub gen_attr { 40 my ($self, $req, $prop) = @_;41 42 my %attr = ();43 my $sort = $req->{sort} || 'id';44 my $order = $req->{order} || 'desc';45 46 $order = 'desc' unless $order =~ /^(?:desc|asc)$/;47 $sort = 'id' unless $sort =~ /^(?:id)$/;48 49 $attr{order_by} = { "-$order" => "me.$sort" };50 $attr{page} = $req->{page} || 1;51 $attr{rows} = $req->{num} || 30;52 $attr{page} = 1 unless $attr{page} =~ /^\d+$/;53 $attr{rows} = 30 unless $attr{rows} =~ /^(?:30|50|100)$/;54 \%attr;55 }
ņ�ÜĐªŎ�ăŏƑÈÙƝ�öŘ���ĬÓőyľ��öŘ��� İĆ�ėŖƯ���
sÁ��ß
Î�õijªÐj�ěįŲÔ�ă��+HE:K9J�ƌªV�Ŕ�Ų¸
�ėX��Į�j�ąWƱĆŪý��ĢƲj����
s»��qvƫėÝ��Ŭİ�ŜÎ�żġũĊľ�
%;DA?DI�+HE@;9J
ÿª�šõÎ�õj
�EL;H7=;�-;FEHJ
�>;9AIJOB;-;IKBJ
0D?J/;IJ�glyŲ
gÉŊ�Ň�ƗĕƚÎ�ƫ«��0$�ƗĕƚÎ�ƫ«�Ɨĕƚ�glÎ�%;DA?DI�İ�çĩ�j
%;DA?DI���Ɨĕƚ�gl��iđ�ĜijVjsÂd�ĜŐ�Ɨĕƚ�gl�
Őărŕİd�4���őƫj�Ŕ�5�¸j�ĩƪƫ��ŧŊ�ŚËV�¥�ē�ŔĖ��
SƗĕƚ�_ėw�ĩ´d�ƫĊľ�T
SĶ��%;DA?DI�ĝĆ�ijźŜź�Ư��T
SILEXY CI
Sķ��sÂpľ�sÁ�iħT�ęƺ�
sÔƒ�æj�V��%;DA?DI
gÉ
ǁ+;HB�È��ľŰ�ưƭ�Ɨĕƚ�îò¬ŋ�Ġ�ē�Ŕ�
ǁƗĕƚƌª�ĝ¸��§ñ�ĝ¸
ǁbű¤�ƙŊ�īĩÎ�²�Ć��œƫÝ�ŧ�
ǁt��ä«�ŝ�ǀ�ĝĦ�Ţ×
ǁƗĕƚ�ƈðÐŲ� ����£ĩĦ�¤�«V
ǁăŏƑÈÙƝ�öŘ�Î�áť`� ��ĢʼnÈ�ƱĦ�¤�«V
ǁ/�����ÓŌ�đİ�Ŕ��_İľ
ZăƯ��