!"#$%#&'&#&()*+,-. !"#$%&'$()*"+,-$(( - - PowerPoint PPT Presentation

011 232455
SMART_READER_LITE
LIVE PREVIEW

!"#$%#&'&#&()*+,-. !"#$%&'$()*"+,-$(( - - PowerPoint PPT Presentation

!"#$%#&'&#&()*+,-. !"#$%&'$()*"+,-$(( .&&/011&."232455 6789):; % & ):<<= Who I am ! !"#$%&'$()*"+,-$(( ! .(/01/"2)'()&3")454) 6+07"8&)%'(8")9:::


slide-1
SLIDE 1

!"#$%#&'&#&()*+,-.

!"#$%&'$()*"+,-$(( .&&/011&."232455

6789):;%

&):<<=

slide-2
SLIDE 2

Who I am

! !"#$%&'$()*"+,-$(( ! .(/01/"2)'()&3")454)

6+07"8&)%'(8")9:::

! ;+"$&0+)0<)454=('& ! ;0>?0@(2"+)$(2)

4+'(8'6$1);0(%@1&$(&) A'&3)&3"454B88

slide-3
SLIDE 3
slide-4
SLIDE 4

What is great software?

CD+"$&)%0<&A$+")$1A$E%)20"%)A3$&)&3") 8@%&0-"+)A$(&%)'&)&0B !0)"/"()'<)8@%&0-"+%)&3'(F)0<)("A)A$E%)&0) @%")&3")%0<&A$+"G)'&)20"%(H&)#+"$F)0+),'/") &3"-)@("I6"8&"2)+"%@1&%BC

The customer-friendly programmer says ...

J3'%)%1'2")80(&$'(%)-$&"+'$1)<+0-)C5"$2)?'+%&)K#7"8&>K+'"(&"2)L($1E%'%)M)N"%',(CG)KHO"'11EG)9::P

slide-5
SLIDE 5

What is great software?

CD+"$&)%0<&A$+")'%)802")&3$&)'%)0#7"8&> 0+'"(&"2B !0)&3"+"H%)(0&)$)#@(83)0<)2@61'8$&"2)802"G) $(2)"$83)0#7"8&)6+"&&E)-@83)80(&+01%)'&%) 0A()#"3$/'0@+B .&H%)$1%0)"$%E)&0)"I&"(2)#"8$@%")E0@+) 2"%',()'%)+"$11E)%01'2)$(2)<1"I'#1"BC

The object-oriented programmer says ...

J3'%)%1'2")80(&$'(%)-$&"+'$1)<+0-)C5"$2)?'+%&)K#7"8&>K+'"(&"2)L($1E%'%)M)N"%',(CG)KHO"'11EG)9::P

slide-6
SLIDE 6

What is great software?

CD+"$&)%0<&A$+")'%)A3"()E0@)@%")&+'"2> $(2>&+@")2"%',()6$&&"+(%)$(2)6+'(8'61"%B Q0@H/")F"6&)E0@+)0#7"8&%)100%"1E)80@61"2G) $(2)E0@+)802")06"()<0+)"I&"(%'0()#@&) 810%"2)<0+)-02'<'8$&'0(B J3$&)$1%0)3"16%)-$F")&3")802")-0+") +"@%$#1"G)%0)E0@)20(H&)3$/")&0)+"A0+F) "/"+E&3'(,)&0)@%")6$+&%)0<)E0@+) $661'8$&'0()0/"+)$(2)0/"+)$,$'(BC

The design-guru programmer says ...

J3'%)%1'2")80(&$'(%)-$&"+'$1)<+0-)C5"$2)?'+%&)K#7"8&>K+'"(&"2)L($1E%'%)M)N"%',(CG)KHO"'11EG)9::P

slide-7
SLIDE 7

Aspects of Software Quality

D002);02"

! ?"A)*+$(83"% ! ?"A)N"6"(2"(8'"% ! R08$1'&E)0<);3$(," ! !-$11)*108F% ! !"1<>SI61$($&0+E ! J"%&$#1"

! !"8@+'&E ! O0#@%&("%% ! !&$#'1'&E ! 4"+<0+-$(8" ! !8$1$#'1'&E ! =%$#'1'&E

slide-8
SLIDE 8

When things go wrong ...

slide-9
SLIDE 9

Why did I not test this?

slide-10
SLIDE 10

Testing Web Applications

! !&$&'8)L($1E%'%)0<)5JTR)20"%)(0&)A0+F ! .(%&"$2U)J"%&)A"#)$661'8$&'0(%)'()&3")

#+0A%"+

End-to-End Testing

slide-11
SLIDE 11

End-to-End Testing

! V0&)$@&0-$&"2G)%10A)$(2)"I6"(%'/" ! ;0-61"&")$661'8$&'0()-@%&)#")+"$2E)))))))

#"<0+")'&)8$()#")&"%&"2

! J"%&%)(""2)&0)#")+"6"$&"2))))))))))))))))))))))))

A3"()&3")$661'8$&'0()83$(,"%

Manual Testing

slide-12
SLIDE 12

End-to-End Testing

! J"%&)+"%@1&%)$+"

! $@&0-$&'8$11E)"/$1@$&"2)$(2 ! 20)(0&)3$/")&0)#")'(&"+6+"&"2)#E)$))))))))))

3@-$()&"%&"+)))))))))))))))))))))))))))))))))))))))))))))))))))) ))))))

! J"%&%)$+")+"6"$&$#1"

! A'&3)2"&"+-'('%&'8)+"%@1&% ! A'&30@&)$22'&'0($1)80%&%

Automated Testing

slide-13
SLIDE 13

End-to-End Testing

! !"1"('@-

! J"%&)A"#)$661'8$&'0(%)'()$)A"#)#+0A%"+)))))))))))

))))))))))))))))))))))))))))))))))))))))))

! !"1"('@-).NS

! SI&"(%'0()<0+)?'+"<0I ! O"80+2G)"I"8@&"G)"2'&G)2"#@,)&"%&%)'()&3")

#+0A%"+

Selenium

slide-14
SLIDE 14

! " # $ % & ' (& ) # *

slide-15
SLIDE 15

End-to-End Testing

! L@&0-$&"2)"I"8@&'0()0<)!"1"('@-)&"%&% ! J"%&%)8$()#")%6"8'<'"2)'()$(E)1$(,@$," ! K(")&"%&)8$()#")"I"8@&"2)0()-@1&'61"))))))))

K!)W)#+0A%"+)80-#'($&'0(%

Selenium RC

slide-16
SLIDE 16

End-to-End Testing

Selenium RC

slide-17
SLIDE 17

End-to-End Testing

! ;0-61"I)&"%&)"(/'+0(-"(&% ! N"6"(2"(8'"%)#"&A""()&"%&% ! .%01$&'0()0<)&"%&)"I"8@&'0( ! O@(('(,)&3")&"%&%)'%)%10AG))))))))))))))))))))))

&3@%)'(80-6$&'#1")A'&3)&3")$,'1")$66+0$83

Problems

slide-18
SLIDE 18

End-to-End Testing

S(2>&0>S(2)J"%&'(,)'%)(0&)"(0@,3)))))))))) $(2W0+)20"%)(0&)%8$1"

! X")A$(&)&0)&"%&)"$+1'"+ ! X")A$(&)&0)#")$#1")&0)&"%&)$()'(80-61"&")

$661'8$&'0(

! X")A$(&)$)&"%&)"(/'+0(-"(&)&3$&)'%)1"%%)80-61"I ! X")A$(&)&0)#")$#1")&0)+@()&3")&"%&%)<$%&"+

Problems

slide-19
SLIDE 19

! N0"%)-E)802")A0+FY

! *")80(<'2"(&)'()E0@+)802"Z

! N0)(0&)#")$<+$'2)0<)83$(,'(,)E0@+)802"Z

slide-20
SLIDE 20

Does my code work?

! X+'&")$)&"%&)6+0,+$- ! O@()&3")&"%&)6+0,+$- ! T$(@$11E)/"+'<E)&3")0@&6@& ! N"1"&")&3")&"%&)6+0,+$-

Classic Approach

slide-21
SLIDE 21

Does my code work?

X+'&")$)@('&)&"%&

! L@&0-$&'8)"/$1@$&'0()0<)&3")&"%&)+"%@1& ! .(%&$(&)<""2#$8F ! !'-61")&"%&)"(/'+0(-"(& ! L110A%)<0+)&3")"$+1'"%&)60%%'#1")&"%&'(,)0<)$)

802")@('&

! SI"8@&$#1")%6"8'<'8$&'0( ! .%)(0&)2"1"&"2)#@&)F"6&)$%)+",+"%%'0()&"%&

Agile Approach

slide-22
SLIDE 22

=('&)J"%&%)'-6+0/")&3")80(<'2"(8")'()E0@+)802") $%)&3"E)2"&"8&)6+0#1"-%)$%)"$+1E)$%)60%%'#1"

slide-23
SLIDE 23

PHPUnit

Installation

!"#$"$%&$'(')'*+,-'./,%%+0123!.45+-'*+,-6*/*$%3&62+ 7223%8'9/,%%+0':*+,-6*/*$%3&62+:'!$..++2+2 ;3!.45+-<'4='./,%%+0':*+,-6*/*$%3&62+:'!$..++2+2 !"#$"$%&$'(')'*+,-'3%!&,00'*/*$%3&>*/*$%3& 24?%04,23%8'@A@B%3&1C6C6D6&8E'666 F&,-&3%8'&4'24?%04,2'@A@B%3&1C6C6D6&8E'GHIJKCJL'"<&+!M 6666666666666666666666666666666666624%+N'HIJKCJL'"<&+! 3%!&,00'4ON'./,%%+0N>>*+,-6*/*$%3&62+>@A@B%3&1C6C6D

slide-24
SLIDE 24

!

[:)<+$-"%

!

9)+011%)&0)F(08F)20A()&3")[:)6'(%

!

!80+")<0+)$)<+$-")'%)&3")(@-#"+)0<)6'(%)F(08F"2)20A(

!

*0(@%)<0+)$)%6$+")\$11)[:)6'(%)F(08F"2)20A()'()&A0)&+'"%]U)("I&)+011

!

*0(@%)<0+)$)%&+'F")\$11)[:)6'(%)F(08F"2)20A()'()0(")&+E]U)("I&)&A0)+011%

!

SI&+$)+011%)<0+)%6$+")0+)%&+'F")'()&3")[:&

3)<+$-"

slide-25
SLIDE 25

! " # $ % & + " & , #

  • &

*

slide-26
SLIDE 26

The Bowling Game Kata

The first test

PQ*/*

  • +R$3-+S4%.+'TU4?03%8V,W+6*/*TX

.0,!!'U4?03%8V,W+Y+!&'+Z&+%2!'@A@B%3&S[-,W+?4-OSY+!&9,!+ \ ]

