SlideShare a Scribd company logo
1 of 118
Download to read offline
https://metacpan.org/source/JJNAPIORK/Catalyst-Runtime-5.90016/t
https://metacpan.org/source/JJNAPIORK/Catalyst-Runtime-5.90016/t/
                dead_recursive_chained_attributes.t
Test
Anything
Protocol
cpantesters.org
26,171
Number of CPAN Distributions on CPAN
            2012. 10. 19
23,816,487
Number of CPAN Testers Reports
         2012. 10. 19
Test::MockObject
  Test::Class   Test::Git
               Test::Deep
Test::FITesque
                 Test::TCP
 Test::mysqld
   Test::....   Test::YAML
Test::Most


Test::More


Test::Simple
Test::Simple


ok( <expression>, <description> );
Test::Simple
#!/usr/bin/env perl
use 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::More
ok( <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');
TAP::Formatter::HTML
#!/usr/bin/env perl
use 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/[rn]//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
  ...
  ...
  ...
$ prove -v t
t/001-xss.t ..
1..2
ok 1 - 001) 모듈 의존성 확인
   ok 1 LWP::UserAgent
   ok 2 URI
   ok 3 URI::QueryParam
ok 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
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();
└── t
 ├── 00100_controller_User.t                      ├── 00400_controller_Scrap.t
 ├── 00101_controller_User_signup.t               ├── 00401_controller_Scrap_add_category.t
 ├── 00102_controller_User_signin-out.t           ├── 00402_controller_Scrap_get_categories.t
 ├── 00103_controller_User_get_user.t             ├── 00403_controller_Scrap_delete_category.t
 ├── 00104_controller_User_friend.t               ├── 00404_controller_Scrap_add.t
 ├── 00105_controller_User_get_friends.t          ├── 00405_controller_Scrap_get_scraps.t
 ├── 00106_controller_User_unfriend.t             ├── 00406_controller_Scrap_delete_scrap.t
 ├── 00107_controller_User_update_info.t          ├── 00500_controller_Rate.t
 ├── 00108_controller_User_suggested_users.t      ├── 00501_controller_Rate_add.t
 ├── 00109_controller_User_get_users.t            ├── 00502_controller_Rate_get_rate.t
 ├── 00110_controller_User_update_devicetoken.t   ├── 00503_controller_Rate_get_rates.t
 ├── 00200_controller_Ask.t                       ├── 00504_controller_Rate_comment.t
 ├── 00201_controller_Ask_add.t                   ├── 00505_controller_Rate_get_comments.t
 ├── 00202_controller_Ask_get_ask.t               ├── 00506_controller_Rate_delete_comment.t
 ├── 00203_controller_Ask_get_asks.t              ├── 00506_controller_Rate_delete_comment.t.html
 ├── 00204_controller_Ask_comment.t               ├── 00600_controller_Notification.t
 ├── 00205_controller_Ask_get_comments.t          ├── 00601_controller_Notification_add.t
 ├── 00206_controller_Ask_delete_comment.t        ├── 00602_controller_Notification_get_notifications.t
 ├── 00300_controller_Venue.t                     ├── model_API.t
 ├── 00301_controller_Venue_add.t                 └── view_JSON.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
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/, ‘댓글 등록확인’);
schema.sql
CREATE TABLE ...
CREATE TABLE ...
...
                   DBIx::Class::Fixtures
                   DBIx::Class::Migration
data.sql / json
INSERT INTO ...
INSERT INTO ...
...
use Test::More;
use Brownie::Session;

# external server
my $session = Brownie::Session->new(
    driver   => 'Mechanize',
    app_host => 'http://app.example.com:5000',
);

# PSGI app
my $session = Brownie::Session->new(
    driver => 'Mechanize',
    app    => sub { ...(PSGI app)... },
);
$ tree
├── .gitignore                     language: perl
├── .shipit                        perl:
├── .travis.yml                    -"5.16"
├── Changes                        -"5.14"
├── MANIFEST.SKIP                  -"5.12"
├── Makefile.PL                     -"5.10"
├── 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
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 the
GNU General Public License, which may be found in the Perl 5 source kit.

