Perl web app 테스트전략

118
+;HB 2;8 FF Ɨĕƚ ޼ %)6' .$'3 &EH;7D +;HB 2EHAI>EF

description

Korean Perl Workshop 2012 에서 발표한 Perl Web App Test 전략

Transcript of Perl web app 테스트전략

Page 1: Perl web app 테스트전략

+;HB�2;8��FF�Ɨĕƚ�޼

�% )6' ���.$' 3

&EH;7D�+;HB�2EHAI>EF��� �

Page 2: Perl web app 테스트전략

+;HB�2;8��FF�Ɨĕƚ���

Page 3: Perl web app 테스트전략

2�-)$)"��

Ŝ¹�ŐXŊƗĕƚ�IJŲ�ĩV�ġ���/���ũŎŕV�ġ���

Ɨĕƚ�Žŋ�¡ũj�ă÷�ŝŏ�ĮĖ��

Page 4: Perl web app 테스트전략

�=;D:7

+;HB�/;IJ?D=�İ��ƱĆ

+;HB�È�ğ��Ɨĕƚƌª

0$�/;IJ��.;B;D?KC��+>7DJEC%.

�EDJ?DKEKI�$DJ;H=H7J?ED��/H7L?I��$��%;DA?DI

Page 5: Perl web app 테스트전략

+;HB�/;IJ?D=

Page 6: Perl web app 테스트전략

https://metacpan.org/source/JJNAPIORK/Catalyst-Runtime-5.90016/t

�+�)�Ŏ�_Ŏ�ß«�ß©İ��ŏÂd�ƗĕƚƌªV�ŔĖ��

Page 7: Perl web app 테스트전략

https://metacpan.org/source/JJNAPIORK/Catalyst-Runtime-5.90016/t/dead_recursive_chained_attributes.t

Page 8: Perl web app 테스트전략

Ɨĕƚ���FHEL;�È�ęƳƯ���

Page 9: Perl web app 테스트전략

TestAnythingProtocol

Ɨĕƚgl��/�+�ƷĘʼnÈ�ƃƦ���

Page 10: Perl web app 테스트전략

cpantesters.org

Page 11: Perl web app 테스트전략

Number of CPAN Distributions on CPAN

26,171

2012. 10. 19

Page 12: Perl web app 테스트전략

Number of CPAN Testers Reports

23,816,487

2012. 10. 19

Page 13: Perl web app 테스트전략
Page 14: Perl web app 테스트전략

�Ƅ�Ô¬ĩĆ

ĸÐÝ

!�$'��

!�$'��

!�$'��

Page 15: Perl web app 테스트전략

�+�)�/;IJ;H�V�£ĩũĊľ�

>JJF���M?A?9F7DJ;IJ;HIEH=�M?A?�";JJ?D=.J7HJ;:

Page 16: Perl web app 테스트전략

���V�����

Page 17: Perl web app 테스트전략

+;HB�Ɨĕƚ�ƌªÎ�ĩ´d�Ġyľ�

Page 18: Perl web app 테스트전략

Test::ClassTest::Deep

Test::FITesqueTest::TCP

Test::MockObject

Test::mysqld

Test::Git

Test::YAMLTest::....

Page 19: Perl web app 테스트전략

/;IJ������Ɛj�ġÏ�Ė��

Page 20: Perl web app 테스트전략

Test::Simple

Test::More

Test::Most

Page 21: Perl web app 테스트전략

Test::Simple

ok( <expression>, <description> );

Page 22: Perl web app 테스트전략

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?');

Page 23: Perl web app 테스트전략

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: {}

Page 24: Perl web app 테스트전략

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');

Page 25: Perl web app 테스트전략

ŕŗƭ�Ɨĕƚ�mÇ�İƩĐª�ƫ�

Page 26: Perl web app 테스트전략

SŅ�Ɔħş�kf�ĕƐÒƚÎ�Ɨĕƚƌª�ƷĘʼnÈ�ğÝ�

�Ŭİ�ŀġƫd�ƢÚŋ�è}Ć��

sÀ­ƭ�ÐƢƚÎ�Ô¬ĩ���ē�Ŕe�T

�. ��Ļ