slide-27
SLIDE 27

The Bowling Game Kata

The first test

PQ*/*

  • +R$3-+S4%.+'TU4?03%8V,W+6*/*TX

.0,!!'U4?03%8V,W+Y+!&'+Z&+%2!'@A@B%3&S[-,W+?4-OSY+!&9,!+ \ ''''*$"03.'=$%.&34%'&+!&F.4-+[4-V$&&+-V,W+^!DGM ''''\ ''''] ]

slide-28
SLIDE 28

The Bowling Game Kata

The first test

PQ*/*

  • +R$3-+S4%.+'TU4?03%8V,W+6*/*TX

.0,!!'U4?03%8V,W+Y+!&'+Z&+%2!'@A@B%3&S[-,W+?4-OSY+!&9,!+ \ ''''*$"03.'=$%.&34%'&+!&F.4-+[4-V$&&+-V,W+^!DGM ''''\ ''''''''_8,W+'`'%+?'U4?03%8V,W+X ''''''''=4-'G_3'`'DX'_3'P'HDX'_3aaM'\ ''''''''''''_8,W+1b-400GDMX ''''''''] ''''''''_&/3!1b,!!+-&cR$,0!GDK'_8,W+1b!.4-+GMMX ''''] ]

slide-29
SLIDE 29

The Bowling Game Kata

Generating a class skeleton based on a test case class

PQ*/* .0,!!'U4?03%8V,W+ \ ''''>dd '''''d'#&424'^W*0+W+%&'-400GM6 '''''d> ''''*$"03.'=$%.&34%'-400GM ''''\ ''''''''>>'e+W45+'&/+'=4004?3%8'03%+'?/+%'<4$'3W*0+W+%&'&/3!'W+&/426 ''''''''&/-4?'%+?'e$%&3W+cZ.+*&34%GTf4&'<+&'3W*0+W+%&+26TMX ''''] ''''>dd '''''d'#&424'^W*0+W+%&'!.4-+GM6 '''''d> ''''*$"03.'=$%.&34%'!.4-+GM ''''\ ''''''''>>'e+W45+'&/+'=4004?3%8'03%+'?/+%'<4$'3W*0+W+%&'&/3!'W+&/426 ''''''''&/-4?'%+?'e$%&3W+cZ.+*&34%GTf4&'<+&'3W*0+W+%&+26TMX ''''] ] Qb

!"#$"$%&$'(')'*/*$%3&'11!O+0+&4%1.0,!!'U4?03%8V,W+Y+!& @A@B%3&'C6J6D'"<'F+",!&3,%'U+-8W,%%6 g-4&+'!O+0+&4%'=4-':U4?03%8V,W+:'&4':U4?03%8V,W+6*/*:6

slide-30
SLIDE 30

The Bowling Game Kata

Running the tests of a test case class

!"#$"$%&$'(')'*/*$%3&'U4?03%8V,W+Y+!&'''''''''''''''' @A@B%3&'C6J6D'"<'F+",!&3,%'U+-8W,%%6 c Y3W+N'D'!+.4%2! Y/+-+'?,!'h'+--4-N hM'&+!&F.4-+[4-V$&&+-V,W+^!DGU4?03%8V,W+Y+!&M e$%&3W+cZ.+*&34%N'f4&'<+&'3W*0+W+%&+26 >/4W+>!">U4?03%8V,W+6*/*NhD >/4W+>!">U4?03%8V,W+Y+!&6*/*Nhh [7^iBecFj Y+!&!N'hK'7!!+-&34%!N'DK'c--4-!N'h6

slide-31
SLIDE 31

The Bowling Game Kata

The !"#$%&'()*+ class

PQ*/* .0,!!'U4?03%8V,W+ \ ''''*$"03.'=$%.&34%'-400G_*3%!M ''''\ ''''] ''''*$"03.'=$%.&34%'!.4-+GM ''''\ ''''''''-+&$-%'DX ''''] ]

slide-32
SLIDE 32

The Bowling Game Kata

Running the tests of a test case class

!"#$"$%&$'(')'*/*$%3&'U4?03%8V,W+Y+!&'''''''''''''''' @A@B%3&'C6J6D'"<'F+",!&3,%'U+-8W,%%6 6 Y3W+N'D'!+.4%2! kl'Gh'&+!&K'h',!!+-&34%M

slide-33
SLIDE 33

The Bowling Game Kata

Running the tests of a test case class

!"#$"$%&$'(')'*/*$%3&'11.404-!'U4?03%8V,W+Y+!&'''''''''''''''' @A@B%3&'C6J6D'"<'F+",!&3,%'U+-8W,%%6 6 Y3W+N'D'!+.4%2! kl'Gh'&+!&K'h',!!+-&34%M

slide-34
SLIDE 34

Interlude

! T"&302)0<)2"%',('(,)%0<&A$+"G))))))))))))))

(0&)7@%&)$)-"&302)0<)&"%&'(,)%0<&A$+"))))))))) ))))))))))

! J"%&%)2+'/")&3")2"/"106-"(&

! J"%&%)A+'&&"()#"<0+")802" ! V0)802")A'&30@&)&"%&%

Test-Driven Development

slide-35
SLIDE 35

Interlude

! J"%&

! X3$&)20)A")A$(&),-".+/0)&0)20Y ! 50A)20)A")A$(&)&0)&"11),-".+/0)&0)20)'&Y ! 50A)A'11)A")F(0A)A3"(),-".+/0)3$%)20(")'&Y)

)))))))))))))))

! ;02"

! 50A)20"%),-".+/0)20)'&Y

Test-Driven Development

slide-36
SLIDE 36

The best time to test is when the code is fresh

Your code is like clay. When it’s fresh, it’s soft and malleable. As it ages, it becomes hard and brittle. If you write tests when the code is fresh and easy to change, testing will be easy, and both the code and the tests will be strong.

J3'%)%1'2")80(&$'(%)-$&"+'$1)#E)L1#"+&0)!$/0'$

slide-37
SLIDE 37

Think of code and test as one

When writing the code, think of the test. When writing the test, think of the code. When you think of code and test as one, testing is easy and code is beautiful.

J3'%)%1'2")80(&$'(%)-$&"+'$1)#E)L1#"+&0)!$/0'$

slide-38
SLIDE 38

The Bowling Game Kata

The second test

PQ*/*

  • +R$3-+S4%.+'TU4?03%8V,W+6*/*TX

.0,!!'U4?03%8V,W+Y+!&'+Z&+%2!'@A@B%3&S[-,W+?4-OSY+!&9,!+ \ ''''>>'666 ''''*$"03.'=$%.&34%'&+!&F.4-+[4-700k%+!^!HDGM ''''\ ''''''''_8,W+'`'%+?'U4?03%8V,W+X ''''''''=4-'G_3'`'DX'_3'P'HDX'_3aaM'\ ''''''''''''_8,W+1b-400GhMX ''''''''] ''''''''_&/3!1b,!!+-&cR$,0!GHDK'_8,W+1b!.4-+GMMX ''''] ]

slide-39
SLIDE 39

The Bowling Game Kata

The second test

!"#$"$%&$'(')'*/*$%3&'U4?03%8V,W+Y+!&'''''''''''''''' @A@B%3&'C6J6D'"<'F+",!&3,%'U+-8W,%%6 6[ Y3W+N'D'!+.4%2! Y/+-+'?,!'h'=,30$-+N hM'&+!&F.4-+[4-700k%+!^!HDGU4?03%8V,W+Y+!&M [,30+2',!!+-&3%8'&/,&'P3%&+8+-NDb'W,&./+!'+Z*+.&+2'5,0$+'P3%&+8+-NHDb6 >/4W+>!">U4?03%8V,W+Y+!&6*/*NHL [7^iBecFj Y+!&!N'HK'7!!+-&34%!N'HK'[,30$-+!N'h6

slide-40
SLIDE 40

The Bowling Game Kata

The second test

!"#$"$%&$'(')'*/*$%3&'11.404-!'U4?03%8V,W+Y+!&'''''''''''''''' @A@B%3&'C6J6D'"<'F+",!&3,%'U+-8W,%%6 6[ Y3W+N'D'!+.4%2! Y/+-+'?,!'h'=,30$-+N hM'&+!&F.4-+[4-700k%+!^!HDGU4?03%8V,W+Y+!&M [,30+2',!!+-&3%8'&/,&'P3%&+8+-NDb'W,&./+!'+Z*+.&+2'5,0$+'P3%&+8+-NHDb6 >/4W+>!">U4?03%8V,W+Y+!&6*/*NHL [7^iBecFj Y+!&!N'HK'7!!+-&34%!N'HK'[,30$-+!N'h6 [7^iBecFj Y+!&!N'HK'7!!+-&34%!N'HK'[,30$-+!N'h6

slide-41
SLIDE 41

The Bowling Game Kata

Leveraging the ,+123/0 template method

PQ*/*

  • +R$3-+S4%.+'TU4?03%8V,W+6*/*TX

.0,!!'U4?03%8V,W+Y+!&'+Z&+%2!'@A@B%3&S[-,W+?4-OSY+!&9,!+ \ ''''*-4&+.&+2'_8,W+X ''''*-4&+.&+2'=$%.&34%'!+&B*GM ''''\ ''''''''_&/3!1b8,W+'`'%+?'U4?03%8V,W+X ''''] ''''>>'666 ''''*$"03.'=$%.&34%'&+!&F.4-+[4-700k%+!^!HDGM ''''\ ''''''''=4-'G_3'`'DX'_3'P'HDX'_3aaM'\ ''''''''''''_&/3!1b8,W+1b-400GhMX ''''''''] ''''''''_&/3!1b,!!+-&cR$,0!GHDK'_&/3!1b8,W+1b!.4-+GMMX ''''] ''''>>'666 ]

slide-42
SLIDE 42

The Bowling Game Kata

Introducing the ."$$4)&5/0 template method

PQ*/*

  • +R$3-+S4%.+'TU4?03%8V,W+6*/*TX

.0,!!'U4?03%8V,W+Y+!&'+Z&+%2!'@A@B%3&S[-,W+?4-OSY+!&9,!+ \ ''''>>'666 ''''*-4&+.&+2'=$%.&34%'-400m,%<G_%K'_*3%!M ''''\ ''''''''=4-'G_3'`'DX'_3'P'_%X'_3aaM'\ ''''''''''''_&/3!1b8,W+1b-400G_*3%!MX ''''''''] ''''] ''''*$"03.'=$%.&34%'&+!&F.4-+[4-V$&&+-V,W+^!DGM ''''\ ''''''''_&/3!1b-400m,%<GHDK'DMX ''''''''_&/3!1b,!!+-&cR$,0!GDK'_&/3!1b8,W+1b!.4-+GMMX ''''] ''''*$"03.'=$%.&34%'&+!&F.4-+[4-700k%+!^!HDGM ''''\ ''''''''_&/3!1b-400m,%<GHDK'hMX ''''''''_&/3!1b,!!+-&cR$,0!GHDK'_&/3!1b8,W+1b!.4-+GMMX ''''] ]

