LOGO “ Add your company slogan ” Keep it Simple Stupid Presentation by: Thu.Nguyen
CONTENT KiSS Concept Q&A Demo PHPUnit Unit Testing Software Testing
KiSS Concept
What is Software Testing?  Testing is the process of executing a program with intent of finding errors (The art of software testing – Glenford J.Myers) 4 Our program The output is correct? I1, I2, I3, …, In, … Expected results = ? Obtained results “Inputs” - No code inspection - No code analysis - No model checking - No bug fixing - No debugging
Level of testing KiSS Concept Unit Testing Integration Testing Functional Testing System Testing Load/Stress Testing User Accepted Testing Regression Testing Programmer Tester
Testing Techniques Functional Testing (Black box)  Select test cases based on the requirement or design specification  Emphasize on the external behavior of software Structural Testing (White box)  Select test cases based on the implement of software  Emphasize on the internal structure of software KiSS Concept
Black box vs White box KiSS Concept
Process of testing KiSS Concept Test cases Design test cases Prepare test data Run program with test data Test data Test results Test reports Compare results to test cases
KiSS Concept
What is unit testing? KiSS Concept  “In computer programming, unit testing is a method by which individual units of source code are tested to determine if they are fit for use. A unit is the smallest testable part of an application.” (Wikipedia)  A “unit ” is the smallest testable part of an application: a function or class method.
Benefit of unit testing  Easy to defect error KiSS Concept
Benefit of unit testing  Safer refactoring KiSS Concept
Benefit of unit testing  Automated test KiSS Concept
Benefit of unit testing  Long term of saving time and money KiSS Concept
When do you write the test?  Focus on requirements  Thinking about how to code will be consumed  Stop coding when meet requirement  Harder initially  Focus on code  Thinking about algorithm  More refactoring  Easier initially KiSS Concept Before coding(TDD) After/During coding
How do I test?  Isolate with the code being tested  Short, simple, fast, readable  No conditional logic or loop (if, switch, while)  One test should be one behavior KiSS Concept
KiSS Concept
Introduction KiSS Concept  Is a unit testing framework written in PHP, created by Sebastian Bergmann.  Part of the xUnit family of testing frameworks.  Integrated/supported • Zend Studio • Zend Framework • Symfony • Doctrine
Installation KiSS Concept Install with PEAR: pear channel-discover pear.phpunit.de pear install phpunit/PHPUnit Update: pear upgrade phpunit/PHPUnit Xdebug: sudo apt-get install php5-xdebug php5-dev Set include path in /etc/php5/cli/php.ini include_path = “.:/usr/share/php”
Definitions KiSS Concept Test suite Test suite Test case setUp() testMethod tearDown() /* * *@annotation */ testMethod(){ assertion } Report Test case setUp() testMethod tearDown() /* * *@annotation */ testMethod(){ assertion } Code coverage Logging
Simple test KiSS Concept
Running test KiSS Concept Go to command line and run: phpunit /path/to/file/test.php or phpunit classname /path/to/file/test.php
Running test  Command line  IDE  Zend Studio  NetBean  Continuous Integration  phpUnderControl  Cruise Control KiSS Concept
Result  OK: all tests are successful  FAILURES: test is fail or error  Result of each test: • . test succeeds • F an assertion fails • E an error • S test has been skipped • I test is marked as being incomplete or not yet implement KiSS Concept
Features  @dataProvider  @exception  Fixture: setUp() and tearDown()  Double: stub and mock object  Database  Code coverage KiSS Concept
Data provider  Is a method that returns an array of values to use in a test.  Makes tests shorter and more concise.  Data provider can use array or file csv. KiSS Concept
Data provider KiSS Concept Input 1 myfunction() Report 1Result 1 Expected 1 compare Input 2 myfunction() Report 2Result 2 Expected 2 compare Input 3 myfunction() Report 3Result 3 Expected 3 compare
Data provider KiSS Concept /* * @dataProvider */ testMethod($input, $expect) { myfunction() } Report 1 Data Providers Input 1 expect1 Input 2 expect 2 Input 3 expect 3 Report 2 Report 3
Use array KiSS Concept
Use csv file KiSS Concept
Exception  Test exception are thrown.  Test expected messages of exception are thrown. KiSS Concept
Example exception KiSS Concept
Fixtures  Is constructor method and destructor method in test case  PHPUnit supports 2 methods: • setUp(): the function run when test methods start to run • tearDown(): the function run after test methods end KiSS Concept
Fixtures KiSS Concept Start setUp() testOne() testTwo() testThree() tearDown() End
KiSS Concept Example fixtures
Test double KiSS Concept MyClass myMethod($object) { …$object->otherMethod(); … } Database Connection File system Web service Function depends on other objects, other components
KiSS Concept MyClass myMethod() { …other Method … } Database File system Web service MyClassTest testMyMethod() { … … } Test double How to isolate environment ?
Test double KiSS Concept MyClass myMethod() { …other Method … } Database Mock File system Mock Web service Mock MyClassTest testMyMethod() { … … } Set mocks Solution: use copy object Test double return fixed value
Stub and Mock  Set method return values  Test state  Check method calls  Check arguments used  Test interactions KiSS Concept Stub Mock
Example stub object KiSS Concept
Example mock object KiSS Concept
Database testing  Set up database connection.  Set up initial dataset.  Provide methods to get dataset from database.  Provide methods to compare two datasets.  Type of dataset  Flat XML  XML  CSV  MySQL dump KiSS Concept
Organizing  Allow to organize tests to test suite to run one time  Use file system:  All test files end with „Test‟.  Organize directory structure.  Use configuration file: phpunit.xml KiSS Concept
Use file system KiSS Concept
Use phpunit.xml KiSS Concept
Code Coverage KiSS Concept  Help to see what are executed when the tests are run.  Help to find code that is not yet tested.  Help to measure testing completeness.
Code Coverage KiSS Concept
Code Coverage KiSS Concept Red: code is not executedGreen: code is executed Test cases cover this line code Grey: dead code Note: dead code is source code which is executed but whose result is never used.
Logging Test results HTML  <log type="testdox-html" target="./log/testdox.html" /> KiSS Concept
Logging Test result XML  <log type="junit" target="./log/logfile.xml" /> KiSS Concept
KiSS Concept
References  PHPUnit manual  Training course PHPUnit – Nick Belhome,2010  Unit Testing with PHPUnit – Michelangelo van Dam  Ini2it Unit Testing after ZF 1.8 - Michelangelo van Dam  PHPUnit From Zero To Hero – Jeremy Cook  PHPUnit & Continous Intergration – AlexMace  Advanced PHPUnit Testing – Mike Lively  Practical PHP Testing Patterns  http://framework.zend.com/manual/1.12/ru/zend.test.phpunit.db.html KiSS Concept
QUESTION & ANSWEAR KiSS Concept
LOGO “ Add your company slogan ” Keep it Simple Stupid

