SlideShare a Scribd company logo
Test in Action – Week 4
       Good Tests
      Hubert Chan
Test Lint
• Test Lint
  – Trustworthiness
  – Maintainability
  – Readability
• References
  – Test Lint (http://docs.typemock.com/lint/ )
Trustworthy Tests
• Trustworthy Tests
  – Always Asserts Something
  – Avoid unpredictable factor
  – Don’t depend on other tests
  – Avoid Logic in Tests
Always Asserts Something
• Always Asserts Something
  – Assertion means “Verification”
  – Unit Tests need to “Check Something”
• Exceptions
  – Check exception not thrown
     • Name “Login_Call_NoExceptionThrown”
  – Specified Mock Object
Avoid Unpredictable Factor
• Avoid Unpredictable Factor
  – Unpredictable Factor
     • Random Number
     • Date Time
  – Cause
     • Unreliable/Inconsistent Result
     • Hard to write Assertion statement
Avoid Unpredictable Factor
• Solution
  – Use Fake
  – Use hard-code values
  $random = rand();
  $this->assertEquals(1, sut.DoSomething($random));




  $pseudoRandom = 1234;
  $this->assertEquals(1, sut.DoSomething(pseudoRandom));
Don’t Depend on Other Tests
• Example
 class LogAnalyzerDependTest extends PHPUnit_Framework_TestCase {

     public function test_LogAnalyzerDepend_Construct_NoException() {
       $this->analyzer = new LogAnalyzerDepend();
       $this->analyzer->initialize();
     }

     public function test_IsValid_InValidContent_ReturnFalse() {
       $this->test_LogAnalyzerDepend_Construct_NoException();
       $this->assertFalse($this->analyzer->is_valid('abc'));
     }
 }
Don’t Depend on Other Tests
• Symptom
  – A test calls another tests
  – It requires other tests to create/delete objects
  – A test depends on system state set by other tests
  – Test order matters
Don’t Depend on Other Tests
• Why not?
  – Cannot provide explicit testing result
  – Implicit tests flow
  – The testA failed because callee testB failed
• Solution
  – Extract reused code to utility
  – For create/delete object, use “setUp” and
    “tearDown” instead
Avoid Logic in Tests
• Test more than one thing
  – Number of Assertion > 1
  – Logics better not in tests
     • switch, if, or else statement
     • foreach, for, or while loops
Avoid Logic in Tests- Example
• Test Code
 public function test_ImplodeAndExplode_ValidContent_CorrectResult() {
   $instance = new MoreThanOne();
   $test_array = array('1', '2', '3');
   $test_string = '1,2,3';

     for ($i = 0; $i < 2; $i++) {
       if ($i === 0) { // Test explode2
         $result = $instance->explode2(',', $test_string);
         $this->assertEquals($test_array, $result);
       }
       elseif ($i === 1) { // Test implode2
         $result = $instance->implode2(',', $test_array);
         $this->assertEquals($test_string, $result);
       }
     }
 }
Make Clean Tests
• Change your tests
  – Removing invalid tests
  – Renaming / Refactoring tests
  – Eliminating duplicate tests
Trustworthiness – Do it
• Do it
  – Testing only one thing
  – Keep safe green zone
     • No dependency to real database/network
     • Keep result consistent
  – Assuring code coverage
  – Attitude
     • Add a unit test for newly tickets/trackers
Maintainable Tests
• Maintainable Tests
  – Test public function only
  – Don’t Repeat Yourself
     • Use Factory Function over Multiple Object Creation
     • Use setUp
  – Using setUp in a maintainable manner
  – Avoid Over Specification in Tests
  – Avoid multiple asserts
Test Public Function Only
• Test Public Function Only
  – Design/Program by Contract
     • Private/Protected method might be changed
  – Extract private/protected function to new class
     • Adopt Single Responsibility Principle (SRP)
Semantic Change
• Semantic Change is really a PAIN
  – API change may break all tests
  – Each test need to be changed
 public function test_IsValid_InValidContent_ReturnFalse_New() {
   $analyzer = new LogAnalyzer();
   $analyzer->initialize(); // new requirement
   $this->assertFalse($analyzer->is_valid('abc'));
 }
Use Factory Function over Multiple
           Object Creation
• Use a factory function
 protected function create_LogAnalyzer() { // Factory Method
   $analyzer = new LogAnalyzer();
   $analyzer->initialize(); // New API handled here
   return $analyzer;
 }
 public function test_IsValid_InValidContent_ReturnFalse() {
   $analyzer = $this->create_LogAnalyzer(); // Use factory
   $this->assertFalse($analyzer->is_valid('abc'));
 }
Use setUp over Multiple Object
                Creation
• Use setUp
 protected function setUp() { // setUp method
   $this->analyzer = new LogAnalyzer();
   $this->analyzer->initialize(); // New API handled here
 }

 public function test_IsValid_InValidContent_ReturnFalse() {
   $this->assertFalse($this->analyzer->is_valid('abc'));
 }
 public function test_IsValid_ValidContent_ReturnFalse() {
   $this->assertTrue($this->analyzer->is_valid('valid'));
 }
Maintainable setUp
• Maintainable setUp
  – setUp() should be generic
     • Cohesion
     • Initialized object should be used in all tests
     • Might not be appropriate to arrange mock/stub in
       setUp()
  – setUp() should be kept his readability
Avoid Over Specification in Test
• Over specified in test
  – Verify internal state/behavior of object
  – Using mocks when stubs are enough
  – A test assumes specific order or exact string
    matches when it isn’t required.
Verify internal state/behavior of object
• Solution
  – Never verify internal state/behavior
  – Maybe no need to test
  public function
  test_Initialize_WhenCalled_SetsDefaultDelimiterIsTabDelimiter(){
    $analyzer = new LogAnalyzer();
    $this->assertEquals(null,
      $analyzer->GetInternalDefaultDelimiter()
    );

      $analyzer->Initialize();
      $this->assertEquals('t',
        $analyzer->GetInternalDefaultDelimiter()
      );
  }
Avoid Multiple Asserts
• Why not?
  – Assertion failure will throw exception. Multiple
    assertion cannot get all failure point at once
  – Test multiple thing in one tests
• Solution
  – Separate tests for different assertion
  – Use data provider / parameter tests
Data Provider Sample
• Test Code
class DataTest extends PHPUnit_Framework_TestCase {
  /**
  * @dataProvider provider
  */
  public function testAdd($a, $b, $c) {
    $this->assertEquals($c, $a + $b);
  }
    public function   provider() {
      return array(
        array(0, 0,   0),
        array(0, 1,   1),
        array(1, 0,   1),
        array(1, 1,   3)
      );
    }
}
Readable Tests
•   Test Naming
•   Variable Naming
•   Good Assert Message
•   Separate Arrange and Assertion
•   Mock and Stub Naming
Test Naming
• Function Name
  – Test function name should be
    test_<function>_<scenario>_<expect_behavior>
  – Example
    • test_escape_evenBackSlashesData_successEscape
Variable Name
• Avoid Hard Code in tests
 public function test BadlyNamedTest() {
   $log = new LogAnalyzer();
   $result= log.GetLineCount("abc.txt");
   $this->assertEquals(-100, result);
 }


 public function test WellNamedTest() {
   $log = new LogAnalyzer();
   $COULD_NOT_READ_FILE = -100;
   $result= log.GetLineCount("abc.txt");
   $this->assertEquals($COULD_NOT_READ_FILE, result);
 }
Good Assertion Message
• Good Assertion Message
  – Don’t repeat what the built-in test framework
    outputs to the console.
  – Don’t repeat what the test name explains.
  – If you don’t have anything good to say, don’t say
    anything.
  – Write what should have happened or what failed
Separate Arrange and Assertion
• Separate Arrange and Assertion
 public function test_BadAssertMessage() {
   $this->assertEquals(COULD_NOT_READ_FILE,
                       log->GetLineCount("abc.txt")
   );
 }



 public function test_GoodAssertMessage() {
   $result = log->GetLineCount("abc.txt");
   $this->assertEquals($COULD_NOT_READ_FILE, $result);
 }
Mock and Stub Naming
• Include “mock” and “stub” in variable name
 public function test_sendNotify_Mock_NoException() {

     $notify_content = 'fake_content';
     $mock_notifier = $this->getMock('NotifierInterface');
     $mock_notifier->expects($this->once())
                   ->method('notify')
                   ->with($this->anything(),
                          $this->equalTo($notify_content));

     $alert_system = new AlertSystem(
       $mock_notifier,
       $stub_provider
     );
     $alert_system->send_notify('Alert!!');
 }
Q&A
PHPUnit and Selenium
• Use PHPUnit to do
  – Integration Test
  – Acceptance Test
• References
  – PHPUnit Selenium
     • http://www.phpunit.de/manual/current/en/selenium.h
       tml
     • http://seleniumhq.org/documentation/
PHPUnit and Selenium
• Use PHPUnit and Selenium
class WebTest extends PHPUnit_Extensions_SeleniumTestCase {
  protected function setUp() {
    $this->setBrowser('*firefox');
    $this->setBrowserUrl('http://www.example.com/');
  }

    public function testTitle() {
      $this->open('http://www.example.com/');
      $this->assertTitle('Example WWW Page');
    }
}
PHPUnit and Selenium

More Related Content

PPTX
Test in action week 3
PPTX
Test in action – week 1
PPTX
Test in action week 2
PPTX
Unit Testng with PHP Unit - A Step by Step Training
ODP
Interaction testing using mock objects
PPT
Phpunit testing
KEY
Developer testing 101: Become a Testing Fanatic
PPT
Test driven development_for_php
Test in action week 3
Test in action – week 1
Test in action week 2
Unit Testng with PHP Unit - A Step by Step Training
Interaction testing using mock objects
Phpunit testing
Developer testing 101: Become a Testing Fanatic
Test driven development_for_php

What's hot (20)

PDF
Unit Testing in SilverStripe
PPT
Advanced PHPUnit Testing
ODP
Getting to Grips with SilverStripe Testing
PDF
Unit testing PHP apps with PHPUnit
PPTX
Java best practices
PDF
SilverStripe CMS JavaScript Refactoring
PDF
SOLID Principles
PDF
Unit testing with PHPUnit - there's life outside of TDD
PPTX
Unit Testing Presentation
PDF
Why Your Test Suite Sucks - PHPCon PL 2015
PDF
QA Lab: тестирование ПО. Станислав Шмидт: "Self-testing REST APIs with API Fi...
PDF
Introduction to Unit Testing with PHPUnit
PDF
PHP: 4 Design Patterns to Make Better Code
PDF
Design patterns in PHP
ODP
Testing in Laravel
PPTX
PHP 7 Crash Course
PDF
Python testing using mock and pytest
PDF
Keep your repo clean
PPT
Test Driven Development with PHPUnit
PPTX
PHPUnit: from zero to hero
Unit Testing in SilverStripe
Advanced PHPUnit Testing
Getting to Grips with SilverStripe Testing
Unit testing PHP apps with PHPUnit
Java best practices
SilverStripe CMS JavaScript Refactoring
SOLID Principles
Unit testing with PHPUnit - there's life outside of TDD
Unit Testing Presentation
Why Your Test Suite Sucks - PHPCon PL 2015
QA Lab: тестирование ПО. Станислав Шмидт: "Self-testing REST APIs with API Fi...
Introduction to Unit Testing with PHPUnit
PHP: 4 Design Patterns to Make Better Code
Design patterns in PHP
Testing in Laravel
PHP 7 Crash Course
Python testing using mock and pytest
Keep your repo clean
Test Driven Development with PHPUnit
PHPUnit: from zero to hero
Ad

Viewers also liked (20)

PPT
Segundo Caraujulca Galvez
PPTX
Tech Blogs - Pakistani Prospective
PPSX
Presentancion halloween 2011
PDF
Visual Thinking for Islamic Education
PDF
Q1 2009 Earning Report of Du Pont E I De Nemours
PPTX
Shari Gunn
PPT
A Christmas Story
PPT
A Christmas Story2
PDF
IAサミットは誰のものか
PPTX
April 23, 2015 Joint Elected Boards meeting
PPTX
What can Michelangelo teach us about innovation?
PDF
Design for asatizah Slides
PDF
Viva La Revolution: Why Universal Banking is under siege and what needs to be...
PDF
Open Content in Kalimantan: Wikipedia and Open Street Map for Transparency Re...
PPT
Pijar teologi materi komunikasi-final
PDF
Who Is Muhammad (Pbuh)
PPT
Hannah Montana
PPT
Aspen Lion
PPTX
Taal Is Het Woord Niet
PDF
Perpustakaan digital Bebaskan Pengetahuan
Segundo Caraujulca Galvez
Tech Blogs - Pakistani Prospective
Presentancion halloween 2011
Visual Thinking for Islamic Education
Q1 2009 Earning Report of Du Pont E I De Nemours
Shari Gunn
A Christmas Story
A Christmas Story2
IAサミットは誰のものか
April 23, 2015 Joint Elected Boards meeting
What can Michelangelo teach us about innovation?
Design for asatizah Slides
Viva La Revolution: Why Universal Banking is under siege and what needs to be...
Open Content in Kalimantan: Wikipedia and Open Street Map for Transparency Re...
Pijar teologi materi komunikasi-final
Who Is Muhammad (Pbuh)
Hannah Montana
Aspen Lion
Taal Is Het Woord Niet
Perpustakaan digital Bebaskan Pengetahuan
Ad

Similar to Test in action week 4 (20)

PDF
Php tests tips
PDF
PHPUnit best practices presentation
KEY
Php Unit With Zend Framework Zendcon09
KEY
Unit testing zend framework apps
PDF
PHPunit and you
PPTX
More on Fitnesse and Continuous Integration (Silicon Valley code camp 2012)
PPTX
Clean tests good tests
PDF
Php unit the-mostunknownparts
PDF
international PHP2011_Bastian Feder_The most unknown Parts of PHPUnit
PDF
Leveling Up With Unit Testing - php[tek] 2023
PPTX
Principles and patterns for test driven development
PDF
Unit Testing from Setup to Deployment
PDF
Php unit the-mostunknownparts
PPT
Mocking Dependencies in PHPUnit
PDF
Test driven development
PPTX
Deploying Straight to Production
PDF
EPHPC Webinar Slides: Unit Testing by Arthur Purnama
PDF
MT_01_unittest_python.pdf
PPT
Automated Unit Testing
Php tests tips
PHPUnit best practices presentation
Php Unit With Zend Framework Zendcon09
Unit testing zend framework apps
PHPunit and you
More on Fitnesse and Continuous Integration (Silicon Valley code camp 2012)
Clean tests good tests
Php unit the-mostunknownparts
international PHP2011_Bastian Feder_The most unknown Parts of PHPUnit
Leveling Up With Unit Testing - php[tek] 2023
Principles and patterns for test driven development
Unit Testing from Setup to Deployment
Php unit the-mostunknownparts
Mocking Dependencies in PHPUnit
Test driven development
Deploying Straight to Production
EPHPC Webinar Slides: Unit Testing by Arthur Purnama
MT_01_unittest_python.pdf
Automated Unit Testing

Recently uploaded (20)

PDF
KodekX | Application Modernization Development
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
Spectral efficient network and resource selection model in 5G networks
PPTX
sap open course for s4hana steps from ECC to s4
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
Machine learning based COVID-19 study performance prediction
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PPTX
Programs and apps: productivity, graphics, security and other tools
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
Diabetes mellitus diagnosis method based random forest with bat algorithm
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PPTX
Big Data Technologies - Introduction.pptx
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
cuic standard and advanced reporting.pdf
PPTX
Spectroscopy.pptx food analysis technology
KodekX | Application Modernization Development
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Spectral efficient network and resource selection model in 5G networks
sap open course for s4hana steps from ECC to s4
Reach Out and Touch Someone: Haptics and Empathic Computing
Machine learning based COVID-19 study performance prediction
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
Network Security Unit 5.pdf for BCA BBA.
Advanced methodologies resolving dimensionality complications for autism neur...
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Programs and apps: productivity, graphics, security and other tools
Chapter 3 Spatial Domain Image Processing.pdf
Diabetes mellitus diagnosis method based random forest with bat algorithm
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Big Data Technologies - Introduction.pptx
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Digital-Transformation-Roadmap-for-Companies.pptx
cuic standard and advanced reporting.pdf
Spectroscopy.pptx food analysis technology

Test in action week 4

  • 1. Test in Action – Week 4 Good Tests Hubert Chan
  • 2. Test Lint • Test Lint – Trustworthiness – Maintainability – Readability • References – Test Lint (http://docs.typemock.com/lint/ )
  • 3. Trustworthy Tests • Trustworthy Tests – Always Asserts Something – Avoid unpredictable factor – Don’t depend on other tests – Avoid Logic in Tests
  • 4. Always Asserts Something • Always Asserts Something – Assertion means “Verification” – Unit Tests need to “Check Something” • Exceptions – Check exception not thrown • Name “Login_Call_NoExceptionThrown” – Specified Mock Object
  • 5. Avoid Unpredictable Factor • Avoid Unpredictable Factor – Unpredictable Factor • Random Number • Date Time – Cause • Unreliable/Inconsistent Result • Hard to write Assertion statement
  • 6. Avoid Unpredictable Factor • Solution – Use Fake – Use hard-code values $random = rand(); $this->assertEquals(1, sut.DoSomething($random)); $pseudoRandom = 1234; $this->assertEquals(1, sut.DoSomething(pseudoRandom));
  • 7. Don’t Depend on Other Tests • Example class LogAnalyzerDependTest extends PHPUnit_Framework_TestCase { public function test_LogAnalyzerDepend_Construct_NoException() { $this->analyzer = new LogAnalyzerDepend(); $this->analyzer->initialize(); } public function test_IsValid_InValidContent_ReturnFalse() { $this->test_LogAnalyzerDepend_Construct_NoException(); $this->assertFalse($this->analyzer->is_valid('abc')); } }
  • 8. Don’t Depend on Other Tests • Symptom – A test calls another tests – It requires other tests to create/delete objects – A test depends on system state set by other tests – Test order matters
  • 9. Don’t Depend on Other Tests • Why not? – Cannot provide explicit testing result – Implicit tests flow – The testA failed because callee testB failed • Solution – Extract reused code to utility – For create/delete object, use “setUp” and “tearDown” instead
  • 10. Avoid Logic in Tests • Test more than one thing – Number of Assertion > 1 – Logics better not in tests • switch, if, or else statement • foreach, for, or while loops
  • 11. Avoid Logic in Tests- Example • Test Code public function test_ImplodeAndExplode_ValidContent_CorrectResult() { $instance = new MoreThanOne(); $test_array = array('1', '2', '3'); $test_string = '1,2,3'; for ($i = 0; $i < 2; $i++) { if ($i === 0) { // Test explode2 $result = $instance->explode2(',', $test_string); $this->assertEquals($test_array, $result); } elseif ($i === 1) { // Test implode2 $result = $instance->implode2(',', $test_array); $this->assertEquals($test_string, $result); } } }
  • 12. Make Clean Tests • Change your tests – Removing invalid tests – Renaming / Refactoring tests – Eliminating duplicate tests
  • 13. Trustworthiness – Do it • Do it – Testing only one thing – Keep safe green zone • No dependency to real database/network • Keep result consistent – Assuring code coverage – Attitude • Add a unit test for newly tickets/trackers
  • 14. Maintainable Tests • Maintainable Tests – Test public function only – Don’t Repeat Yourself • Use Factory Function over Multiple Object Creation • Use setUp – Using setUp in a maintainable manner – Avoid Over Specification in Tests – Avoid multiple asserts
  • 15. Test Public Function Only • Test Public Function Only – Design/Program by Contract • Private/Protected method might be changed – Extract private/protected function to new class • Adopt Single Responsibility Principle (SRP)
  • 16. Semantic Change • Semantic Change is really a PAIN – API change may break all tests – Each test need to be changed public function test_IsValid_InValidContent_ReturnFalse_New() { $analyzer = new LogAnalyzer(); $analyzer->initialize(); // new requirement $this->assertFalse($analyzer->is_valid('abc')); }
  • 17. Use Factory Function over Multiple Object Creation • Use a factory function protected function create_LogAnalyzer() { // Factory Method $analyzer = new LogAnalyzer(); $analyzer->initialize(); // New API handled here return $analyzer; } public function test_IsValid_InValidContent_ReturnFalse() { $analyzer = $this->create_LogAnalyzer(); // Use factory $this->assertFalse($analyzer->is_valid('abc')); }
  • 18. Use setUp over Multiple Object Creation • Use setUp protected function setUp() { // setUp method $this->analyzer = new LogAnalyzer(); $this->analyzer->initialize(); // New API handled here } public function test_IsValid_InValidContent_ReturnFalse() { $this->assertFalse($this->analyzer->is_valid('abc')); } public function test_IsValid_ValidContent_ReturnFalse() { $this->assertTrue($this->analyzer->is_valid('valid')); }
  • 19. Maintainable setUp • Maintainable setUp – setUp() should be generic • Cohesion • Initialized object should be used in all tests • Might not be appropriate to arrange mock/stub in setUp() – setUp() should be kept his readability
  • 20. Avoid Over Specification in Test • Over specified in test – Verify internal state/behavior of object – Using mocks when stubs are enough – A test assumes specific order or exact string matches when it isn’t required.
  • 21. Verify internal state/behavior of object • Solution – Never verify internal state/behavior – Maybe no need to test public function test_Initialize_WhenCalled_SetsDefaultDelimiterIsTabDelimiter(){ $analyzer = new LogAnalyzer(); $this->assertEquals(null, $analyzer->GetInternalDefaultDelimiter() ); $analyzer->Initialize(); $this->assertEquals('t', $analyzer->GetInternalDefaultDelimiter() ); }
  • 22. Avoid Multiple Asserts • Why not? – Assertion failure will throw exception. Multiple assertion cannot get all failure point at once – Test multiple thing in one tests • Solution – Separate tests for different assertion – Use data provider / parameter tests
  • 23. Data Provider Sample • Test Code class DataTest extends PHPUnit_Framework_TestCase { /** * @dataProvider provider */ public function testAdd($a, $b, $c) { $this->assertEquals($c, $a + $b); } public function provider() { return array( array(0, 0, 0), array(0, 1, 1), array(1, 0, 1), array(1, 1, 3) ); } }
  • 24. Readable Tests • Test Naming • Variable Naming • Good Assert Message • Separate Arrange and Assertion • Mock and Stub Naming
  • 25. Test Naming • Function Name – Test function name should be test_<function>_<scenario>_<expect_behavior> – Example • test_escape_evenBackSlashesData_successEscape
  • 26. Variable Name • Avoid Hard Code in tests public function test BadlyNamedTest() { $log = new LogAnalyzer(); $result= log.GetLineCount("abc.txt"); $this->assertEquals(-100, result); } public function test WellNamedTest() { $log = new LogAnalyzer(); $COULD_NOT_READ_FILE = -100; $result= log.GetLineCount("abc.txt"); $this->assertEquals($COULD_NOT_READ_FILE, result); }
  • 27. Good Assertion Message • Good Assertion Message – Don’t repeat what the built-in test framework outputs to the console. – Don’t repeat what the test name explains. – If you don’t have anything good to say, don’t say anything. – Write what should have happened or what failed
  • 28. Separate Arrange and Assertion • Separate Arrange and Assertion public function test_BadAssertMessage() { $this->assertEquals(COULD_NOT_READ_FILE, log->GetLineCount("abc.txt") ); } public function test_GoodAssertMessage() { $result = log->GetLineCount("abc.txt"); $this->assertEquals($COULD_NOT_READ_FILE, $result); }
  • 29. Mock and Stub Naming • Include “mock” and “stub” in variable name public function test_sendNotify_Mock_NoException() { $notify_content = 'fake_content'; $mock_notifier = $this->getMock('NotifierInterface'); $mock_notifier->expects($this->once()) ->method('notify') ->with($this->anything(), $this->equalTo($notify_content)); $alert_system = new AlertSystem( $mock_notifier, $stub_provider ); $alert_system->send_notify('Alert!!'); }
  • 30. Q&A
  • 31. PHPUnit and Selenium • Use PHPUnit to do – Integration Test – Acceptance Test • References – PHPUnit Selenium • http://www.phpunit.de/manual/current/en/selenium.h tml • http://seleniumhq.org/documentation/
  • 32. PHPUnit and Selenium • Use PHPUnit and Selenium class WebTest extends PHPUnit_Extensions_SeleniumTestCase { protected function setUp() { $this->setBrowser('*firefox'); $this->setBrowserUrl('http://www.example.com/'); } public function testTitle() { $this->open('http://www.example.com/'); $this->assertTitle('Example WWW Page'); } }