slide-43
SLIDE 43

The Bowling Game Kata

The third test

PQ*/*

  • +R$3-+S4%.+'TU4?03%8V,W+6*/*TX

.0,!!'U4?03%8V,W+Y+!&'+Z&+%2!'@A@B%3&S[-,W+?4-OSY+!&9,!+ \ ''''>>'666 ''''*$"03.'=$%.&34%'&+!&F.4-+[4-k%+F*,-+7%2C^!hIGM ''''\ ''''''''_&/3!1b8,W+1b-400GLMX ''''''''_&/3!1b8,W+1b-400GLMX ''''''''_&/3!1b8,W+1b-400GCMX ''''''''_&/3!1b-400m,%<GhnK'DMX ''''''''_&/3!1b,!!+-&cR$,0!GhIK'_&/3!1b8,W+1b!.4-+GMMX ''''] ]

slide-44
SLIDE 44

The Bowling Game Kata

The fourth test

PQ*/*

  • +R$3-+S4%.+'TU4?03%8V,W+6*/*TX

.0,!!'U4?03%8V,W+Y+!&'+Z&+%2!'@A@B%3&S[-,W+?4-OSY+!&9,!+ \ ''''>>'666 ''''*$"03.'=$%.&34%'&+!&F.4-+[4-k%+F&-3O+7%2C7%2J^!HJGM ''''\ ''''''''_&/3!1b8,W+1b-400GhDMX ''''''''_&/3!1b8,W+1b-400GCMX ''''''''_&/3!1b8,W+1b-400GJMX ''''''''_&/3!1b-400m,%<GhnK'DMX ''''''''_&/3!1b,!!+-&cR$,0!GHJK'_&/3!1b8,W+1b!.4-+GMMX ''''] ]

slide-45
SLIDE 45

The Bowling Game Kata

The fifth test

PQ*/*

  • +R$3-+S4%.+'TU4?03%8V,W+6*/*TX

.0,!!'U4?03%8V,W+Y+!&'+Z&+%2!'@A@B%3&S[-,W+?4-OSY+!&9,!+ \ ''''>>'666 ''''*$"03.'=$%.&34%'&+!&F.4-+[4-@+-=+.&V,W+^!CDDGM ''''\ ''''''''_&/3!1b-400m,%<GhHK'hDMX ''''''''_&/3!1b,!!+-&cR$,0!GCDDK'_&/3!1b8,W+1b!.4-+GMMX ''''] ]

slide-46
SLIDE 46

The Bowling Game Kata

Running the tests of a test case class

!"#$"$%&$'(')'*/*$%3&'U4?03%8V,W+Y+!& @A@B%3&'C6J6D'"<'F+",!&3,%'U+-8W,%%6 6[[[[ Y3W+N'D'!+.4%2! Y/+-+'?+-+'J'=,30$-+!N hM'&+!&F.4-+[4-700k%+!^!HDGU4?03%8V,W+Y+!&M [,30+2',!!+-&3%8'&/,&'P3%&+8+-NDb'W,&./+!'+Z*+.&+2'5,0$+'P3%&+8+-NHDb6 >/4W+>!">U4?03%8V,W+Y+!&6*/*NIn HM'&+!&F.4-+[4-k%+F*,-+7%2C^!hIGU4?03%8V,W+Y+!&M [,30+2',!!+-&3%8'&/,&'P3%&+8+-NDb'W,&./+!'+Z*+.&+2'5,0$+'P3%&+8+-NhIb6 >/4W+>!">U4?03%8V,W+Y+!&6*/*NnL CM'&+!&F.4-+[4-k%+F&-3O+7%2C7%2J^!HJGU4?03%8V,W+Y+!&M [,30+2',!!+-&3%8'&/,&'P3%&+8+-NDb'W,&./+!'+Z*+.&+2'5,0$+'P3%&+8+-NHJb6 >/4W+>!">U4?03%8V,W+Y+!&6*/*NoJ JM'&+!&F.4-+[4-@+-=+.&V,W+^!CDDGU4?03%8V,W+Y+!&M [,30+2',!!+-&3%8'&/,&'P3%&+8+-NDb'W,&./+!'+Z*+.&+2'5,0$+'P3%&+8+-NCDDb6 >/4W+>!">U4?03%8V,W+Y+!&6*/*NpD [7^iBecFj Y+!&!N'LK'7!!+-&34%!N'LK'[,30$-+!N'J6

slide-47
SLIDE 47

The Bowling Game Kata

TestDox: Report test result as executable specification

!"#$"$%&$'(')'*/*$%3&'11&+!&24Z'U4?03%8V,W+Y+!& @A@B%3&'C6J6D'"<'F+",!&3,%'U+-8W,%%6 U4?03%8V,W+ 'qZr'F.4-+'=4-'8$&&+-'8,W+'3!'D 'q'r'F.4-+'=4-',00'4%+!'3!'HD 'q'r'F.4-+'=4-'4%+'!*,-+',%2'C'3!'hI 'q'r'F.4-+'=4-'4%+'!&-3O+',%2'C',%2'J'3!'HJ 'q'r'F.4-+'=4-'*+-=+.&'8,W+'3!'CDD

slide-48
SLIDE 48

The Bowling Game Kata

The !"#$%&'()*+ class

PQ*/* .0,!!'U4?03%8V,W+ \ ''''*-4&+.&+2'_-400!'`',--,<GMX ''''*$"03.'=$%.&34%'-400G_*3%!M ''''\ ''''''''_&/3!1b-400!qr'`'_*3%!X ''''] ''''>>'666 ]

slide-49
SLIDE 49

The Bowling Game Kata

The !"#$%&'()*+ class

PQ*/* .0,!!'U4?03%8V,W+ \ ''''>>'666 ''''*-4&+.&+2'=$%.&34%'3!F*,-+G_=-,W+^%2+ZM ''''\ ''''''''-+&$-%'_&/3!1b!$Wk=@3%!^%[-,W+G_=-,W+^%2+ZM'``'hDX ''''] ''''*-4&+.&+2'=$%.&34%'3!F&-3O+G_=-,W+^%2+ZM ''''\ ''''''''-+&$-%'_&/3!1b-400!q_=-,W+^%2+Zr'``'hDX ''''] ''''*-4&+.&+2'=$%.&34%'!$Wk=@3%!^%[-,W+G_=-,W+^%2+ZM ''''\ ''''''''-+&$-%'_&/3!1b-400!q_=-,W+^%2+Zr'a '''''''''''''''_&/3!1b-400!q_=-,W+^%2+Z'a'hrX ''''] ]

slide-50
SLIDE 50

The Bowling Game Kata

The !"#$%&'()*+ class

PQ*/* .0,!!'U4?03%8V,W+ \ ''''>>'666 ''''*-4&+.&+2'=$%.&34%'!*,-+U4%$!G_=-,W+^%2+ZM ''''\ ''''''''-+&$-%'_&/3!1b-400!q_=-,W+^%2+Z'a'HrX ''''] ''''*-4&+.&+2'=$%.&34%'!&-3O+U4%$!G_=-,W+^%2+ZM ''''\ ''''''''-+&$-%'_&/3!1b-400!q_=-,W+^%2+Z'a'hr'a '''''''''''''''_&/3!1b-400!q_=-,W+^%2+Z'a'HrX ''''] ]

slide-51
SLIDE 51

The Bowling Game Kata

The !"#$%&'()*+ class

PQ*/* .0,!!'U4?03%8V,W+ \ ''''>>'666 ''''*$"03.'=$%.&34%'!.4-+GM ''''\ ''''''''_!.4-+''''''`'DX ''''''''_=-,W+^%2+Z'`'DX ''''''''=4-'G_=-,W+'`'DX'_=-,W+'P'hDX'_=-,W+aaM'\ ''''''''''''3='G_&/3!1b3!F&-3O+G_=-,W+^%2+ZMM'\ ''''''''''''''''_!.4-+'a`'hD'a'_&/3!1b!&-3O+U4%$!G_=-,W+^%2+ZMX ''''''''''''''''_=-,W+^%2+ZaaX ''''''''''''] ''''''''''''+0!+'3='G_&/3!1b3!F*,-+G_=-,W+^%2+ZMM'\ ''''''''''''''''_!.4-+'a`'hD'a'_&/3!1b!*,-+U4%$!G_=-,W+^%2+ZMX ''''''''''''''''_=-,W+^%2+Z'a`'HX ''''''''''''] ''''''''''''+0!+'\ ''''''''''''''''_!.4-+'a`'_&/3!1b!$Wk=@3%!^%[-,W+G_=-,W+^%2+ZMX ''''''''''''''''_=-,W+^%2+Z'a`'HX ''''''''''''] ''''''''] ''''''''-+&$-%'_!.4-+X ''''] ]

slide-52
SLIDE 52

The Bowling Game Kata

TestDox: Report test result as executable specification

!"#$"$%&$'(')'*/*$%3&'11&+!&24Z'U4?03%8V,W+Y+!& @A@B%3&'C6J6D'"<'F+",!&3,%'U+-8W,%%6 U4?03%8V,W+ 'qZr'F.4-+'=4-'8$&&+-'8,W+'3!'D 'qZr'F.4-+'=4-',00'4%+!'3!'HD 'qZr'F.4-+'=4-'4%+'!*,-+',%2'C'3!'hI 'qZr'F.4-+'=4-'4%+'!&-3O+',%2'C',%2'J'3!'HJ 'qZr'F.4-+'=4-'*+-=+.&'8,W+'3!'CDD

slide-53
SLIDE 53

Software Testing Categorization

! !-$11U)=('&)J"%&%

! ;3"8F)80(2'&'0($1)10,'8)'()&3")802" ! L)2"#@,,"+)%30@12)(0&)#")+"^@'+"2)'()8$%")0<)<$'1@+" ! O@(%)'()1"%%)&3$()[)-%

! T"2'@-U)?@(8&'0($1)J"%&%

! ;3"8F)A3"&3"+)&3")'(&"+<$8"%)#"&A""()81$%%"%)))

$#'2")#E)&3"'+)80(&+$8&%

! R$+,"U)S(2>&0>S(2)J"%&%

! ;3"8F)<0+)CA'+'(,)#@,%C

!"#$%$&#'(%)*+,-#+$%.-,(/#-&%01%2#34*%5(6(/1

slide-54
SLIDE 54
slide-55
SLIDE 55

The Bowling Game Kata

Creating a test case class skeleton for existing code