Page 27: Perl web app 테스트전략

TAP::Formatter::HTML

QŏÂd�ÖŏŨR

Page 28: Perl web app 테스트전략

Sķķ���sc�Ż�Ư�Ư���

sÂd�ƫÝ�j^�İd���ŋ�glã��Ĕd�Āġ�epľ��T

Page 29: Perl web app 테스트전략

Sŏ¿�ĘʼnÈ�ýŭĬƫd�Ƥƶƫj�ÖŏŨT

Page 30: Perl web app 테스트전략

#!/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__..................

Page 31: Perl web app 테스트전략

t/ 001-xss.t 002-sql-injection.t 003-directory-indexing.t 004-filedownload.t 005-path-location.t 006-os-command.t ... ... ...

Page 32: Perl web app 테스트전략

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

Page 33: Perl web app 테스트전략

SsÐj�ŏaÈ�ŀÐ��ŀġƭ�ÐƢƚÎÔ¬ĩ��dľ��T

Page 34: Perl web app 테스트전략
Page 35: Perl web app 테스트전략

S�Ƈj� N9;Bİ�uÈ�ĝũĊľ�T

Page 36: Perl web app 테스트전략

kkŎ�ŝ��òŊ�ƁĐƭŏ�

Page 37: Perl web app 테스트전략

/>;�:E9KC;DJ�?I�7J�B;7IJ���

Page 38: Perl web app 테스트전략

sÁ�2;8��FF�/;IJ?D=Ŋ�ĩ´d�

Page 39: Perl web app 테스트전략

� ��#//+�-;GK;IJ��$DFKJ�

Page 40: Perl web app 테스트전략

����#//+�-;IFEDI;�*KJFKJ�

Page 41: Perl web app 테스트전략