PHPUnit - Unit testing

  • 1.
    LOGO “ Add yourcompany slogan ” Keep it Simple Stupid Presentation by: Thu.Nguyen
  • 2.
  • 3.
  • 4.
    What is SoftwareTesting?  Testing is the process of executing a program with intent of finding errors (The art of software testing – Glenford J.Myers) 4 Our program The output is correct? I1, I2, I3, …, In, … Expected results = ? Obtained results “Inputs” - No code inspection - No code analysis - No model checking - No bug fixing - No debugging
  • 5.
    Level of testing KiSSConcept Unit Testing Integration Testing Functional Testing System Testing Load/Stress Testing User Accepted Testing Regression Testing Programmer Tester
  • 6.
    Testing Techniques Functional Testing (Blackbox)  Select test cases based on the requirement or design specification  Emphasize on the external behavior of software Structural Testing (White box)  Select test cases based on the implement of software  Emphasize on the internal structure of software KiSS Concept
  • 7.
    Black box vsWhite box KiSS Concept
  • 8.
    Process of testing KiSSConcept Test cases Design test cases Prepare test data Run program with test data Test data Test results Test reports Compare results to test cases
  • 9.
  • 10.
    What is unittesting? KiSS Concept  “In computer programming, unit testing is a method by which individual units of source code are tested to determine if they are fit for use. A unit is the smallest testable part of an application.” (Wikipedia)  A “unit ” is the smallest testable part of an application: a function or class method.
  • 11.
    Benefit of unittesting  Easy to defect error KiSS Concept
  • 12.
    Benefit of unittesting  Safer refactoring KiSS Concept
  • 13.
    Benefit of unittesting  Automated test KiSS Concept
  • 14.
    Benefit of unittesting  Long term of saving time and money KiSS Concept
  • 15.
    When do youwrite the test?  Focus on requirements  Thinking about how to code will be consumed  Stop coding when meet requirement  Harder initially  Focus on code  Thinking about algorithm  More refactoring  Easier initially KiSS Concept Before coding(TDD) After/During coding
  • 16.
    How do Itest?  Isolate with the code being tested  Short, simple, fast, readable  No conditional logic or loop (if, switch, while)  One test should be one behavior KiSS Concept
  • 17.
  • 18.
    Introduction KiSS Concept  Isa unit testing framework written in PHP, created by Sebastian Bergmann.  Part of the xUnit family of testing frameworks.  Integrated/supported • Zend Studio • Zend Framework • Symfony • Doctrine
  • 19.
    Installation KiSS Concept Install withPEAR: pear channel-discover pear.phpunit.de pear install phpunit/PHPUnit Update: pear upgrade phpunit/PHPUnit Xdebug: sudo apt-get install php5-xdebug php5-dev Set include path in /etc/php5/cli/php.ini include_path = “.:/usr/share/php”
  • 20.
    Definitions KiSS Concept Test suite Testsuite Test case setUp() testMethod tearDown() /* * *@annotation */ testMethod(){ assertion } Report Test case setUp() testMethod tearDown() /* * *@annotation */ testMethod(){ assertion } Code coverage Logging
  • 21.
  • 22.
    Running test KiSS Concept Goto command line and run: phpunit /path/to/file/test.php or phpunit classname /path/to/file/test.php
  • 23.
    Running test  Commandline  IDE  Zend Studio  NetBean  Continuous Integration  phpUnderControl  Cruise Control KiSS Concept
  • 24.
    Result  OK: alltests are successful  FAILURES: test is fail or error  Result of each test: • . test succeeds • F an assertion fails • E an error • S test has been skipped • I test is marked as being incomplete or not yet implement KiSS Concept
  • 25.
    Features  @dataProvider  @exception Fixture: setUp() and tearDown()  Double: stub and mock object  Database  Code coverage KiSS Concept
  • 26.
    Data provider  Isa method that returns an array of values to use in a test.  Makes tests shorter and more concise.  Data provider can use array or file csv. KiSS Concept
  • 27.
    Data provider KiSS Concept Input1 myfunction() Report 1Result 1 Expected 1 compare Input 2 myfunction() Report 2Result 2 Expected 2 compare Input 3 myfunction() Report 3Result 3 Expected 3 compare
  • 28.
    Data provider KiSS Concept /* *@dataProvider */ testMethod($input, $expect) { myfunction() } Report 1 Data Providers Input 1 expect1 Input 2 expect 2 Input 3 expect 3 Report 2 Report 3
  • 29.
  • 30.
  • 31.
    Exception  Test exceptionare thrown.  Test expected messages of exception are thrown. KiSS Concept
  • 32.
  • 33.
    Fixtures  Is constructormethod and destructor method in test case  PHPUnit supports 2 methods: • setUp(): the function run when test methods start to run • tearDown(): the function run after test methods end KiSS Concept
  • 34.
  • 35.
  • 36.
  • 37.
    KiSS Concept MyClass myMethod() { …other Method … } Database Filesystem Web service MyClassTest testMyMethod() { … … } Test double How to isolate environment ?
  • 38.
    Test double KiSS Concept MyClass myMethod() { …otherMethod … } Database Mock File system Mock Web service Mock MyClassTest testMyMethod() { … … } Set mocks Solution: use copy object Test double return fixed value
  • 39.
    Stub and Mock Set method return values  Test state  Check method calls  Check arguments used  Test interactions KiSS Concept Stub Mock
  • 40.
  • 41.
  • 42.
    Database testing  Setup database connection.  Set up initial dataset.  Provide methods to get dataset from database.  Provide methods to compare two datasets.  Type of dataset  Flat XML  XML  CSV  MySQL dump KiSS Concept
  • 43.
    Organizing  Allow toorganize tests to test suite to run one time  Use file system:  All test files end with „Test‟.  Organize directory structure.  Use configuration file: phpunit.xml KiSS Concept
  • 44.
  • 45.
  • 46.
    Code Coverage KiSS Concept Help to see what are executed when the tests are run.  Help to find code that is not yet tested.  Help to measure testing completeness.
  • 47.
  • 48.
    Code Coverage KiSS Concept Red:code is not executedGreen: code is executed Test cases cover this line code Grey: dead code Note: dead code is source code which is executed but whose result is never used.
  • 49.
    Logging Test results HTML <log type="testdox-html" target="./log/testdox.html" /> KiSS Concept
  • 50.
    Logging Test result XML <log type="junit" target="./log/logfile.xml" /> KiSS Concept
  • 51.
  • 52.
    References  PHPUnit manual Training course PHPUnit – Nick Belhome,2010  Unit Testing with PHPUnit – Michelangelo van Dam  Ini2it Unit Testing after ZF 1.8 - Michelangelo van Dam  PHPUnit From Zero To Hero – Jeremy Cook  PHPUnit & Continous Intergration – AlexMace  Advanced PHPUnit Testing – Mike Lively  Practical PHP Testing Patterns  http://framework.zend.com/manual/1.12/ru/zend.test.phpunit.db.html KiSS Concept
  • 53.
  • 54.
    LOGO “ Add yourcompany slogan ” Keep it Simple Stupid