!"#$"$%&$'(')'*/*$%3&'11!O+0+&4%1&+!&'U4?03%8V,W+ @A@B%3&'C6J6D'"<'F+",!&3,%'U+-8W,%%6 g-4&+'!O+0+&4%'=4-':U4?03%8V,W+Y+!&:'&4':U4?03%8V,W+Y+!&6*/*:6 !"#$"$%&$'(')'*/*$%3&'115+-"4!+'U4?03%8V,W+Y+!& @A@B%3&'C6J6D'"<'F+",!&3,%'U+-8W,%%6 U4?03%8V,W+Y+!& ^^ Y3W+N'D'!+.4%2! Y/+-+'?+-+'H'3%.4W*0+&+'&+!&!N hM'&+!&e400GU4?03%8V,W+Y+!&M Y/3!'&+!&'/,!'%4&'"++%'3W*0+W+%&+2'<+&6 >/4W+>!">U4?03%8V,W+Y+!&6*/*NJI HM'&+!&F.4-+GU4?03%8V,W+Y+!&M Y/3!'&+!&'/,!'%4&'"++%'3W*0+W+%&+2'<+&6 >/4W+>!">U4?03%8V,W+Y+!&6*/*NLI klK'"$&'3%.4W*0+&+'4-'!O3**+2'&+!&!j Y+!&!N'HK'7!!+-&34%!N'DK'^%.4W*0+&+N'H6

slide-56
SLIDE 56

The Bowling Game Kata

Code Coverage

!"#$"$%&$'(')'*/*$%3&'11.45+-,8+1/&W0'>&W*>-+*4-&'U4?03%8V,W+Y+!& @A@B%3&'C6J6D'"<'F+",!&3,%'U+-8W,%%6 66666 Y3W+N'D'!+.4%2! kl'GL'&+!&!K'L',!!+-&34%!M V+%+-,&3%8'-+*4-&K'&/3!'W,<'&,O+','W4W+%&6

slide-57
SLIDE 57

! " # $ % & ' (& ) # *

slide-58
SLIDE 58

Test Doubles

! !"#$%&'$#($)(*+,-$."/+%$+'0(1('0('2.-$$$$$$$$

#3('$%"0($+2$0(1('04$"'$+4$5'54&6.(7

! !"#$%&'$#($&)"+0$4."#$2(4247 ! !"#$"%&'("#'#()*%)+"+,#)+#-./(.#,."#012#

3"%"+34#-/,.#'#5,"4,64%"(/7/(#"89/:'&"+,;<

slide-59
SLIDE 59

Test Doubles

!

N@--E V0&)&3")+"$1)0#7"8&

!

?$F" =%$#1")<0+)&"%&'(,)#@&) (0&)<0+)+"$1)70#

!

!&@# ?$F")&3$&)+"&@+(%)8$(("2) 2$&$

!

!6E !&@#)&3$&)+"80+2%)8$11"2)

  • "&302%G)"&8B

!

T08F !6E)A'&3)"I6"8&$&'0(%

Terminology

slide-60
SLIDE 60

Test Doubles

Stubbing a method with PHPUnit

PQ*/* .0,!!'F&$"Y+!&'+Z&+%2!'@A@B%3&S[-,W+?4-OSY+!&9,!+ \ ''''*$"03.'=$%.&34%'&+!&F&$"GM ''''\ ''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''''''''' '''''''''''''''''''''''''''''''''''''' '''''''''''''''''''''''''''''''''''''''''''''''' ' ''''''''''''''''''''''''''''''''''''''''''''''''''''''' '''''''''''''''''' ''''] ] Qb

slide-61
SLIDE 61

Test Doubles

Stubbing a method with PHPUnit

PQ*/* .0,!!'F&$"Y+!&'+Z&+%2!'@A@B%3&S[-,W+?4-OSY+!&9,!+ \ ''''*$"03.'=$%.&34%'&+!&F&$"GM ''''\ ''''''''_!&$"'`'_&/3!1b8+&m4.OGTF4W+90,!!TMX ''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''''''''''''''''''' ' '''''''''''''''''''''''''''''''''''''''''''''''''''''''' '''''''''''''''''''' ''''] ] Qb

slide-62
SLIDE 62

Test Doubles

Stubbing a method with PHPUnit: .+16.&7)$6+/0

PQ*/* .0,!!'F&$"Y+!&'+Z&+%2!'@A@B%3&S[-,W+?4-OSY+!&9,!+ \ ''''*$"03.'=$%.&34%'&+!&F&$"GM ''''\ ''''''''_!&$"'`'_&/3!1b8+&m4.OGTF4W+90,!!TMX ''''''''_!&$"1b+Z*+.&!G_&/3!1b,%<GMM '''''''''''''1bW+&/42GT24F4W+&/3%8TM '''''''''''''1b?300G_&/3!1b-+&$-%s,0$+GT=44TMMX ' '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''' ''''] ] Qb

slide-63
SLIDE 63

Test Doubles

Stubbing a method with PHPUnit: .+16.&7)$6+/0

PQ*/* .0,!!'F&$"Y+!&'+Z&+%2!'@A@B%3&S[-,W+?4-OSY+!&9,!+ \ ''''*$"03.'=$%.&34%'&+!&F&$"GM ''''\ ''''''''_!&$"'`'_&/3!1b8+&m4.OGTF4W+90,!!TMX ''''''''_!&$"1b+Z*+.&!G_&/3!1b,%<GMM '''''''''''''1bW+&/42GT24F4W+&/3%8TM '''''''''''''1b?300G_&/3!1b-+&$-%s,0$+GT=44TMMX ' ''''''''>>'9,003%8'_!&$"1b24F4W+&/3%8GM'?300'%4?'-+&$-% ''''''''>>'T=44T6 ''''] ] Qb

slide-64
SLIDE 64

Test Doubles

Stubbing a method with PHPUnit: .+16.&8.'6*+&1/0

PQ*/* .0,!!'F&$"Y+!&'+Z&+%2!'@A@B%3&S[-,W+?4-OSY+!&9,!+ \ ''''*$"03.'=$%.&34%'&+!&e+&$-%7-8$W+%&F&$"GM ''''\ ''''''''_!&$"'`'_&/3!1b8+&m4.OG ''''''''''TF4W+90,!!TK',--,<GT24F4W+&/3%8TM ''''''''MX ''''''''_!&$"1b+Z*+.&!G_&/3!1b,%<GMM '''''''''''''1bW+&/42GT24F4W+&/3%8TM '''''''''''''1b?300G_&/3!1b-+&$-%7-8$W+%&GDMMX ' ''''''''>>'_!&$"1b24F4W+&/3%8GT=44TM'-+&$-%!'T=44T ''''''''>>'_!&$"1b24F4W+&/3%8GT",-TM'-+&$-%!'T",-T ''''] ]

slide-65
SLIDE 65

Test Doubles

Stubbing a method with PHPUnit: .+16.&9)$$:)-;/0

PQ*/* .0,!!'F&$"Y+!&'+Z&+%2!'@A@B%3&S[-,W+?4-OSY+!&9,!+ \ ''''*$"03.'=$%.&34%'&+!&e+&$-%9,00",.OF&$"GM ''''\ ''''''''_!&$"'`'_&/3!1b8+&m4.OG ''''''''''TF4W+90,!!TK',--,<GT24F4W+&/3%8TM ''''''''MX ''''''''_!&$"1b+Z*+.&!G_&/3!1b,%<GMM '''''''''''''1bW+&/42GT24F4W+&/3%8TM '''''''''''''1b?300G_&/3!1b-+&$-%9,00",.OGT.,00",.OTMMX ' ''''''''>>'_!&$"1b24F4W+&/3%8GM'-+&$-%!'.,00",.OG666M ''''] ]

=$%.&34%'.,00",.OGM'\ ''''_,-8!'`'=$%.S8+&S,-8!GMX ''''>>'666 ]

slide-66
SLIDE 66

Test Doubles

Stubbing a method with PHPUnit: throwException/0

PQ*/* .0,!!'F&$"Y+!&'+Z&+%2!'@A@B%3&S[-,W+?4-OSY+!&9,!+ \ ''''*$"03.'=$%.&34%'&+!&Y/-4?cZ.+*&34%F&$"GM ''''\ ''''''''_!&$"'`'_&/3!1b8+&m4.OG ''''''''''TF4W+90,!!TK',--,<GT24F4W+&/3%8TM ''''''''MX ''''''''_!&$"1b+Z*+.&!G_&/3!1b,%<GMM '''''''''''''1bW+&/42GT24F4W+&/3%8TM '''''''''''''1b?300G_&/3!1b&/-4?cZ.+*&34%G%+?'cZ.+*&34%MMX ' ''''''''>>'_!&$"1b24F4W+&/3%8GM'&/-4?!'cZ.+*&34% ''''] ]

slide-67
SLIDE 67

Test Doubles

Mocking a method with PHPUnit

PQ*/* .0,!!'k"!+-5+-Y+!&'+Z&+%2!'@A@B%3&S[-,W+?4-OSY+!&9,!+'\ ''''*$"03.'=$%.&34%'&+!&B*2,&+^!9,00+2k%.+GM'\ '''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''''''''''' '''''''''' ' ''''''''''''''''''''''''''''''''''''''''''' '''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''''''''''''''''''''''''' ' '''''''''''''''''''''''''''''''''' '''''''''''''''''''''''''''''''''''''' '''''''''''''''''''''''''''''''' ''''] ] Qb

slide-68
SLIDE 68

Test Doubles

Mocking a method with PHPUnit

PQ*/* .0,!!'k"!+-5+-Y+!&'+Z&+%2!'@A@B%3&S[-,W+?4-OSY+!&9,!+'\ ''''*$"03.'=$%.&34%'&+!&B*2,&+^!9,00+2k%.+GM'\ ''''''''_4"!+-5+-'`'_&/3!1b8+&m4.OG ''''''''''Tk"!+-5+-TK',--,<GT$*2,&+TM ''''''''MX ' '''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' '''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''''''' ''''] ] Qb

slide-69
SLIDE 69

Test Doubles

Mocking a method with PHPUnit

PQ*/* .0,!!'k"!+-5+-Y+!&'+Z&+%2!'@A@B%3&S[-,W+?4-OSY+!&9,!+'\ ''''*$"03.'=$%.&34%'&+!&B*2,&+^!9,00+2k%.+GM'\ ''''''''_4"!+-5+-'`'_&/3!1b8+&m4.OG ''''''''''Tk"!+-5+-TK',--,<GT$*2,&+TM ''''''''MX ' ''''''''_4"!+-5+-1b+Z*+.&!G_&/3!1b4%.+GMM '''''''''''''''''1bW+&/42GT$*2,&+TM '''''''''''''''''1b?3&/G_&/3!1b+R$,0Y4GT!4W+&/3%8TMMX ' ''''''''''''''''''''''''''''''' '''''''''''''''''''''''''''''''''''' '''''''''''''''''''''''''''''''''' ''''] ] Qb

slide-70
SLIDE 70

Test Doubles

Mocking a method with PHPUnit

PQ*/* .0,!!'k"!+-5+-Y+!&'+Z&+%2!'@A@B%3&S[-,W+?4-OSY+!&9,!+'\ ''''*$"03.'=$%.&34%'&+!&B*2,&+^!9,00+2k%.+GM'\ ''''''''_4"!+-5+-'`'_&/3!1b8+&m4.OG ''''''''''Tk"!+-5+-TK',--,<GT$*2,&+TM ''''''''MX ' ''''''''_4"!+-5+-1b+Z*+.&!G_&/3!1b4%.+GMM '''''''''''''''''1bW+&/42GT$*2,&+TM '''''''''''''''''1b?3&/G_&/3!1b+R$,0Y4GT!4W+&/3%8TMMX ' ''''''''_!$"t+.&'`'%+?'F$"t+.&X ''''''''_!$"t+.&1b,&&,./G_4"!+-5+-MX ''''''''_!$"t+.&1b24F4W+&/3%8GMX ''''] ] Qb

slide-71
SLIDE 71

Test Doubles

Mocking the filesystem with vfsStream

PQ*/* .0,!!'cZ,W*0+'\ ''''*-4&+.&+2'_32X ''''*-4&+.&+2'_23-+.&4-<X ''''*$"03.'=$%.&34%'<<.4%!&-$.&G_32M'\ ''''''''_&/3!1b32'`'_32X ''''] ''''*$"03.'=$%.&34%'!+&;3-+.&4-<G_23-+.&4-<M'\ ''''''''_&/3!1b23-+.&4-<'`'_23-+.&4-<'6';^ec9YkeuSFc@7e7Yke'6'_&/3!1b32X ''''''''3='Gj=30+S+Z3!&!G_&/3!1b23-+.&4-<MM'\ ''''''''''''WO23-G_&/3!1b23-+.&4-<K'DnDDK'YeBcMX ''''''''] ''''] ] Qb

slide-72
SLIDE 72

Test Doubles

Mocking the filesystem with vfsStream

PQ*/*

  • +R$3-+S4%.+'T5=!F&-+,W>5=!F&-+,W6*/*TX
  • +R$3-+S4%.+'TcZ,W*0+6*/*TX

.0,!!'cZ,W*0+Y+!&'+Z&+%2!'@A@B%3&S[-,W+?4-OSY+!&9,!+'\ ''''*$"03.'=$%.&34%'!+&B*GM'\ ''''''''5=!F&-+,Wg-,**+-NN-+83!&+-GMX ''''''''5=!F&-+,Wg-,**+-NN!+&e44&G%+?'5=!F&-+,W;3-+.&4-<GT+Z,W*0+;3-TMMX ''''] ''''*$"03.'=$%.&34%'&+!&;3-+.&4-<^!9-+,&+2GM'\ ''''''''_+Z,W*0+'`'%+?'cZ,W*0+GT32TMX ''''''''_&/3!1b,!!+-&[,0!+G5=!F&-+,Wg-,**+-NN8+&e44&GM1b/,!9/302GT32TMMX ''''''''_+Z,W*0+1b!+&;3-+.&4-<G5=!F&-+,WNN$-0GT+Z,W*0+;3-TMMX ''''''''_&/3!1b,!!+-&Y-$+G5=!F&-+,Wg-,**+-NN8+&e44&GM1b/,!9/302GT32TMMX ''''] ] Qb

slide-73
SLIDE 73

PHPUnit

Data Provider

PQ*/* .0,!!';,&,Y+!&'+Z&+%2!'@A@B%3&S[-,W+?4-OSY+!&9,!+ \ ''''>dd '''''d'#2,&,@-4532+-'*-4532+-m+&/42 '''''d> ''''*$"03.'=$%.&34%'&+!&722G_,K'_"K'_.M ''''\ ''''''''_&/3!1b,!!+-&cR$,0!G_.K'_,'a'_"MX ''''] ''''*$"03.'=$%.&34%'*-4532+-m+&/42GM ''''\ ''''''''-+&$-%',--,<G '''''''''',--,<GDK'DK'DMK '''''''''',--,<GDK'hK'hMK '''''''''',--,<GhK'hK'CMK '''''''''',--,<GhK'DK'hM ''''''''MX ''''] ]

slide-74
SLIDE 74

PHPUnit

Data Provider

!"#$"$%&$'(')'*/*$%3&';,&,Y+!& @A@B%3&'C6J6D'"<'F+",!&3,%'U+-8W,%%6 66[6 Y3W+N'D'!+.4%2! Y/+-+'?,!'h'=,30$-+N hM'&+!&722G;,&,Y+!&M'?3&/'2,&,'GhK'hK'CM [,30+2',!!+-&3%8'&/,&'P3%&+8+-NHb'W,&./+!'+Z*+.&+2'5,0$+'P3%&+8+-NCb6 >/4W+>!">;,&,Y+!&6*/*Nhp [7^iBecFj Y+!&!N'JK'7!!+-&34%!N'JK'[,30$-+!N'h6

slide-75
SLIDE 75

PHPUnit

Test Dependencies

PQ*/* .0,!!'F&,.OY+!&'+Z&+%2!'@A@B%3&S[-,W+?4-OSY+!&9,!+'\ ''''*$"03.'=$%.&34%'&+!&cW*&<GM'\ ''''''''_!&,.O'`',--,<GMX ''''''''_&/3!1b,!!+-&Y-$+G+W*&<G_!&,.OMMX ' ''''''''-+&$-%'_!&,.OX ''''] ' ' ' ]

