!"#$%#&'&#&()*+,-.
!"#$%&'$()*"+,-$(( .&&/011&."232455
6789):;%
&):<<=
!"#$%#&'&#&()*+,-. !"#$%&'$()*"+,-$(( - - PowerPoint PPT Presentation
!"#$%#&'&#&()*+,-. !"#$%&'$()*"+,-$(( .&&/011&."232455 6789):; % & ):<<= Who I am ! !"#$%&'$()*"+,-$(( ! .(/01/"2)'()&3")454) 6+07"8&)%'(8")9:::
!"#$%&'$()*"+,-$(( .&&/011&."232455
6789):;%
&):<<=
! !"#$%&'$()*"+,-$(( ! .(/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
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
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
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
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
! !&$&'8)L($1E%'%)0<)5JTR)20"%)(0&)A0+F ! .(%&"$2U)J"%&)A"#)$661'8$&'0(%)'()&3")
#+0A%"+
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
! 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
! !"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
! 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
Selenium RC
! ;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
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
! N0"%)-E)802")A0+FY
! *")80(<'2"(&)'()E0@+)802"Z
! N0)(0&)#")$<+$'2)0<)83$(,'(,)E0@+)802"Z
! X+'&")$)&"%&)6+0,+$- ! O@()&3")&"%&)6+0,+$- ! T$(@$11E)/"+'<E)&3")0@&6@& ! N"1"&")&3")&"%&)6+0,+$-
Classic Approach
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
=('&)J"%&%)'-6+0/")&3")80(<'2"(8")'()E0@+)802") $%)&3"E)2"&"8&)6+0#1"-%)$%)"$+1E)$%)60%%'#1"
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
!
[:)<+$-"%
!
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)<+$-"
The first test
PQ*/*
.0,!!'U4?03%8V,W+Y+!&'+Z&+%2!'@A@B%3&S[-,W+?4-OSY+!&9,!+ \ ]
The first test
PQ*/*
.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 ''''\ ''''] ]
The first test
PQ*/*
.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 ''''] ]
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
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
The !"#$%&'()*+ class
PQ*/* .0,!!'U4?03%8V,W+ \ ''''*$"03.'=$%.&34%'-400G_*3%!M ''''\ ''''] ''''*$"03.'=$%.&34%'!.4-+GM ''''\ ''''''''-+&$-%'DX ''''] ]
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
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
! 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
! 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
J3'%)%1'2")80(&$'(%)-$&"+'$1)#E)L1#"+&0)!$/0'$
J3'%)%1'2")80(&$'(%)-$&"+'$1)#E)L1#"+&0)!$/0'$
The second test
PQ*/*
.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 ''''] ]
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
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
Leveraging the ,+123/0 template method
PQ*/*
.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 ]
Introducing the ."$$4)&5/0 template method
PQ*/*
.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 ''''] ]
The third test
PQ*/*
.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 ''''] ]
The fourth test
PQ*/*
.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 ''''] ]
The fifth test
PQ*/*
.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 ''''] ]
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
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
The !"#$%&'()*+ class
PQ*/* .0,!!'U4?03%8V,W+ \ ''''*-4&+.&+2'_-400!'`',--,<GMX ''''*$"03.'=$%.&34%'-400G_*3%!M ''''\ ''''''''_&/3!1b-400!qr'`'_*3%!X ''''] ''''>>'666 ]
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 ''''] ]
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 ''''] ]
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 ''''] ]
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
! !-$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
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
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
! !"#$%&'$#($)(*+,-$."/+%$+'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/:'&"+,;<
!
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)
!
T08F !6E)A'&3)"I6"8&$&'0(%
Terminology
Stubbing a method with PHPUnit
PQ*/* .0,!!'F&$"Y+!&'+Z&+%2!'@A@B%3&S[-,W+?4-OSY+!&9,!+ \ ''''*$"03.'=$%.&34%'&+!&F&$"GM ''''\ ''''''''''''''''''''''''''''''''''''''''''''''' ''''''''''''''''''''''''''''''''''''' '''''''''''''''''''''''''''''''''''''' '''''''''''''''''''''''''''''''''''''''''''''''' ' ''''''''''''''''''''''''''''''''''''''''''''''''''''''' '''''''''''''''''' ''''] ] Qb
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
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
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
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 ''''] ]
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 ]
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% ''''] ]
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
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
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
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
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
Mocking the filesystem with vfsStream
PQ*/*
.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
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 ''''] ]
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
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 ''''] ' ' ' ]
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 ''''] ' ]
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 ''''] ]
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 ''''\ ''''] ]
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
=)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$&$%"&%
=)1):),+>+,19),+
PQ*/*
' .0,!!'U,%O7..4$%&;UY+!&'+Z&+%2!'@A@B%3&ScZ&+%!34%!S;,&,",!+SY+!&9,!+'\ ]
=)1):),+>+,19),+
PQ*/*
' .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>>&+!.,0/4!&>&+!&T ''''''''MX ''''''''U,%O7..4$%&NN.-+,&+Y,"0+G_&/3!1b*24MX ''''] ]
=)1):),+>+,19),+
PQ*/*
' .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>>&+!.,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 ''''] ]
=)1):),+>+,19),+
PQ*/*
' .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>>&+!.,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+>>*,&/>&4>!++26ZW0TMX ''''] ]
=)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
=)1):),+>+,19),+
PQ*/*
' .0,!!'U,%O7..4$%&;UY+!&'+Z&+%2!'@A@B%3&ScZ&+%!34%!S;,&,",!+SY+!&9,!+'\ ''''>>'666 ''''*$"03.'=$%.&34%'&+!&f+?7..4$%&GM'\ ''''] ]
=)1):),+>+,19),+
PQ*/*
' .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 ''''] ]
=)1):),+>+,19),+
PQ*/*
' .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 ''''] ]
=)1):),+>+,19),+
PQ*/*
' .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 ''''] ]
=)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
=)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,
Integration with Selenium RC
PQ*/*
' .0,!!'g+"Y+!&'+Z&+%2!'@A@B%3&ScZ&+%!34%!SF+0+%3$WY+!&9,!+ \ ' ] Qb
Integration with Selenium RC
PQ*/*
' .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
Integration with Selenium RC
PQ*/*
' .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
! 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&)
! 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
! 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
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
! 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
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
! T"$%@+"%)&3")80-61"I'&E)0<)$)802")@('& ! K+','($11E)2"<'("2)'(),+$63)&3"0+E
! 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
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
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
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$&$
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
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
! 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
! 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
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
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
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!
!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
?+$-"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
;@%&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
J3$(F)E0@)<0+)E0@+)'(&"+"%&Z J3"%")%1'2"%)A'11)#")60%&"2)0( 3&&6UWW%1'2"%3$+"B("&W%"#$%&'$(f#"+,-$((
!"#$%&'$()*"+,-$(( .&&/011&."232455
;;0>?$-)@()6789):>+
A):<<=
B""&'(,)C@@-)6:
#
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