���Q�R�[ŏ�Ŕ��Ų�ƻŐQ�R�[ŏ�Ŕ��Ų�ƻŐQ�R�[ŏ�Ŕ��Ų�ƻŐ

Page 42: Perl web app 테스트전략

~Ő�ľ�

Page 43: Perl web app 테스트전략

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

Page 44: Perl web app 테스트전략

└── 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

Page 45: Perl web app 테스트전략

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�_����¡���

Page 46: Perl web app 테스트전략

Ŧ����Ĩƭ�ĶĽĄƼ�ëąŋ�jÅƱĆ�ŖĉƮē�

�óť¤�#//+�ÐƎĕƚ��ŝƯƫŲ�ģŊ��ŏƖƐw

��Štrƭŏ�ŇƽƭŲ��Ŭö¤��ŏƖ

Page 47: Perl web app 테스트전략

sÁ�Ɨĕƚ��ŏƖ��ĩ´d�

Page 48: Perl web app 테스트전략

� ��Ɨĕƚ����Ĉš

(O.,'�.7D:8EN�/;IJ��COIGB:�LI

ŴŶ�Ɨĕƚ��

Page 49: Perl web app 테스트전략

����ƀw�Ɨĕƚ��ŏƖč�Ūý

schema.sqlCREATE TABLE ...CREATE TABLE ......

data.sql / jsonINSERT INTO ...INSERT INTO ......

DBIx::Class::FixturesDBIx::Class::Migration

ƹŊ�!7A;��ŏƖ�ąĉ�o��>;7J;H���7J7��!7A;H�

Page 50: Perl web app 테스트전략

����sÐj�ä�Ɨĕƚ�¢Ðw

ġ{ğj

��ğj

è}ğj

�ėğj

Page 51: Perl web app 테스트전략

0$�/;IJ?D=

Page 52: Perl web app 테스트전략

ăę�ľŰ�Ņ]ëİĆ�ĆðŸõ�

Ƒ¸ŏīƚŸİ

��ƀşŏ�Øƅţ�Ŕ��­

Page 53: Perl web app 테스트전략

ŏÂd�ƫÝ�ĩ³�d�ā��¶j�ŜÂd�ƫÝ�µ�ĩ³�d�ā��¶j

Page 54: Perl web app 테스트전략

�@7N�V�ĩŷj�Ŝŷj�%7L7I9H?FJ�(1��ƧÃŒłƐV

ĩŷjŜŷj�éōƷŅăŏƚV�ĩŷjŜŷj

Page 55: Perl web app 테스트전략

.;B;D?KC

Page 56: Perl web app 테스트전략

>JJF���@;;DJ?IJEHO9EC�I;7H9>�.;B;D?KC

ŕŗƭ��ÆŎ�ƿŝ¬ŋ�ŻjƱũĊľ

Page 57: Perl web app 테스트전략

.;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��

�����

Page 58: Perl web app 테스트전략

.;B;D?KC��.;B;D?KC.;B;D?KC�-� 2;8�H?L;H

3

Page 59: Perl web app 테스트전략

ßèőww�Ģ¬Ƹ�İĆ��.;B;D?KC�2;8�H?L;HÎŏĿƱĆ�0$�ƗĕƚÎ�Ʈ�ē�Ŕ�j

Page 60: Perl web app 테스트전략

ƫŲÔ�ėƈÛ�Ɩå�ŋ�ůw��Ćðśŏ¬İd�Ğ��ƓŲ�ģ��ćƕőŲ�

Page 61: Perl web app 테스트전략

s¿�ăº¬İd�ćƕŲV�¥

�4#;7:B;II�2;8I?J;�/;IJ?D=5

Page 62: Perl web app 테스트전략

�("-3.,���)2�"�(&"%+&22� &#�)3�6)3(��"5"�$1)/3����

Page 63: Perl web app 테스트전략

SsÁ�Ɨĕƚƌª��%.�È�ƱĦ£��T

SƠ�ğŕj�ŏÂd�ßŐ�Ó�İ�T

Page 64: Perl web app 테스트전략

2?=>J

>JJF���C;J79F7DEH=�CE:KB;�2?=>J

Page 65: Perl web app 테스트전략

2?=>J���2;8IE9A;J���+>7DJEC%.�

Page 66: Perl web app 테스트전략

Ţ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�

Page 67: Perl web app 테스트전략

2H?J;�*D9;��HKD�7DOM>;H;

Page 68: Perl web app 테스트전략

��HEMD?;���HEMI;H�?DJ;=H7J?ED�<H7C;MEHA

Page 69: Perl web app 테스트전략

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�

Page 70: Perl web app 테스트전략

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;��

Page 71: Perl web app 테스트전략

ƫŲÔ�ĩ¯yŲ��Qw÷ŝŐ�ăĿRİ�Ŭşŋ�§j�Ŕwİ��WWŎ�ª¸ŏðV�VŴ�jŇŎ�w�ŋ�ăĿƫw�ņƱĆ��

Ŧ���jĚƱĦ

Page 72: Perl web app 테스트전략

sÁ�Ɨĕƚ��ĩ´d�Ʈyľ�

Page 73: Perl web app 테스트전략

�Ɨĕƚ��ăºŏ�Ɨĕƚ��ƭñÔ�Ɨĕƚ�gl���ʼnÈ�Ɨĕƚ�ÐƢƚ��ıċÈ�Ɨĕƚ�ÐƢƚ��ŐĒƱĆ�Ɨĕƚ�ÐƢƚ��ĕƔƨ¾È

Ɨĕƚ��ŏÂd�ƫÝ

Page 74: Perl web app 테스트전략

�Ɨĕƚ��ăºŏ���wiV�Ɨĕƚ��ƭñÔ���iđ�Ɨĕƚ�gl���ʼnÈ���ĤÐå�Ɨĕƚ�ÐƢƚ��ıċÈ���Ņ��Ɨĕƚ�ÐƢƚ��ŐĒƱĆ���s��õwŧd�Ɨĕƚ�ÐƢƚ��ĕƔƨ¾È���

Ɨĕƚ��ŏÂd��

Page 75: Perl web app 테스트전략

�EDJ?DKEKI�$DJ;=H7J?ED

Page 76: Perl web app 테스트전략

ĐƧƚńĩ�kƬİĆ��ŲđŝŐ�ƘƯ�9EDJ?DKEKI�?DJ;=H7J?ED���$�Ŋ�ŲđŝʼnÈ�ƍÐƜ�ƉƚÊŋ�ŝĿƫ��ƧÈĊĕÎ�ęƳƫ��cŏ��

�ŖŊ��ņŎ�Ŗĭ��þñƭ�ŝĿ�ŲđŝŐ�ƘƯŊ�ß«�]ëŋ�ĺËƭ�¨İ�ƍÐƜ�ƉƚÊŋ�ŝĿƫ��jŞŝŐ�îòŋ��ſƫ��îòʼnÈĆ�ĐƧƚńĩŎ�ŵŝ�ƴĄl�ĐƧƚńĩÎ�ïƢƫ���aÐ��ėXŋ�ūŏ���ƀşŏ�ØƂĩţ�Ŕ�

>JJF���AEM?A?F;:?7EH=�M?A?�ŲđŝŐ6ƘƯ

Page 77: Perl web app 테스트전략

/H7L?I��$��#EIJ;:��EDJ?DKEKI�$DJ;=H7J?ED�

<EH�J>;�EF;D�IEKH9;�9ECCKD?JO

Page 78: Perl web app 테스트전략

+H;/H7L?I��$

Page 79: Perl web app 테스트전략

M��/H7L?I��$

Page 80: Perl web app 테스트전략

$ 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"

Page 81: Perl web app 테스트전략
Page 82: Perl web app 테스트전략

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

Page 83: Perl web app 테스트전략

k]¤�"?J>K8�-;FE�Ô�/H7L?I��$�V�V�

#;7:B;II��HEMI;H�Ɨĕƚ��V�

�7J787I;�®Ŏ�Ĉš��V�

ij¾VŲ�īĩ¬��ŲŃ

>JJF���78EKJJH7L?I9?EH=�:E9I�

Page 84: Perl web app 테스트전략

/H7L?I��$���FHE:K9J�Ŀ�ƌªÎ�Ġ�±�èºųƫŲ�àƫ��¸��Ɵ�ġ»İĆ

Page 85: Perl web app 테스트전략

%;DA?DI�Î�z�¬įĖ��

Page 86: Perl web app 테스트전략

ļ�%;DA?DI�ŐV�

Page 87: Perl web app 테스트전략

Ʀùƭ�)EJ?<?97J?ED�ŲŃ�-..� C7?B�$(�Ʀùƭ�ĈƇV�Ĕj��Ĉšŏ�Ĕj

Ʀùƭ�-;FEHJ?D=�w�Ʀùƭ�ƞőŲâƦùƭ�ƨ¾sŐƦùƭ�%7L7Ʀùƭ

Page 88: Perl web app 테스트전략

sc��Ŕj���� ��İ

S�EDJ?DEKI�$DJ;=H7J?EDT�mÇ�nňŋ�¬Ŋ�c��Ŕj

Page 89: Perl web app 테스트전략

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('�ƞőÈ��ŏƖŎ�ĵđĉŋ�õřêĖ��

Page 90: Perl web app 테스트전략

Scheduler ProjectBuild

Checkout/Update

SCM : SVN/Git

PostBuild

Builder : batch/shell

Workspace

Build

Recorder : Clover/Checkstyle

Notifier : Email/IM

ľ¿�ĘʼnÈ�Łųœ��

Page 91: Perl web app 테스트전략

��ƫŲÔ�%;DA?DI���%7L7<H?;D:BO�ƭ�ĄƼ

�Ɨĕƚ�ƢÚŊ��Ƈj�@0D?J�ƨ¾sŐ�Ô¬ÅÝ�%7L7���İ�íǀ��c��%7L7�ÿª�w÷�ĈšŊ�(7L;D�Ù�Ĭ���]��%7L7��FFB?97J?ED�ŋ�wéʼnÈ�ĈÞ

Page 92: Perl web app 테스트전략

Ɨĕƚ�ƢÚŏ�@0D?J�ŏ¸�y�+;HB�w÷�Ɨĕƚ�ƢÚŐ�/�+�Î�@0D?J�ʼnÈ�è|Ý�£e���

Page 93: Perl web app 테스트전략

s��ßÍeʼn�y��ŏ¿�_�Ʊ÷�ăº�üÈs��ëƤŕË�Ŧ�żġøĦŲ

Page 94: Perl web app 테스트전략

s»��Ģ£Ý�"EE=B;���.J79AEL;H<BEM��

Page 95: Perl web app 테스트전략

sÂd�ƱĆ�żġ���Ĩƭ�îò¬

Page 96: Perl web app 테스트전략

+;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;

Page 97: Perl web app 테스트전략

+;HB�ƾĬÐƫd

/�+�U�%0D?J /�+��!EHC7JJ;H��%0D?J

$ prove -lv --timer --formatter TAP::Formatter::JUnit t/*

0I7=;

ƗĕƚÎ�ņžÁ�ęƳėƋĆ

Page 98: Perl web app 테스트전략

+;HB�ƾĬÐƫd

$ cover -report clover

0I7=;

�BEL;H��EL;H7=;�-;FEHJ �;L;B���EL;H��-;FEHJ���BEL;H

9BEL;HNCB�ƞőŋ�ąĉƱĆ

Page 99: Perl web app 테스트전략

+;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;

Page 100: Perl web app 테스트전략

ăŏƑÈÙƝ�öŘ��� ����İ��(.,"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

Page 101: Perl web app 테스트전략

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

Page 102: Perl web app 테스트전략

ŏŹƱĆ�hƥŔ��ƏŮ��

�hƥŊ�ŲĥćİĆ�ŢkƱũďĖ���

Page 103: Perl web app 테스트전략

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ľ��öŘ��� İĆ�ėŖƯ���

Page 104: Perl web app 테스트전략

sÁ��ß

Page 105: Perl web app 테스트전략

Î�õijªÐj�ěįŲÔ�ă��+HE:K9J�ƌªV�Ŕ�Ų¸

�ėX��Į�j�ąWƱĆŪý��ĢƲj����

s»��qvƫėÝ��Ŭİ�ŜÎ�żġũĊľ�

Page 106: Perl web app 테스트전략

%;DA?DI�+HE@;9J

Page 107: Perl web app 테스트전략

ÿª�šõÎ�õj

Page 108: Perl web app 테스트전략

�EL;H7=;�-;FEHJ

Page 109: Perl web app 테스트전략

�>;9AIJOB;-;IKBJ

Page 110: Perl web app 테스트전략

0D?J/;IJ�glyŲ

Page 111: Perl web app 테스트전략

gÉŊ�Ň�ƗĕƚÎ�ƫ«��0$�ƗĕƚÎ�ƫ«�Ɨĕƚ�glÎ�%;DA?DI�İ�çĩ�j

%;DA?DI���Ɨĕƚ�gl��iđ�ĜijVjsÂd�ĜŐ�Ɨĕƚ�gl�

Őărŕİd�4���őƫj�Ŕ�5�¸j�ĩƪƫ��ŧŊ�ŚËV�¥�ē�ŔĖ��

Page 112: Perl web app 테스트전략

SƗĕƚ�_ėw�ĩ´d�ƫĊľ�T

Page 113: Perl web app 테스트전략

SĶ��%;DA?DI�ĝĆ�ijźŜź�Ư��T

Page 114: Perl web app 테스트전략

SILEXY CI

Page 115: Perl web app 테스트전략

Sķ��sÂpľ�sÁ�iħT�ęƺ�

Page 116: Perl web app 테스트전략

sÔƒ�æj�V��%;DA?DI

Page 117: Perl web app 테스트전략

ǁ+;HB�È��ľŰ�ưƭ�Ɨĕƚ�îò¬ŋ�Ġ�ē�Ŕ�

ǁƗĕƚƌª�ĝ¸��§ñ�ĝ¸

ǁbű¤�ƙŊ�īĩÎ�²�Ć��œƫÝ�ŧ�

ǁt��ä«�ŝ�ǀ�ĝĦ�Ţ×

ǁƗĕƚ�ƈðÐŲ� ����£ĩĦ�¤�«V

ǁăŏƑÈÙƝ�öŘ�Î�áť`� ��ĢʼnÈ�ƱĦ�¤�«V

ǁ/�����ÓŌ�đİ�Ŕ��_İľ

Page 118: Perl web app 테스트전략

ZăƯ��