slide-76
SLIDE 76

PHPUnit

Test Dependencies

PQ*/* .0,!!'F&,.OY+!&'+Z&+%2!'@A@B%3&S[-,W+?4-OSY+!&9,!+'\ ''''*$"03.'=$%.&34%'&+!&cW*&<GM'\ ''''''''_!&,.O'`',--,<GMX ''''''''_&/3!1b,!!+-&Y-$+G+W*&<G_!&,.OMMX ' ''''''''-+&$-%'_!&,.OX ''''] ' ''''>dd '''''d'#2+*+%2!'&+!&cW*&< '''''d> ''''*$"03.'=$%.&34%'&+!&@$!/G,--,<'_!&,.OM'\ '''''''',--,<S*$!/G_!&,.OK'T=44TMX ''''''''_&/3!1b,!!+-&[,0!+G+W*&<G_!&,.OMMX ''''''''_&/3!1b,!!+-&cR$,0!GT=44TK'_!&,.Oq.4$%&G_!&,.OM'1'hrMX ' ''''''''-+&$-%'_!&,.OX ''''] ' ]

slide-77
SLIDE 77

PHPUnit

Test Dependencies

PQ*/* .0,!!'F&,.OY+!&'+Z&+%2!'@A@B%3&S[-,W+?4-OSY+!&9,!+'\ ''''*$"03.'=$%.&34%'&+!&cW*&<GM'\ ''''''''_!&,.O'`',--,<GMX ''''''''_&/3!1b,!!+-&Y-$+G+W*&<G_!&,.OMMX ' ''''''''-+&$-%'_!&,.OX ''''] ' ''''>dd '''''d'#2+*+%2!'&+!&cW*&< '''''d> ''''*$"03.'=$%.&34%'&+!&@$!/G,--,<'_!&,.OM'\ '''''''',--,<S*$!/G_!&,.OK'T=44TMX ''''''''_&/3!1b,!!+-&[,0!+G+W*&<G_!&,.OMMX ''''''''_&/3!1b,!!+-&cR$,0!GT=44TK'_!&,.Oq.4$%&G_!&,.OM'1'hrMX ' ''''''''-+&$-%'_!&,.OX ''''] ' ''''>dd '''''d'#2+*+%2!'&+!&@$!/ '''''d> ''''*$"03.'=$%.&34%'&+!&@4*G,--,<'_!&,.OM'\ ''''''''_&/3!1b,!!+-&cR$,0!GT=44TK',--,<S*4*G_!&,.OMMX ''''''''_&/3!1b,!!+-&Y-$+G+W*&<G_!&,.OMMX ''''] ]

slide-78
SLIDE 78

PHPUnit

Test Dependencies

PQ*/* .0,!!';+*+%2+%.<[,30$-+Y+!&'+Z&+%2!'@A@B%3&S[-,W+?4-OSY+!&9,!+ \ ''''*$"03.'=$%.&34%'&+!&k%+GM ''''\ ''''''''_&/3!1b,!!+-&Y-$+G[7iFcMX ''''] ' ''''>dd '''''d'#2+*+%2!'&+!&k%+ '''''d> ''''*$"03.'=$%.&34%'&+!&Y?4GM ''''\ ''''] ]

slide-79
SLIDE 79

PHPUnit

Test Dependencies

!"#$"$%&$'(')'*/*$%3&'115+-"4!+';+*+%2+%.<[,30$-+Y+!& @A@B%3&'C6J6D'"<'F+",!&3,%'U+-8W,%%6 ;+*+%2+%.<[,30$-+Y+!& [F Y3W+N'D'!+.4%2! Y/+-+'?,!'h'=,30$-+N hM'&+!&k%+G;+*+%2+%.<[,30$-+Y+!&M [,30+2',!!+-&3%8'&/,&'P"440+,%N=,0!+b'3!'&-$+6 >/4W+>!">;+*+%2+%.<[,30$-+Y+!&6*/*NI Y/+-+'?,!'h'!O3**+2'&+!&N hM'&+!&Y?4G;+*+%2+%.<[,30$-+Y+!&M Y/3!'&+!&'2+*+%2!'4%':;+*+%2+%.<[,30$-+Y+!&NN&+!&k%+:'&4'*,!!6 [7^iBecFj Y+!&!N'HK'7!!+-&34%!N'hK'[,30$-+!N'hK'FO3**+2N'h6

slide-80
SLIDE 80

PHPUnit

=)1):),+>+,19),+

=%"2)&0)&"%&)2$&$#$%">2+'/"()6+07"8&%

! 4@&%)&3")2$&$#$%")'(&0)$)F(0A()%&$&")

#"&A""()&"%&)+@(%

! L/0'2%)6+0#1"-%)A'&3)0(")&"%&)80++@6&'(,)&3")

2$&$#$%")<0+)0&3"+)&"%&%

! L#'1'&E)&0)"I60+&)$(2)'-60+&)2$&$)&0)$(2)<+0-)

;!_G)`TR)$(2)QLTR)2$&$%"&%

slide-81
SLIDE 81

PHPUnit

=)1):),+>+,19),+

PQ*/*

  • +R$3-+S4%.+'T@A@B%3&>cZ&+%!34%!>;,&,",!+>Y+!&9,!+6*/*TX

' .0,!!'U,%O7..4$%&;UY+!&'+Z&+%2!'@A@B%3&ScZ&+%!34%!S;,&,",!+SY+!&9,!+'\ ]

slide-82
SLIDE 82

PHPUnit

=)1):),+>+,19),+