Editor's Notes

  • #5 - Kiểm thử phần mềm là quá trình thực thi một hệ thống phần mềm để xác định xem phần mềm đó có đúng với đặc tả không và thực hiện trong môi trường như mong đợi hay không. - Mục đích của kiểm thử phần mềm:Tìmralỗichưađượcpháthiệnmộtcáchsớmnhất, hiệuquảnhấtĐảmbảolỗiđãđượcsửa- Kiểmthửphầnmềmkhôngkiểmtra code, khôngkiểmtra database, model, không debug, không fix bug
  • #6 Unit testing : làkiểu test kiểmtra code xemliệuchứcnăngnóđangthựchiệncóđúngcách hay khôngtheonhưyêucầu.Integration testing : làkiểu test kiểmtraliệutấtcảcác module làđượckếthợphoặcchưakếthợplạicùngvớinhauthựchiệncôngviệccóđạtđượckếtquảnhưtàiliệuyêucầuđãđượcxácđịnh (do mỗilậptrìnhviênthựchiệntrêncác module khácnhau. Khihọhoànthànhđoạn code củahọ, nhómquảnlýcấuhìnhrápchúnglạivớinhauvàchuẩnbịbiêndịch. Các tester cầnchắcrằngcác module nàybâygiờđãđượckếthợpvàlàmviệctheonhưyêucầu - tứclàphải test theonhưyêucầu).- Functional testing : làkiểu test liệumỗivàmọichứcnăngcủaứngdụngđóđanglàmviệccónhưyêucầucủatàiliệu. Nólàkiểu test chínhmà 80% côngviệc test đượcthựchiện. Trongkiểu test nàythìcáctestcaseđượcthựchiện (hoặcthihành).- System testing:Khi tester hoànthànhcôngviệc test (các tester test ứngdụngtrongcácmôitrường test, nghĩalàhọ test vớidữliệu test, không test trêndữliệuthật), ứngdụng (phầnmềm) phảiđược test trênmôitrườngthật. Nónghĩalàgì, tứclàkểtừkhicác tester test nótrongmôitrường test vớidữliệu test, chúng ta phảichắcchắnrằngứngdụnglàmviệctốttrongmôitrườngthậtvớidữliệuthật. Trongmôitrường test, mộtvàiđiềukhôngthể test hoặcthaotácgiả. Tấtcảsẽkhácnhauvàcơsởdữliệukhácnhau, mộtsốthaotáccóthểkhônglàmviệcnhưmongđợikhiứngdụngđượcchuyểntừmôitrường test sang môitrườngsảnphẩm (test enviroment to production environment).- Load testing ? Làkiểu test kiểmtrathờigianđáplạingườidùngvớiứngsốlượngngườidùngbấtkỳtrongmộtngữcảnhnàođócủacùngmộtứngdụngtạicùngmộtthờiđiểm.- Stress testing làgì? Làkiểu test kiểmtrathờigianđáplạingườidùngvớiứngsốlượngngườidùngbấtkỳtrongnhiềungữcảnhkhácnhaucủacùngmộtứngdụngtạicùngmộtthờiđiểm.- Performance testing làgì? Trongloại test này, ứngdụngđược test dựavàosứcnặngnhưsựphứctạpcủagiátrị, độdàicủađầuvào, độdàicủacáccâutruyvấn...Loại test nàykiểmtrabớtphầntải (stress/load) củaứngdụngcóthểđượcchắcchắnhơn.- User acceptance testing làgì? Trongkiểu test này, phầnmềmsẽđượcthựchiệnkiểmtratừngườidùngđểtìmranếuphầnmềmphùhợpvớisựmongđợicủangườidùngvàthựchiệnđúngnhưmongđợi. Tronggiaiđoạn test này, tester cóthểcũngthựchiệnhoặckháchhàngcócác tester củariênghọđểthựchiện.- Regression testing làgì? Khimộtchứcnăngmớiđượcthêmvàophầnmềm, chúng ta cầnchắcchắnrằngphầnchứcnăngmớiđượcthêmvàokhôngpháhỏngcácphầnkháccủaứngdụng. Hoặckhilỗiđãđượcchỉnhsửa, chúng ta cầnchắcchắnrằnglỗichỉnhsửakhôngpháhỏngcácphầnkháctrongứngdụng. Để test điềunàychúng ta thựchiệnkiểu test lặpđilặplạigọilà test hồiquy.
  • #7 Functional Testing: kiểmthửchứcnăng hay còngọikiểmthửhộpđen (blackbox)Black box làloại test mà tester đưagiátrịđầuvàovàkiểmtragiátrịđầurakhôngquantâmbêntronghoạtđộngnhưthếnào.Chủyếukiểmtragiaodiện, chứcnăngthiếu hay không, vv-Dựavàođặctảyêucầumàđưaracác test case: vìlàloại test chỉquan tam hệthốngphầnmềmcóhoạtđộngđúngnhưtrongyêucầu hay không, khôngquantâmbêntronglàmnhưthếnào-Chỉchútrọnghành vi bênngoàicủaphầnmềm.Structural Testing: kiểmthửcấutrúc hay còngọikiểmthửhộptrắng(white box)White box làloại test mà developer dựavàomã code củamìnhmàđưaracác test case.Test dựavàođiềukhiển logic (if else switch), điềukhiểnvònglặp (for while), cấutrúcdữliệubêntrongDựavàoviệcthựcthicủaphầnmềmmàđưaracác test caseChútrọngcấutrúcbêntrongcủaphầnmềm
  • #8 Giátrịđầuvào: 2 đồngxu, gõcâyđũa ma thuậtGiátrịđầura: con thỏBlack box: khángiả chi nhìnthấyảothuậtgiabỏ 2 đồngxu, vàgõcâyđũavàocáinón, và con thỏxuấthiệnWhite box: khinhậnđược 2 đồngxuvàthấycáinónbịgõ, ngườibêntrongđưa con thỏchoảothuậtgia
  • #9 Tiếntrìnhkiểmthử. Kiểmthửthườngbaogồmcácbước - Thiếtkếcáccakiểmthử - Bướctạodữliệuthử + Kiêmthửvớitấtcảcácdữliệuvàolàcầnthiết. + Chọntậpcácdữliệuthửđạidiệntừmiềndữliệuvào - Bướcthựcthichươngtrìnhtrêndữliệuthử + Cungcấpdữliệuthử + Thựcthi + Ghinhậnkếtquả - Bướcquansátkếtquảkiểmthử + Thựchiệntrongkhihoặcsaukhithựcthi + So sánhkếtquảnhậnđượcvàkếtquảmongđợi
  • #11 Unit testinglàphươngpháp test đơnvịcủa source code đểxácđịnh code đểcóhoạtđộngđúngnhưmongđợikhông.Một unit cóthểlàmột class hoặchàmcủachươngtrình
  • #16 Có 2 giaiđoạnchính:Trướckhi code hay còngọilàphươngpháp TDD(Test Driven Development: từviệc test dẫnđếnviết code để past test đó) - Tậptrungvàoyêucầucủachươngtrình - Nghĩđếnviệcviết code sẽđượcsửdụng - Ngưng code khiđạtđượcyêucầucủachươngtrình - KhókhănlúcbắtđầuSaukhi code xonghoặctronglúc code - Test chủyếuvàonhữngphầnđã code - Nghĩvềthuậttoánvà logic - Thayđổi code nhiềuhơn - Dễlúcbắtđầu
  • #17  - Code test phảiđộclập, cáchbiệtvới code được test - Code test phảingắngọn (khoảng 10 dòng), đơngiản, nhanhvàdễđọc. - Khôngsửdụngcáccấutrúcđiềukhiểnvàvònglặptronghàm test. Mỗicâulệnh if else nêntáchthànhnhiềuhàm test khácnhau, mỗihàmlà 1 trườnghợp test - Mộthàm test chỉnên test cho 1 trạngthái. VídụtestFormAcceptValidData
  • #19 PHPUnit là 1 framework viếtbằng PHP bởi Sebastian Bergmann.ThuộchọxUnit framework. xUnit frameworks: these unit testing frameworks are called the xUnit frameworks because their names usually start with the first letters of the language for which they were built.You might have CppUnit for C++, Junit for Java, Nunit for .NET.ĐượctíchhợpvàhỗtrợbởiZend Studio, Zend framework hay Symfony framework, doctrine
  • #24 Chạybằng command line: phpunitđườngdẫnđến file testChạybằng IDE: - Zend: trướchết import library vào project: Project -&gt; Properties -&gt; PHP Include Path -&gt; tab Libraries -&gt; click nút Add Library -&gt; chọn PHPUnit 3.x -&gt; OK. Đểchạynhấpchuộtphảilên file -&gt; Run As -&gt;PHPUnit, hiệnkhungkếtquảphpunit - NetBean: kiểmtraphpunitđãthêmvàochưa: Tool -&gt; Option -&gt; tab PHP -&gt; tab Unit Testing -&gt; kiểmtrađườngdẫncủaphpunit “/usr/bin/phpunit”Đểchạy file -&gt; Run -&gt; Test file -&gt; chỉthưmụcchứa file test -&gt; OKĐểchạy test suite: right click tên project -&gt; Properties -&gt; PHPUnit , chọn file bootstrap nếucó, chọn file configuration xml nếucó, chọn check box chạytấtcả file cótênlà Test -&gt; OKĐểhiện coverage report: right click tên project -&gt; Code Coverage -&gt; show reportChạybằng Continuous Integration (CI): tíchhợpliêntụcContinuous Intergration hay CI làmộtmôitrườnghỗtrợpháttriểnphầnmềmcóchứcnănggiúpcácthànhviêntrong team tíchhợp (integrate) côngviệccủahọmộtcáchthườngxuyên, liêntục. Mỗiđiểmtíchhợpsẽđượckiểmtra (verified) bởimột qui trình build và test tựđộngđểđảmbảopháthiệnsớmnhấtnhữnglỗiphátsinhtrongquátrìnhtíchhợpđó.Giảiphápnàythựcsựgiúpchocácnhàpháttriểnphầnmềmgiảmbớtcácvấnđềphátsinhtrongquátrìnhtíchhợpvàchophépcôngviệcpháttriểnphầntrởnênmềmnhanhchóngvàgắnkếthơn. CI baohàmmộtloạtnhữngquátrìnhđượcgắnkếtvớinhaunhư: automated build, coding standard check, static analysic, unit test, depoyingvàintergation test...
  • #26 Cácchứcnăngchínhcủaphpunit - Test dependency - Data provider - Exception - Fixture - Double - Code coverage
  • #28 Vớiviệc test thôngthường, để test 1 hàm, chúng ta truyềnvàothamsốsauđólấykếtquảtrảvề so sánhvớikếtquảchúng ta mongmuốn, sauđóxuất reportTest nhiềugiátrịđầuvào, viết code lậplạinhiềulần, mấtthờigianvìvậysửdụng data provider
  • #29 Data provider cungcấpdữliệuđể test. Dữliệunàycóthểlàgiátrịthamsốtruyềnvàohàmhoặcgiátrịmongmuốntrảvề, v.v
  • #40 Yêucầuđốivớiviệc test làcácthànhphầnphảiđược test riêngrẽvớinhauđểkếtquảcủathànhphầnkhôngbịảnhhưởngbởithànhphầnkhácvídụkhichúng ta gọiđến service đểlấykếtquảvàsauđólấykếtquảđểtínhtoántiếpchocôngviệccủachúng ta thìbắtbuộckếtquảtrảvềluônluônphảiđúngđểbiếtchắcnếu test củachúng ta bị fail là do code củachúng ta chứkhôngphải do service làmsai. Đểlàmđiềuđóđôikhichúng ta phảigiảlậpnhữngthànhphầnđóđểđảmbảo test đượccôlậpvàchínhxác. Việcgiảlập 1 đốitượngđượcgọilà test doubles.Ý tưởngcủa test double chỉgiảlập 1 phầncủa object, thườnglà 1 method nàođócần test chứkhônggiảlậptoànbộ object.Test double khôngphảithiếtkếmộtchotấtcảnêntùyvàotrườnghợpmàsửdụngcácloại double khácnhau. Test double cómấyloạisau:Dummy: là 1 object màđơngiảnđượcthông qua đểthỏamãncácphươngthứccầnkiểmtra. Nólà test double đơngiảnnhấtmàbạncóthểxâydựngStub cungcấpnhữngkếtquảđóngkhiđượcgọiSpy ghilạinhữnglầngọivàthamsốđểbạncóthểkiểmtrachúngsaunàybêntronghàm testMock giốngnhư Spy nhưngkiểmtralầngọingaylậptứcdựatheonhữnggìmàbạnđãđịnhnghĩatrướcđó. Nócũngcóthểcungcấpkếtquảđóng.Fake làsựthựcthimộtcáchđơngiảnnhấtcóthểcủamột object thậtchẳnghạnnhư DAO.Trongđóchúng ta chỉchú ý đặcbiệtđến Stub và Mock vìlà 2 đốitượngthườngdùng.Stub object làbảnsaocủamột object khácđượcchúng ta địnhnghĩatrướcvàtrảvề 1 kếtquảđóngcủamộtphươngthứctrong object đócũngđượcđịnhnghĩatrướcMock : điểmkhácnhaucănbảngiữa Stub và Mock là Mock khôngchỉgiảlập object màcònchokiểmtranhữnggìbạntruyềnchonóvàcáchbạngọinó.