Complete documentation for Perl, including FAQ lists, should be found on
this system using "man perl" or "perldoc perl". If you have access to the
Internet, point your browser at http://www.perl.org/, the Perl Home Page.

$ cpanm --version
cpanm (App::cpanminus) version 1.5017
$ cpanm --quiet --installdeps --notest .
Successfully installed Text-CharWidth-0.04
Successfully installed Text-UnicodeBox-0.03
Successfully installed XML-XPathEngine-0.13
Successfully installed HTML-Tree-5.02
Successfully installed HTML-TreeBuilder-XPath-0.14
Successfully installed HTML-Selector-XPath-0.14
Successfully installed Web-Query-0.08
Successfully installed Term-ReadLine-Zoid-0.07
8 distributions installed
$ perl Makefile.PL && make test
include /home/travis/builds/JEEN/p5-App-Zamakist/inc/Module/Install.pm
include inc/Module/Install/Metadata.pm
include inc/Module/Install/Base.pm
include inc/Module/Install/Makefile.pm
Cannot determine perl version info from lib/App/Zamakist.pm
include inc/Module/Install/Scripts.pm
include inc/Module/Install/Include.pm
include inc/Test/More.pm
include inc/Module/Install/WriteAll.pm
include inc/Module/Install/Win32.pm
include inc/Module/Install/Can.pm
include inc/Module/Install/Fetch.pm
Writing Makefile for App::Zamakist
Writing MYMETA.yml and MYMETA.json
Writing META.yml
cp lib/App/Zamakist/Media.pm blib/lib/App/Zamakist/Media.pm
cp lib/App/Zamakist.pm blib/lib/App/Zamakist.pm
cp lib/App/Zamakist/Role/Reportable.pm blib/lib/App/Zamakist/Role/Reportable.pm
cp lib/App/Zamakist/Handler/GOM.pm blib/lib/App/Zamakist/Handler/GOM.pm
cp bin/zamakist blib/script/zamakist
/home/travis/perl5/perlbrew/perls/5.16/bin/perl "-Iinc" -MExtUtils::MY -e 'MY->fixin(shift)' -- blib/script/zamakist
PERL_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/*.t
t/00_compile.t ......... ok
t/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=1
Wide 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-ASAP
t/01_find_permalink.t .. ok
All 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:   PASS
Done. Build script exited with: 0
Jenkins   Job A   Build #1



                  Build #2
          Job B


                  Build #3
          Job C
Build
Scheduler          Project
                                    Checkout/Update


              SCM : SVN/Git


            Builder : batch/shell
                                         Build

            Workspace

             Recorder : Clover/
                Checkstyle
                                       PostBuild
             Notifier : Email/IM
$ prove -lv --timer --formatter TAP::Formatter::JUnit t/*
$ cover -report clover
$ measureperl-checkstyle --max_sub_lines 60 
 --max_sub_mccabe_complexity 10 
 --directory lib > checkstyle-result.xml
http://www.ibm.com/developerworks/kr/aix/library/au-cleancode/
if ($var)            +1
unless ($var)        +1

if ($var && $var2)   +2

if ($var || $var2)   +2

my $var = $solo || ‘couple’;   +1

my $var = $yongbin eq ‘is_couple’ ? 1 : 0;   +2
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 }
SILEXY CI
Test Catalyst app with Catalyst::Test
Test Catalyst app with Catalyst::Test
Test Catalyst app with Catalyst::Test
Test Catalyst app with Catalyst::Test

More Related Content

What's hot

Commencer avec le TDD
Commencer avec le TDDCommencer avec le TDD
Commencer avec le TDDEric Hogue
 
Webrtc mojo
Webrtc mojoWebrtc mojo
Webrtc mojobpmedley
 
Guarding Your Code Against Bugs with Continuous Testing
Guarding Your Code Against Bugs with Continuous TestingGuarding Your Code Against Bugs with Continuous Testing
Guarding Your Code Against Bugs with Continuous TestingEric Hogue
 
What you need to remember when you upload to CPAN
What you need to remember when you upload to CPANWhat you need to remember when you upload to CPAN
What you need to remember when you upload to CPANcharsbar
 
Zen: Building Maintainable Catalyst Applications
Zen: Building Maintainable Catalyst ApplicationsZen: Building Maintainable Catalyst Applications
Zen: Building Maintainable Catalyst ApplicationsJay Shirley
 
Web Apps in Perl - HTTP 101
Web Apps in Perl - HTTP 101Web Apps in Perl - HTTP 101
Web Apps in Perl - HTTP 101hendrikvb
 
Zend Framework Study@Tokyo vol1
Zend Framework Study@Tokyo vol1Zend Framework Study@Tokyo vol1
Zend Framework Study@Tokyo vol1Shinya Ohyanagi
 
The why and how of moving to PHP 5.5/5.6
The why and how of moving to PHP 5.5/5.6The why and how of moving to PHP 5.5/5.6
The why and how of moving to PHP 5.5/5.6Wim Godden
 
Kansai.pm 10周年記念 Plack/PSGI 入門
Kansai.pm 10周年記念 Plack/PSGI 入門Kansai.pm 10周年記念 Plack/PSGI 入門
Kansai.pm 10周年記念 Plack/PSGI 入門lestrrat
 
Nigel hamilton-megameet-2013
Nigel hamilton-megameet-2013Nigel hamilton-megameet-2013
Nigel hamilton-megameet-2013trexy
 
10 Catalyst Tips
10 Catalyst Tips10 Catalyst Tips
10 Catalyst TipsJay Shirley
 
I, For One, Welcome Our New Perl6 Overlords
I, For One, Welcome Our New Perl6 OverlordsI, For One, Welcome Our New Perl6 Overlords
I, For One, Welcome Our New Perl6 Overlordsheumann
 
Codeigniter4の比較と検証
Codeigniter4の比較と検証Codeigniter4の比較と検証
Codeigniter4の比較と検証ME iBotch
 
The why and how of moving to PHP 5.4/5.5
The why and how of moving to PHP 5.4/5.5The why and how of moving to PHP 5.4/5.5
The why and how of moving to PHP 5.4/5.5Wim Godden
 
関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐいHisateru Tanaka
 
Joy of Six - Discover the Joy of Perl 6
Joy of Six - Discover the Joy of Perl 6Joy of Six - Discover the Joy of Perl 6
Joy of Six - Discover the Joy of Perl 6trexy
 
Caching and tuning fun for high scalability @ FrOSCon 2011
Caching and tuning fun for high scalability @ FrOSCon 2011Caching and tuning fun for high scalability @ FrOSCon 2011
Caching and tuning fun for high scalability @ FrOSCon 2011Wim Godden
 

What's hot (20)

Commencer avec le TDD
Commencer avec le TDDCommencer avec le TDD
Commencer avec le TDD
 
Webrtc mojo
Webrtc mojoWebrtc mojo
Webrtc mojo
 
Guarding Your Code Against Bugs with Continuous Testing
Guarding Your Code Against Bugs with Continuous TestingGuarding Your Code Against Bugs with Continuous Testing
Guarding Your Code Against Bugs with Continuous Testing
 
What you need to remember when you upload to CPAN
What you need to remember when you upload to CPANWhat you need to remember when you upload to CPAN
What you need to remember when you upload to CPAN
 
dotCloud and go
dotCloud and godotCloud and go
dotCloud and go
 
Zen: Building Maintainable Catalyst Applications
Zen: Building Maintainable Catalyst ApplicationsZen: Building Maintainable Catalyst Applications
Zen: Building Maintainable Catalyst Applications
 
Web Apps in Perl - HTTP 101
Web Apps in Perl - HTTP 101Web Apps in Perl - HTTP 101
Web Apps in Perl - HTTP 101
 
Zend Framework Study@Tokyo vol1
Zend Framework Study@Tokyo vol1Zend Framework Study@Tokyo vol1
Zend Framework Study@Tokyo vol1
 
The why and how of moving to PHP 5.5/5.6
The why and how of moving to PHP 5.5/5.6The why and how of moving to PHP 5.5/5.6
The why and how of moving to PHP 5.5/5.6
 
Kansai.pm 10周年記念 Plack/PSGI 入門
Kansai.pm 10周年記念 Plack/PSGI 入門Kansai.pm 10周年記念 Plack/PSGI 入門
Kansai.pm 10周年記念 Plack/PSGI 入門
 
Nigel hamilton-megameet-2013
Nigel hamilton-megameet-2013Nigel hamilton-megameet-2013
Nigel hamilton-megameet-2013
 
10 Catalyst Tips
10 Catalyst Tips10 Catalyst Tips
10 Catalyst Tips
 
I, For One, Welcome Our New Perl6 Overlords
I, For One, Welcome Our New Perl6 OverlordsI, For One, Welcome Our New Perl6 Overlords
I, For One, Welcome Our New Perl6 Overlords
 
Mojo as a_client
Mojo as a_clientMojo as a_client
Mojo as a_client
 
Codeigniter4の比較と検証
Codeigniter4の比較と検証Codeigniter4の比較と検証
Codeigniter4の比較と検証
 
The why and how of moving to PHP 5.4/5.5
The why and how of moving to PHP 5.4/5.5The why and how of moving to PHP 5.4/5.5
The why and how of moving to PHP 5.4/5.5
 
関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい関西PHP勉強会 php5.4つまみぐい
関西PHP勉強会 php5.4つまみぐい
 
Joy of Six - Discover the Joy of Perl 6
Joy of Six - Discover the Joy of Perl 6Joy of Six - Discover the Joy of Perl 6
Joy of Six - Discover the Joy of Perl 6
 
Caching and tuning fun for high scalability @ FrOSCon 2011
Caching and tuning fun for high scalability @ FrOSCon 2011Caching and tuning fun for high scalability @ FrOSCon 2011
Caching and tuning fun for high scalability @ FrOSCon 2011
 
Memory Manglement in Raku
Memory Manglement in RakuMemory Manglement in Raku
Memory Manglement in Raku
 

Similar to Test Catalyst app with Catalyst::Test

Api Design
Api DesignApi Design
Api Designsartak
 
Mojolicious. Веб в коробке!
Mojolicious. Веб в коробке!Mojolicious. Веб в коробке!
Mojolicious. Веб в коробке!Anatoly Sharifulin
 
Workshop quality assurance for php projects tek12
Workshop quality assurance for php projects tek12Workshop quality assurance for php projects tek12
Workshop quality assurance for php projects tek12Michelangelo van Dam
 
Mojolicious - A new hope
Mojolicious - A new hopeMojolicious - A new hope
Mojolicious - A new hopeMarcus Ramberg
 
Quality Assurance for PHP projects - ZendCon 2012
Quality Assurance for PHP projects - ZendCon 2012Quality Assurance for PHP projects - ZendCon 2012
Quality Assurance for PHP projects - ZendCon 2012Michelangelo van Dam
 
What mom never told you about bundle configurations - Symfony Live Paris 2012
What mom never told you about bundle configurations - Symfony Live Paris 2012What mom never told you about bundle configurations - Symfony Live Paris 2012
What mom never told you about bundle configurations - Symfony Live Paris 2012D
 
OWASP Top 10 - DrupalCon Amsterdam 2019
OWASP Top 10 - DrupalCon Amsterdam 2019OWASP Top 10 - DrupalCon Amsterdam 2019
OWASP Top 10 - DrupalCon Amsterdam 2019Ayesh Karunaratne
 
Curscatalyst
CurscatalystCurscatalyst
CurscatalystKar Juan
 
Things Your Mother Didnt Tell You About Bundle Configurations - Symfony Live…
Things Your Mother Didnt Tell You About Bundle Configurations - Symfony Live…Things Your Mother Didnt Tell You About Bundle Configurations - Symfony Live…
Things Your Mother Didnt Tell You About Bundle Configurations - Symfony Live…D
 
Things Your Mother Didn't Tell You About Bundle Configurations - Symfony Live...
Things Your Mother Didn't Tell You About Bundle Configurations - Symfony Live...Things Your Mother Didn't Tell You About Bundle Configurations - Symfony Live...
Things Your Mother Didn't Tell You About Bundle Configurations - Symfony Live...D
 
Unit testing with zend framework tek11
Unit testing with zend framework tek11Unit testing with zend framework tek11
Unit testing with zend framework tek11Michelangelo van Dam
 
Burn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websitesBurn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websitesLindsay Holmwood
 
symfony on action - WebTech 207
symfony on action - WebTech 207symfony on action - WebTech 207
symfony on action - WebTech 207patter
 
Using Geeklog as a Web Application Framework
Using Geeklog as a Web Application FrameworkUsing Geeklog as a Web Application Framework
Using Geeklog as a Web Application FrameworkDirk Haun
 
Curso Symfony - Clase 4
Curso Symfony - Clase 4Curso Symfony - Clase 4
Curso Symfony - Clase 4Javier Eguiluz
 

Similar to Test Catalyst app with Catalyst::Test (20)

Api Design
Api DesignApi Design
Api Design
 
Mojolicious. Веб в коробке!
Mojolicious. Веб в коробке!Mojolicious. Веб в коробке!
Mojolicious. Веб в коробке!
 
Workshop quality assurance for php projects tek12
Workshop quality assurance for php projects tek12Workshop quality assurance for php projects tek12
Workshop quality assurance for php projects tek12
 
Mojolicious - A new hope
Mojolicious - A new hopeMojolicious - A new hope
Mojolicious - A new hope
 
Blog Hacks 2011
Blog Hacks 2011Blog Hacks 2011
Blog Hacks 2011
 
Quality Assurance for PHP projects - ZendCon 2012
Quality Assurance for PHP projects - ZendCon 2012Quality Assurance for PHP projects - ZendCon 2012
Quality Assurance for PHP projects - ZendCon 2012
 
What mom never told you about bundle configurations - Symfony Live Paris 2012
What mom never told you about bundle configurations - Symfony Live Paris 2012What mom never told you about bundle configurations - Symfony Live Paris 2012
What mom never told you about bundle configurations - Symfony Live Paris 2012
 
OWASP Top 10 - DrupalCon Amsterdam 2019
OWASP Top 10 - DrupalCon Amsterdam 2019OWASP Top 10 - DrupalCon Amsterdam 2019
OWASP Top 10 - DrupalCon Amsterdam 2019
 
Curscatalyst
CurscatalystCurscatalyst
Curscatalyst
 
Perl Web Client
Perl Web ClientPerl Web Client
Perl Web Client
 
Things Your Mother Didnt Tell You About Bundle Configurations - Symfony Live…
Things Your Mother Didnt Tell You About Bundle Configurations - Symfony Live…Things Your Mother Didnt Tell You About Bundle Configurations - Symfony Live…
Things Your Mother Didnt Tell You About Bundle Configurations - Symfony Live…
 
Things Your Mother Didn't Tell You About Bundle Configurations - Symfony Live...
Things Your Mother Didn't Tell You About Bundle Configurations - Symfony Live...Things Your Mother Didn't Tell You About Bundle Configurations - Symfony Live...
Things Your Mother Didn't Tell You About Bundle Configurations - Symfony Live...
 
QA for PHP projects
QA for PHP projectsQA for PHP projects
QA for PHP projects
 
PhpBB meets Symfony2
PhpBB meets Symfony2PhpBB meets Symfony2
PhpBB meets Symfony2
 
Unit testing with zend framework tek11
Unit testing with zend framework tek11Unit testing with zend framework tek11
Unit testing with zend framework tek11
 
Burn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websitesBurn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websites
 
Hacking Movable Type
Hacking Movable TypeHacking Movable Type
Hacking Movable Type
 
symfony on action - WebTech 207
symfony on action - WebTech 207symfony on action - WebTech 207
symfony on action - WebTech 207
 
Using Geeklog as a Web Application Framework
Using Geeklog as a Web Application FrameworkUsing Geeklog as a Web Application Framework
Using Geeklog as a Web Application Framework
 
Curso Symfony - Clase 4
Curso Symfony - Clase 4Curso Symfony - Clase 4
Curso Symfony - Clase 4
 

Recently uploaded

EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?Antenna Manufacturer Coco
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessPixlogix Infotech
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 

Recently uploaded (20)

EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 

Test Catalyst app with Catalyst::Test

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 8.
  • 11. 26,171 Number of CPAN Distributions on CPAN 2012. 10. 19
  • 12. 23,816,487 Number of CPAN Testers Reports 2012. 10. 19
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18. Test::MockObject Test::Class Test::Git Test::Deep Test::FITesque Test::TCP Test::mysqld Test::.... Test::YAML
  • 19.
  • 22. Test::Simple #!/usr/bin/env perl use 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?');
  • 23. Test::More ok( <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: {}
  • 24. 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');
  • 25.
  • 26.
  • 28.
  • 29.
  • 30. #!/usr/bin/env perl use 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/[rn]//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__ ...... ...... ......
  • 31. t/ 001-xss.t 002-sql-injection.t 003-directory-indexing.t 004-filedownload.t 005-path-location.t 006-os-command.t ... ... ...
  • 32. $ prove -v t t/001-xss.t .. 1..2 ok 1 - 001) 모듈 의존성 확인 ok 1 LWP::UserAgent ok 2 URI ok 3 URI::QueryParam ok 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
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43. 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();
  • 44. └── t ├── 00100_controller_User.t ├── 00400_controller_Scrap.t ├── 00101_controller_User_signup.t ├── 00401_controller_Scrap_add_category.t ├── 00102_controller_User_signin-out.t ├── 00402_controller_Scrap_get_categories.t ├── 00103_controller_User_get_user.t ├── 00403_controller_Scrap_delete_category.t ├── 00104_controller_User_friend.t ├── 00404_controller_Scrap_add.t ├── 00105_controller_User_get_friends.t ├── 00405_controller_Scrap_get_scraps.t ├── 00106_controller_User_unfriend.t ├── 00406_controller_Scrap_delete_scrap.t ├── 00107_controller_User_update_info.t ├── 00500_controller_Rate.t ├── 00108_controller_User_suggested_users.t ├── 00501_controller_Rate_add.t ├── 00109_controller_User_get_users.t ├── 00502_controller_Rate_get_rate.t ├── 00110_controller_User_update_devicetoken.t ├── 00503_controller_Rate_get_rates.t ├── 00200_controller_Ask.t ├── 00504_controller_Rate_comment.t ├── 00201_controller_Ask_add.t ├── 00505_controller_Rate_get_comments.t ├── 00202_controller_Ask_get_ask.t ├── 00506_controller_Rate_delete_comment.t ├── 00203_controller_Ask_get_asks.t ├── 00506_controller_Rate_delete_comment.t.html ├── 00204_controller_Ask_comment.t ├── 00600_controller_Notification.t ├── 00205_controller_Ask_get_comments.t ├── 00601_controller_Notification_add.t ├── 00206_controller_Ask_delete_comment.t ├── 00602_controller_Notification_get_notifications.t ├── 00300_controller_Venue.t ├── model_API.t ├── 00301_controller_Venue_add.t └── view_JSON.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
  • 45. 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/, ‘댓글 등록확인’);
  • 46.
  • 47.
  • 48.
  • 49. schema.sql CREATE TABLE ... CREATE TABLE ... ... DBIx::Class::Fixtures DBIx::Class::Migration data.sql / json INSERT INTO ... INSERT INTO ... ...
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69. use Test::More; use Brownie::Session; # external server my $session = Brownie::Session->new( driver => 'Mechanize', app_host => 'http://app.example.com:5000', ); # PSGI app my $session = Brownie::Session->new( driver => 'Mechanize', app => sub { ...(PSGI app)... }, );
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80. $ tree ├── .gitignore language: perl ├── .shipit perl: ├── .travis.yml -"5.16" ├── Changes -"5.14" ├── MANIFEST.SKIP -"5.12" ├── Makefile.PL -"5.10" ├── 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
  • 81.
  • 82. 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 the GNU General Public License, which may be found in the Perl 5 source kit. Complete documentation for Perl, including FAQ lists, should be found on this system using "man perl" or "perldoc perl". If you have access to the Internet, point your browser at http://www.perl.org/, the Perl Home Page. $ cpanm --version cpanm (App::cpanminus) version 1.5017 $ cpanm --quiet --installdeps --notest . Successfully installed Text-CharWidth-0.04 Successfully installed Text-UnicodeBox-0.03 Successfully installed XML-XPathEngine-0.13 Successfully installed HTML-Tree-5.02 Successfully installed HTML-TreeBuilder-XPath-0.14 Successfully installed HTML-Selector-XPath-0.14 Successfully installed Web-Query-0.08 Successfully installed Term-ReadLine-Zoid-0.07 8 distributions installed $ perl Makefile.PL && make test include /home/travis/builds/JEEN/p5-App-Zamakist/inc/Module/Install.pm include inc/Module/Install/Metadata.pm include inc/Module/Install/Base.pm include inc/Module/Install/Makefile.pm Cannot determine perl version info from lib/App/Zamakist.pm include inc/Module/Install/Scripts.pm include inc/Module/Install/Include.pm include inc/Test/More.pm include inc/Module/Install/WriteAll.pm include inc/Module/Install/Win32.pm include inc/Module/Install/Can.pm include inc/Module/Install/Fetch.pm Writing Makefile for App::Zamakist Writing MYMETA.yml and MYMETA.json Writing META.yml cp lib/App/Zamakist/Media.pm blib/lib/App/Zamakist/Media.pm cp lib/App/Zamakist.pm blib/lib/App/Zamakist.pm cp lib/App/Zamakist/Role/Reportable.pm blib/lib/App/Zamakist/Role/Reportable.pm cp lib/App/Zamakist/Handler/GOM.pm blib/lib/App/Zamakist/Handler/GOM.pm cp bin/zamakist blib/script/zamakist /home/travis/perl5/perlbrew/perls/5.16/bin/perl "-Iinc" -MExtUtils::MY -e 'MY->fixin(shift)' -- blib/script/zamakist PERL_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/*.t t/00_compile.t ......... ok t/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=1 Wide 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-ASAP t/01_find_permalink.t .. ok All 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: PASS Done. Build script exited with: 0
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89. Jenkins Job A Build #1 Build #2 Job B Build #3 Job C
  • 90. Build Scheduler Project Checkout/Update SCM : SVN/Git Builder : batch/shell Build Workspace Recorder : Clover/ Checkstyle PostBuild Notifier : Email/IM
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97. $ prove -lv --timer --formatter TAP::Formatter::JUnit t/*
  • 98. $ cover -report clover
  • 99. $ measureperl-checkstyle --max_sub_lines 60 --max_sub_mccabe_complexity 10 --directory lib > checkstyle-result.xml
  • 101. if ($var) +1 unless ($var) +1 if ($var && $var2) +2 if ($var || $var2) +2 my $var = $solo || ‘couple’; +1 my $var = $yongbin eq ‘is_couple’ ? 1 : 0; +2
  • 102.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.