PQ*/*

  • +R$3-+S4%.+'T@A@B%3&>cZ&+%!34%!>;,&,",!+>Y+!&9,!+6*/*TX

' .0,!!'U,%O7..4$%&;UY+!&'+Z&+%2!'@A@B%3&ScZ&+%!34%!S;,&,",!+SY+!&9,!+'\ ''''*-4&+.&+2'_*24X ''''''''''' ''''*$"03.'=$%.&34%'SS.4%!&-$.&GM'\ ''''''''_&/3!1b*24'`'@A@B%3&SB&30S@;kNN=,.&4-<G ''''''''''TW<!R0N>>&+!&#04.,0/4!&>&+!&T ''''''''MX ''''''''U,%O7..4$%&NN.-+,&+Y,"0+G_&/3!1b*24MX ''''] ]

slide-83
SLIDE 83

PHPUnit

=)1):),+>+,19),+

PQ*/*

  • +R$3-+S4%.+'T@A@B%3&>cZ&+%!34%!>;,&,",!+>Y+!&9,!+6*/*TX

' .0,!!'U,%O7..4$%&;UY+!&'+Z&+%2!'@A@B%3&ScZ&+%!34%!S;,&,",!+SY+!&9,!+'\ ''''*-4&+.&+2'_*24X ''''''''''' ''''*$"03.'=$%.&34%'SS.4%!&-$.&GM'\ ''''''''_&/3!1b*24'`'@A@B%3&SB&30S@;kNN=,.&4-<G ''''''''''TW<!R0N>>&+!&#04.,0/4!&>&+!&T ''''''''MX ''''''''U,%O7..4$%&NN.-+,&+Y,"0+G_&/3!1b*24MX ''''] ''''*-4&+.&+2'=$%.&34%'8+&94%%+.&34%GM'\ ''''''''-+&$-%'_&/3!1b.-+,&+;+=,$0&;U94%%+.&34%G_&/3!1b*24K'TW<!R0TMX ''''] ]

slide-84
SLIDE 84

PHPUnit

=)1):),+>+,19),+

PQ*/*

  • +R$3-+S4%.+'T@A@B%3&>cZ&+%!34%!>;,&,",!+>Y+!&9,!+6*/*TX

' .0,!!'U,%O7..4$%&;UY+!&'+Z&+%2!'@A@B%3&ScZ&+%!34%!S;,&,",!+SY+!&9,!+'\ ''''*-4&+.&+2'_*24X ''''''''''' ''''*$"03.'=$%.&34%'SS.4%!&-$.&GM'\ ''''''''_&/3!1b*24'`'@A@B%3&SB&30S@;kNN=,.&4-<G ''''''''''TW<!R0N>>&+!&#04.,0/4!&>&+!&T ''''''''MX ''''''''U,%O7..4$%&NN.-+,&+Y,"0+G_&/3!1b*24MX ''''] ''''*-4&+.&+2'=$%.&34%'8+&94%%+.&34%GM'\ ''''''''-+&$-%'_&/3!1b.-+,&+;+=,$0&;U94%%+.&34%G_&/3!1b*24K'TW<!R0TMX ''''] ''''*-4&+.&+2'=$%.&34%'8+&;,&,F+&GM'\ ''''''''-+&$-%'_&/3!1b.-+,&+[0,&vmi;,&,F+&GT>*,&/>&4>!++26ZW0TMX ''''] ]

slide-85
SLIDE 85

PHPUnit

=)1):),+>+,19),+

P2,&,!+&b ''P,..4$%&',..4$%&S%$W"+-`:hLpCJpDCIJpIHDJoI:'",0,%.+`:hDD6DD:'>b ''P,..4$%&',..4$%&S%$W"+-`:hLpCIJonHCDHhLDIn:'",0,%.+`:hHhI6DD:'>b ''P,..4$%&',..4$%&S%$W"+-`:hHCJoIhHCLnHCIhoL:'",0,%.+`:op6DD:'>b ''P,..4$%&',..4$%&S%$W"+-`:hLpCIJonHCDHhLDIn:'",0,%.+`:hHhI6DD:'>b P>2,&,!+&b

slide-86
SLIDE 86

PHPUnit

=)1):),+>+,19),+

PQ*/*

  • +R$3-+S4%.+'T@A@B%3&>cZ&+%!34%!>;,&,",!+>Y+!&9,!+6*/*TX

' .0,!!'U,%O7..4$%&;UY+!&'+Z&+%2!'@A@B%3&ScZ&+%!34%!S;,&,",!+SY+!&9,!+'\ ''''>>'666 ''''*$"03.'=$%.&34%'&+!&f+?7..4$%&GM'\ ''''] ]

slide-87
SLIDE 87

PHPUnit

=)1):),+>+,19),+

PQ*/*

  • +R$3-+S4%.+'T@A@B%3&>cZ&+%!34%!>;,&,",!+>Y+!&9,!+6*/*TX

' .0,!!'U,%O7..4$%&;UY+!&'+Z&+%2!'@A@B%3&ScZ&+%!34%!S;,&,",!+SY+!&9,!+'\ ''''>>'666 ''''*$"03.'=$%.&34%'&+!&f+?7..4$%&GM'\ ''''''''_",'`'%+?'U,%O7..4$%&;UGThHCJLInophHCJLInoTK'_&/3!1b*24MX ''''] ]

slide-88
SLIDE 88

PHPUnit

=)1):),+>+,19),+

PQ*/*

  • +R$3-+S4%.+'T@A@B%3&>cZ&+%!34%!>;,&,",!+>Y+!&9,!+6*/*TX

' .0,!!'U,%O7..4$%&;UY+!&'+Z&+%2!'@A@B%3&ScZ&+%!34%!S;,&,",!+SY+!&9,!+'\ ''''>>'666 ''''*$"03.'=$%.&34%'&+!&f+?7..4$%&GM'\ ''''''''_",'`'%+?'U,%O7..4$%&;UGThHCJLInophHCJLInoTK'_&/3!1b*24MX ''''''''_!+&'`'_&/3!1b.-+,&+[0,&vmi;,&,F+&G ''''''''''T>*,&/>&4>,=&+-1%+?1,..4$%&6ZW0T ''''''''MX ''''] ]

slide-89
SLIDE 89

PHPUnit

=)1):),+>+,19),+

PQ*/*

  • +R$3-+S4%.+'T@A@B%3&>cZ&+%!34%!>;,&,",!+>Y+!&9,!+6*/*TX

' .0,!!'U,%O7..4$%&;UY+!&'+Z&+%2!'@A@B%3&ScZ&+%!34%!S;,&,",!+SY+!&9,!+'\ ''''>>'666 ''''*$"03.'=$%.&34%'&+!&f+?7..4$%&GM'\ ''''''''_",'`'%+?'U,%O7..4$%&;UGThHCJLInophHCJLInoTK'_&/3!1b*24MX ''''''''_!+&'`'_&/3!1b.-+,&+[0,&vmi;,&,F+&G ''''''''''T>*,&/>&4>,=&+-1%+?1,..4$%&6ZW0T ''''''''MX ''''''''_&/3!1b,!!+-&Y,"0+!cR$,0G ''''''''''_!+&1b8+&Y,"0+GT,..4$%&TMK ''''''''''_&/3!1b8+&94%%+.&34%GM '''''''''''''''1b.-+,&+;,&,F+&GM '''''''''''''''1b8+&Y,"0+GT,..4$%&TM ''''''''MX ''''] ]

slide-90
SLIDE 90

PHPUnit

=)1):),+>+,19),+

P2,&,!+&b ''P,..4$%&',..4$%&S%$W"+-`:hLpCJpDCIJpIHDJoI:'",0,%.+`:hDD6DD:'>b ''P,..4$%&',..4$%&S%$W"+-`:hLpCIJonHCDHhLDIn:'",0,%.+`:hHhI6DD:'>b ''P,..4$%&',..4$%&S%$W"+-`:hHCJoIhHCLnHCIhoL:'",0,%.+`:op6DD:'>b ''P,..4$%&',..4$%&S%$W"+-`:hLpCIJonHCDHhLDIn:'",0,%.+`:hHhI6DD:'>b ''P,..4$%&',..4$%&S%$W"+-`:hHCJLInophHCJLIno:'",0,%.+`:D6DD:'>b P>2,&,!+&b

slide-91
SLIDE 91

PHPUnit

=)1):),+>+,19),+

X3"()&"%&'(,)454)802")&3$&)@%"%)4NK)))) &0)80(("8&)&0)$)2$&$#$%"G)'&)-$F"%)%"(%") &0)F""6)E0@+)!aR)80-6$&'#1")A'&3)!aR'&"

! V0)%"+/"+)

)V0)'(&"+>6+08"%%)80--@('8$&'0( !

! .(>T"-0+E)N$&$#$%"%)

)V0)N'%F).WK !

=%"+ !E%&"- ;4= J0&$1 4NK)W)TE!aR ?@AB, C@DE, FCG HI@CFJ, 4NK)W)!aR'&")\<'1"] B@CH, H@BF, J?G HC@?BA, 4NK)W)!aR'&")\-"-0+E] ?@HJ, C@JD, AAG ?@DFA,

slide-92
SLIDE 92

PHPUnit

Integration with Selenium RC

PQ*/*

  • +R$3-+S4%.+'T@A@B%3&>cZ&+%!34%!>F+0+%3$WY+!&9,!+6*/*TX

' .0,!!'g+"Y+!&'+Z&+%2!'@A@B%3&ScZ&+%!34%!SF+0+%3$WY+!&9,!+ \ ' ] Qb

slide-93
SLIDE 93

PHPUnit

Integration with Selenium RC

PQ*/*

  • +R$3-+S4%.+'T@A@B%3&>cZ&+%!34%!>F+0+%3$WY+!&9,!+6*/*TX

' .0,!!'g+"Y+!&'+Z&+%2!'@A@B%3&ScZ&+%!34%!SF+0+%3$WY+!&9,!+ \ ''''*-4&+.&+2'=$%.&34%'!+&B*GM ''''\ ''''''''_&/3!1b!+&U-4?!+-GTd=3-+=4ZTMX ''''''''_&/3!1b!+&U-4?!+-B-0GT/&&*N>>???6+Z,W*0+6.4W>TMX ''''''''_&/3!1b!+&F0++*GhDMX ''''] ' ] Qb

slide-94
SLIDE 94

PHPUnit

Integration with Selenium RC

PQ*/*

  • +R$3-+S4%.+'T@A@B%3&>cZ&+%!34%!>F+0+%3$WY+!&9,!+6*/*TX

' .0,!!'g+"Y+!&'+Z&+%2!'@A@B%3&ScZ&+%!34%!SF+0+%3$WY+!&9,!+ \ ''''*-4&+.&+2'=$%.&34%'!+&B*GM ''''\ ''''''''_&/3!1b!+&U-4?!+-GTd=3-+=4ZTMX ''''''''_&/3!1b!+&U-4?!+-B-0GT/&&*N>>???6+Z,W*0+6.4W>TMX ''''''''_&/3!1b!+&F0++*GhDMX ''''] ' ''''*$"03.'=$%.&34%'&+!&Y3&0+GM ''''\ ''''''''_&/3!1b4*+%GT/&&*N>>???6+Z,W*0+6.4W>TMX ''''''''_&/3!1b,!!+-&Y3&0+GTcZ,W*0+'g+"'@,8+TMX ''''] ] Qb

slide-95
SLIDE 95

! " # $ % & ' (& ) # *

slide-96
SLIDE 96

')/#0)#/+#1+2.3(+ 4)5-/2(+#!326$-78

slide-97
SLIDE 97

Software Metrics

! L)%0<&A$+")-"&+'8)'%)$)-"$%@+")0<)%0-")

6+06"+&E)0<)$)6'"8")0<)%0<&A$+")0+)'&%) %6"8'<'8$&'0(%B))))))

! bQ0@)8$((0&)80(&+01)A3$&)E0@)8$((0&)

  • "$%@+"Bc)\J0-)N"T$+80]
slide-98
SLIDE 98

Software Metrics

! X3'83)%&$&"-"(&%G)#+$(83"%G)$(2)6$&3%)

$+")"I"8@&"2)A3"()&3")&"%&%)+@(Y

! ;:>;0/"+$,"U)!&$&"-"(&);0/"+$," ! ;[>;0/"+$,"U)*+$(83);0/"+$," ! ;">;0/"+$,"U)4$&3);0/"+$,"))))))))))))))))))))))))))))

))

! [::d);02");0/"+$,")'%)$)+"^@'+"2G)#@&)

(0&)$)%@<<'8'"(&)8+'&"+'$)<0+)&"%&) 80-61"&"("%%

Code Coverage

slide-99
SLIDE 99

Software Metrics

! J"I&>#$%"2)-"&+'8)<0+)802")%'e" ! _$+'0@%)2"<'('&'0(%

! R'("%)0<);02")\RK;] ! ;0--"(&)R'("%)0<);02")\;RK;] ! V0(>;0--"(&)R'("%)0<);02")\V;RK;] ! SI"8@&$#1")R'("%)0<);02")\SRK;]))))))))))))))))))))))

))))

! O$&'0%)8$()#")'(&"+"%&'(,

! ;RK;)W)\S]RK;

Lines of Code

slide-100
SLIDE 100

Software Metrics

Lines of Code

!"#$"$%&$'(')'*+,-'3%!&,00'*/*$%3&>*/*04. 24?%04,23%8'*/*04.1h6h6h6&8E'666 F&,-&3%8'&4'24?%04,2'*/*04.1h6h6h6&8E'GIKIhI'"<&+!M 6666624%+N'IKIhI'"<&+! 3%!&,00'4ON'./,%%+0N>>*+,-6*/*$%3&62+>*/*04.1h6h6h !"#$"$%&$'(')'*/*04.'>$!->04.,0>!-.>+E.4W*4%+%&!>&-$%O>g4-O=04? */*04.'h6h6h'"<'F+",!&3,%'U+-8W,%%6 ;3-+.&4-3+!N'''''''''''''''''''''''''''''''hC [30+!N''''''''''''''''''''''''''''''''''''hDH i3%+!'4='942+'Gik9MN''''''''''''''''''''hJhCo cZ+.$&,"0+'i3%+!'4='942+'Gcik9MN'''''''''LoCh 94WW+%&'i3%+!'4='942+'G9ik9MN''''''''''''LHJJ f4%194WW+%&'i3%+!'4='942+'Gf9ik9MN'''''''oopJ ^%&+-=,.+!N'''''''''''''''''''''''''''''''''n 90,!!+!N'''''''''''''''''''''''''''''''''''pD f4%1F&,&3.'m+&/42!N'''''''''''''''''''''''LCI F&,&3.'m+&/42!N''''''''''''''''''''''''''''CC [$%.&34%!N''''''''''''''''''''''''''''''''''D

slide-101
SLIDE 101

Software Metrics

! JA0)%"^@"(8"%)0<)802")$+")2@61'8$&")

A3"()&3"E)$+"

! &"I&@$11E)'2"(&'8$1 ! &0F"()<0+)&0F"()'2"(&'8$1 ! <@(8&'0($11E)'2"(&'8$1

! 4+0#1"-%

! N@61'8$&")802")80(&+$2'8&%)802")+"@%" ! ;0>S/01@&'0()0<)810("%)3'(2"+%)-$'(&"($(8"

Code Duplication

slide-102
SLIDE 102

Software Metrics

Code Duplication

!"#$"$%&$'(')'*+,-'3%!&,00'*/*$%3&>*/*.*2 24?%04,23%8'*/*.*21h6h6D6&8E'666 F&,-&3%8'&4'24?%04,2'*/*.*21h6h6D6&8E'GoKHHI'"<&+!M 6666624%+N'oKHHI'"<&+! 3%!&,00'4ON'./,%%+0N>>*+,-6*/*$%3&62+>*/*.*21h6h6D !"#$"$%&$'(')'*/*.*2'>$!->04.,0>!-.>*/*$%3&>&-$%O>@A@B%3& */*.*2'h6h6D'"<'F+",!&3,%'U+-8W,%%6 [4$%2'J'+Z,.&'.04%+!'?3&/'hCh'2$*03.,&+2'03%+!'3%'n'=30+!N ''1'cZ&+%!34%!>;,&,",!+>;,&,F+&>7"!&-,.&Y,"0+6*/*NhLI1hpD ''''cZ&+%!34%!>;,&,",!+>;,&,F+&>e+*0,.+W+%&Y,"0+6*/*NhnH1HDI ''1'F,W*0+!>U,%O7..4$%&;U>U,%O7..4$%&;UY+!&6*/*NoJ1hHo ''''F,W*0+!>U,%O7..4$%&;U>U,%O7..4$%&;UY+!&m<Fwi6*/*NoJ1hHo ''1'Y+!&!>cZ&+%!34%!>;,&,",!+>;,&,F+&>vW0;,&,F+&!Y+!&6*/*Nnh1po ''''Y+!&!>cZ&+%!34%!>;,&,",!+>;,&,F+&>u,W0;,&,F+&Y+!&6*/*NnD1pn ''1'Y+!&!>cZ&+%!34%!>;,&,",!+>;,&,F+&>vW0;,&,F+&!Y+!&6*/*Nnh1pn ''''Y+!&!>cZ&+%!34%!>;,&,",!+>;,&,F+&>9!5;,&,F+&Y+!&6*/*NnD1pI D6Hh)'2$*03.,&+2'03%+!'4$&'4='IhnHD'&4&,0'03%+!'4='.42+6

slide-103
SLIDE 103

Software Metrics

! T"$%@+"%)&3")80-61"I'&E)0<)$)802")@('& ! K+','($11E)2"<'("2)'(),+$63)&3"0+E

  • -&/(0KLKMN'+,KOK7+.1%-+,KPKI

! S^@'/$1"(&U);0@(&'(,)&3")#+$(83'(,)60'(&%

%QG)Q".G)Q".+)-RG)#R%$+G)-),+G)-)1-RG)SSG)TTG) &"+($+E)06"+$&0+)\UV]

! .(&"+6+"&$&'0( ! 5',3"+)80-61"I'&E)1"$2%)&0)-0+")"++0+% ! 5',3"+)80-61"I'&E)-$F"%)&"%&'(,)3$+2"+

Cyclomatic Complexity

slide-104
SLIDE 104

Software Metrics

Cyclomatic Complexity

PQ*/* =$%.&34%'3!i+,*u+,-G_<+,-M \ ''''_-+!$0&'`'=,0!+X ''''3='G_<+,-')'''J'j`'DM'\ ''''''''_-+!$0&'`'=,0!+X ''''] ''''3='G_<+,-')'hDD'j`'DM'\ ''''''''_-+!$0&'`'&-$+X ''''] ''''3='G_<+,-')'JDD'``'DM'\ ''''''''_-+!$0&'`'&-$+X ''''] ''''-+&$-%'_-+!$0&X ] H I ? F

slide-105
SLIDE 105

Software Metrics

PHP_Depend

! !&$&'8)L($1E%'%)0<)454);02"

! !0<&A$+")T"&+'8% ! !0<&A$+")_'%@$1'e$&'0())))))))))))))))))))))))))))))))))))))

)))))))))))))))))))))))))))))))))))))))

! 5"16%)&0)'2"(&'<E)6$+&%)0<)$()$661'8$&'0()

&3$&)%30@12)#")+"<$8&0+"2

!"#$"$%&$'(')'*+,-'./,%%+0123!.45+-'*+,-6*2+*+%264-8 7223%8'9/,%%+0':*+,-6*2+*+%264-8:'!$..++2+2 ;3!.45+-<'4='./,%%+0':*+,-6*2+*+%264-8:'!$..++2+2 !"#$"$%&$'(')'*+,-'3%!&,00'*2+*+%2>@A@S;+*+%2 24?%04,23%8'@A@S;+*+%21D6p6J6&8E'666 F&,-&3%8'&4'24?%04,2'@A@S;+*+%21D6p6J6&8E'GhIhKLLC'"<&+!M 666666666666666666666666666666666624%+N'hIhKLLC'"<&+! 3%!&,00'4ON'./,%%+0N>>*+,-6*2+*+%264-8>@A@S;+*+%21D6p6J

slide-106
SLIDE 106

Software Metrics

3R3*N

! !&$&'8)L($1E%'%)0<)454);02"

! *$%"2)0()454fN"6"(2))))))))))))))))))))))))))))))))))))))

))))))))))))))

! O"60+&%)/'01$&'0(%)0<)+@1"%)&3$&)06"+$&")0()

+$A)%0<&A$+")-"&+'8%)2$&$

slide-107
SLIDE 107

Software Analysis

PHP_CodeSniffer

! !&$&'8)L($1E%'%)0<)454);02"

! *$%"2)0()+W1X1";+&%Y+.

! C!('<<%C

! ;02'(,)!&$(2$+2 ! !0<&A$+")T"&+'8% ! *@,)4$&&"+(% ! 4"+<0+-$(8")4$&&"+(% ! BBB

slide-108
SLIDE 108

Software Analysis

bytekit-cli

! !&$&'8)L($1E%'%)0<)454);02"

! *$%"2)0()+W1X:51+;%1

! N'%$%%"-#1"%)454)#E&"802" ! _'%@$1'e"%)454)#E&"802" ! !8$(%)454)#E&"802"

! g)<0+)2'%$110A"2)06802")%"^@"(8"% ! g)<0+)2'+"8&)0@&6@&)0<)/$+'$#1"% ! g

slide-109
SLIDE 109

QA Tools for PHP

! 3R36&%1

" h=('&)`TR)$(2);10/"+)`TR

! 3R3-,

" ;3"8F%&E1")`TR

! 3N+3+&N

" hN"6"(2)`TR

! :51+;%1

" 4TN)`TR

! 3R3*N

" 4TN)`TR

! 3R3-3N

" 4TN>;4N)`TR

slide-110
SLIDE 110

Build Automation

! h$/$>#$%"2)#@'12)&001 ! i'(2)0<)1'F")8&9(G)A'&30@&)8&9(:4)

A+'(F1"%

! *@'12)<'1"%)$+")`TR>#$%"2G)8$11'(,)0@&)$)

&$+,"&)&+"")A3"+")/$+'0@%)&$%F%),"&) "I"8@&"2

Apache Ant

slide-111
SLIDE 111

Build Automation

Apache Ant

P*-4t+.&'%,W+`:m4%+<:'2+=,$0&`:"$302:b 'P&,-8+&'%,W+`:.0+,%:b ''P2+0+&+'23-`:_\",!+23-]>"$302:>b 'P>&,-8+&b 'P&,-8+&'%,W+`:*-+*,-+:b ''PWO23-'23-`:_\",!+23-]>"$302>048!:>b 'P>&,-8+&b 'P&,-8+&'%,W+`:*/*.!:b ''P+Z+.'23-`:_\",!+23-]:'+Z+.$&,"0+`:*/*.!: ''''''''4$&*$&`:_\",!+23-]>"$302>048!>./+.O!&<0+6ZW0:'=,304%+--4-`:=,0!+:b '''P,-8'03%+`:11-+*4-&`./+.O!&<0+'6:>b ''P>+Z+.b 'P>&,-8+&b 'P&,-8+&'%,W+`:*/*W2:b ''P+Z+.'23-`:_\",!+23-]:'+Z+.$&,"0+`:*/*W2:'=,304%+--4-`:=,0!+:b '''P,-8'03%+`:6'ZW0'.42+!3E+'11-+*4-&=30+'_\",!+23-]>"$302>048!>*W26ZW0:>b ''P>+Z+.b 'P>&,-8+&b

slide-112
SLIDE 112

Build Automation

Apache Ant

P&,-8+&'%,W+`:*/*.*2:b ''P+Z+.'23-`:_\",!+23-]:'+Z+.$&,"0+`:*/*.*2:'=,304%+--4-`:=,0!+:b '''P,-8'03%+`:110481*W2`_\",!+23-]>"$302>048!>*W21.*26ZW0'6:>b ''P>+Z+.b 'P>&,-8+&b 'P&,-8+&'%,W+`:*2+*+%2:b ''P+Z+.'23-`:_\",!+23-]:'+Z+.$&,"0+`:*2+*+%2:'=,304%+--4-`:=,0!+:b '''P,-8'03%+`:11t2+*+%21ZW0`_\",!+23-]>"$302>048!>t2+*+%26ZW0'6:>b ''P>+Z+.b 'P>&,-8+&b 'P&,-8+&'%,W+`:*/*$%3&:b ''P+Z+.'23-`:_\",!+23-]:'+Z+.$&,"0+`:*/*$%3&:'=,304%+--4-`:&-$+:b '''P,-8'03%+`:110481ZW0'''''''''_\",!+23-]>"$302>048!>t$%3&6ZW0 ''''''''''''''11.45+-,8+1.045+-'_\",!+23-]>"$302>048!>.045+-6ZW0 ''''''''''''''m4%+<Y+!&:>b ''P>+Z+.b 'P>&,-8+&b 'P&,-8+&'%,W+`:"$302: '''''''''2+*+%2!`:.0+,%K*-+*,-+K*/*.!K*/*W2K*/*.*2K*2+*+%2K*/*$%3&:>b P>*-4t+.&b

slide-113
SLIDE 113

Build Automation

Apache Ant

!"#$"$%&$'m4%+<')',%& U$302=30+N'"$3026ZW0 .0+,%N '''q2+0+&+r';+0+&3%8'23-+.&4-<'>/4W+>!">m4%+<>"$302 *-+*,-+N ''''qWO23-r'9-+,&+2'23-N'>/4W+>!">m4%+<>"$302>048! */*.!N */*W2N */*.*2N '''''q+Z+.r'*/*.*2'h6h6D'"<'F+",!&3,%'U+-8W,%%6 '''''q+Z+.r' '''''q+Z+.r'D6DD)'2$*03.,&+2'03%+!'4$&'4='nHH'&4&,0'03%+!'4='.42+6 *2+*+%2N '''''q+Z+.r'@A@S;+*+%2'D6p6J'"<'m,%$+0'@3./0+- '''''q+Z+.r' '''''q+Z+.r'cZ+.$&3%8';+*+%2+%.<17%,0<E+-N '''''q+Z+.r'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''hI '''''q+Z+.r' '''''q+Z+.r'V+%+-,&3%8'*2+*+%2'048'=30+!K'&/3!'W,<'&,O+','W4W+%&6 */*$%3&N '''''q+Z+.r'@A@B%3&'C6J6D'"<'F+",!&3,%'U+-8W,%%6 '''''q+Z+.r' '''''q+Z+.r'6666666666666666666666 '''''q+Z+.r' '''''q+Z+.r'Y3W+N'D'!+.4%2! '''''q+Z+.r' '''''q+Z+.r'kl'GHH'&+!&!K'CJ',!!+-&34%!M '''''q+Z+.r' '''''q+Z+.r'g-3&3%8'.42+'.45+-,8+'2,&,'&4'vmi'=30+K'&/3!'W,<'&,O+','W4W+%&6 "$302N UB^i;'FB99cFF[Bi Y4&,0'&3W+N'J'!+.4%2!

slide-114
SLIDE 114

Continuous Integration

!0<&A$+")2"/"106-"(&)6+$8&'8")A3"+")-"-#"+%) 0<)$)&"$-)'(&",+$&")&3"'+)A0+F)<+"^@"(&1E

! =%@$11E)"$83)6"+%0()'(&",+$&"%)$&)1"$%&)2$'1EG)

1"$2'(,)&0)-@1&'61")'(&",+$&'0(%)6"+)2$E

! S$83)'(&",+$&'0()'%)/"+'<'"2)#E)$()$@&0-$&"2)

#@'12)\'(81@2'(,)&"%&])&0)2"&"8&)'(&",+$&'0() "++0+%)$%)^@'8F1E)$%)60%%'#1"

! R"$2%)&0)%',('<'8$(&1E)+"2@8"2)'(&",+$&'0()

6+0#1"-%)$(2)$110A%)$)&"$-)&0)2"/"106) 803"%'/")%0<&A$+")-0+")+$6'21E

slide-115
SLIDE 115

Continuous Integration

?+$-"A0+F)<0+)$)80(&'(@0@%)#@'12)6+08"%%

! .(81@2"%G)#@&)'%)(0&)1'-'&"2)&0G)61@,'(%)

<0+)"-$'1)(0&'<'8$&'0(G)L6$83")L(&G) 43'(,G)$(2)/$+'0@%)%0@+8")80(&+01)&001%

! L)A"#)'(&"+<$8")'%)6+0/'2"2)&0)/'"A)&3")

2"&$'1%)0<)&3")8@++"(&)$(2)6+"/'0@%) #@'12%

CruiseControl

slide-116
SLIDE 116

Continuous Integration

;@%&0-'e$&'0()0<);+@'%";0(&+01)&3$&) 8$&"+%)&0)&3")(""2%)0<)454)6+07"8&%

! 454=('& ! 454N08@-"(&0+ ! 454f;02"!('<<"+ ! \454fN"6"(2] ! \3R3*N] ! \3R3-3N]

phpUnderControl

slide-117
SLIDE 117

! " # $ % & ' (& ) # *

slide-118
SLIDE 118

The End

J3$(F)E0@)<0+)E0@+)'(&"+"%&Z J3"%")%1'2"%)A'11)#")60%&"2)0( 3&&6UWW%1'2"%3$+"B("&W%"#$%&'$(f#"+,-$((

slide-119
SLIDE 119

9%-+.-2:6+#;)0+

!"#$%&'$()*"+,-$(( .&&/011&."232455

;;0>?$-)@()6789):>+

A):<<=

B""&'(,)C@@-)6:

slide-120
SLIDE 120

License

#

J3'%)6+"%"(&$&'0()-$&"+'$1)'%)6@#1'%3"2)@(2"+)&3")L&&+'#@&'0(>!3$+")L1'F")jB:)=(60+&"2) 1'8"(%"B

#

Q0@)$+")<+""U

# ,)#0.'$")k)&0)806EG)2'%&+'#@&")$(2)&+$(%-'&)&3")A0+FB # ,)#="*/>)k)&0)$2$6&)&3")A0+FB #

=(2"+)&3")<0110A'(,)80(2'&'0(%U

$ ?,,$/@9,/)+<)Q0@)-@%&)$&&+'#@&")&3")A0+F)'()&3")-$(("+)%6"8'<'"2)#E)&3")$@&30+)0+)

1'8"(%0+)\#@&)(0&)'()$(E)A$E)&3$&)%@,,"%&%)&3$&)&3"E)"(20+%")E0@)0+)E0@+)@%")0<)&3") A0+F]B

$ 0.'$"#?&/A"<).<)E0@)$1&"+G)&+$(%<0+-G)0+)#@'12)@60()&3'%)A0+FG)E0@)-$E)2'%&+'#@&")&3")

+"%@1&'(,)A0+F)0(1E)@(2"+)&3")%$-"G)%'-'1$+)0+)$)80-6$&'#1")1'8"(%"B

#

?0+)$(E)+"@%")0+)2'%&+'#@&'0(G)E0@)-@%&)-$F")81"$+)&0)0&3"+%)&3")1'8"(%")&"+-%)0<)&3'%) A0+FB

#

L(E)0<)&3")$#0/")80(2'&'0(%)8$()#")A$'/"2)'<)E0@),"&)6"+-'%%'0()<+0-)&3")806E+',3&) 3012"+B

#

V0&3'(,)'()&3'%)1'8"(%")'-6$'+%)0+)+"%&+'8&%)&3")$@&30+H%)-0+$1)+',3&%B