1. Unit-Tests
Schnell und einfach selbst gemacht
TobiasSchlitt <toby@php.net>
PHP World Kongress 2009
2009-11-24
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 1 / 25
2. About me
Tobias Schlitt <toby@php.net>
PHP since 2001
Freelancing consultant
Qualified IT Specialist
Studying CS at TU Dortmund
(finishing mid 2010)
OSS addicted
eZ Components
PHPUnit
Various other projects . . .
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 2 / 25
3. Overview
1 Testing
2 PHPUnit
3 Advanced scenarios (optional)
4 The end
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 3 / 25
4. Outline
1 Testing
Methods of testing
Unit tests
2 PHPUnit
3 Advanced scenarios (optional)
4 The end
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 4 / 25
5. A little survey . . .
Do you test?
When?
How?
Who?
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 5 / 25
6. A little survey . . .
Do you test?
When?
How?
Who?
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 5 / 25
7. A little survey . . .
Do you test?
When?
How?
Who?
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 5 / 25
8. A little survey . . .
Do you test?
When?
How?
Who?
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 5 / 25
9. Ways of testing
Automatic vs. manual
Developer vs. tester
Internal vs. external
Back end vs. front end
Code vs. appearance
Functional vs. non-functional
Dynamic vs. static
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 6 / 25
10. Ways of testing
Automatic vs. manual
Developer vs. tester
Internal vs. external
Back end vs. front end
Code vs. appearance
Functional vs. non-functional
Dynamic vs. static
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 6 / 25
11. Ways of testing
Automatic vs. manual
Developer vs. tester
Internal vs. external
Back end vs. front end
Code vs. appearance
Functional vs. non-functional
Dynamic vs. static
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 6 / 25
12. Ways of testing
Automatic vs. manual
Developer vs. tester
Internal vs. external
Back end vs. front end
Code vs. appearance
Functional vs. non-functional
Dynamic vs. static
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 6 / 25
13. Ways of testing
Automatic vs. manual
Developer vs. tester
Internal vs. external
Back end vs. front end
Code vs. appearance
Functional vs. non-functional
Dynamic vs. static
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 6 / 25
14. Ways of testing
Automatic vs. manual
Developer vs. tester
Internal vs. external
Back end vs. front end
Code vs. appearance
Functional vs. non-functional
Dynamic vs. static
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 6 / 25
15. Ways of testing
Automatic vs. manual
Developer vs. tester
Internal vs. external
Back end vs. front end
Code vs. appearance
Functional vs. non-functional
Dynamic vs. static
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 6 / 25
16. Ways of testing
Automatic vs. manual
Developer vs. tester
Internal vs. external
Back end vs. front end
Code vs. appearance
Functional vs. non-functional
Dynamic vs. static
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 6 / 25
17. Test methods
Unit tests
Integration tests
Regression tests
Acceptance tests
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 7 / 25
18. Unit tests
Validate functionality
Test a single unit of code
Avoid regressions
Verify interfaces
Test bugs dedicatedly
Force code modularization
Migrate safely
Test driven development (TDD)
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 8 / 25
19. Unit tests
Validate functionality
Test a single unit of code
Avoid regressions
Verify interfaces
Test bugs dedicatedly
Force code modularization
Migrate safely
Test driven development (TDD)
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 8 / 25
20. Unit tests
Validate functionality
Test a single unit of code
Avoid regressions
Verify interfaces
Test bugs dedicatedly
Force code modularization
Migrate safely
Test driven development (TDD)
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 8 / 25
21. Unit tests
Validate functionality
Test a single unit of code
Avoid regressions
Verify interfaces
Test bugs dedicatedly
Force code modularization
Migrate safely
Test driven development (TDD)
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 8 / 25
22. Unit tests
Validate functionality
Test a single unit of code
Avoid regressions
Verify interfaces
Test bugs dedicatedly
Force code modularization
Migrate safely
Test driven development (TDD)
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 8 / 25
23. Unit tests
Validate functionality
Test a single unit of code
Avoid regressions
Verify interfaces
Test bugs dedicatedly
Force code modularization
Migrate safely
Test driven development (TDD)
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 8 / 25
24. Unit tests
Validate functionality
Test a single unit of code
Avoid regressions
Verify interfaces
Test bugs dedicatedly
Force code modularization
Migrate safely
Test driven development (TDD)
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 8 / 25
25. Unit tests
Validate functionality
Test a single unit of code
Avoid regressions
Verify interfaces
Test bugs dedicatedly
Force code modularization
Migrate safely
Test driven development (TDD)
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 8 / 25
26. Outline
1 Testing
2 PHPUnit
Installation
PHPUnit basics
Code examples
3 Advanced scenarios (optional)
4 The end
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 9 / 25
27. PHPUnit
Port of JUnit to PHP
Many enhancements
Database tests
Code coverage
Data providers
Invented by Sebastian Bergmann
Standard for unit testing in PHP
http://www.phpunit.de/
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 10 / 25
35. Let’s dig into some code
Let’s dig into some code
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 13 / 25
36. Outline
1 Testing
2 PHPUnit
3 Advanced scenarios (optional)
Custom test environment
Testing a WebDAV server
Testing graphic generation
Testing parsers
4 The end
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 14 / 25
37. eZ Component test runner
Custom test runner
Integrated auto loading
Component base testing
Run all tests
Extended test case / suite classes
Custom assertions
Database testing
Utility functions
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 15 / 25
39. Semi-automatic regression tests
Manual client test run
Defined test receipe
Capture request / response data
Replay request in unit tests
Detect response regressions
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 17 / 25
40. Binary regressions
Binary differences in generated images
Test failures depending on
PHP version
GD version
Operating system
Images visually equivalent
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 18 / 25
41. Custom assertions
Custom assertion
Custom equality constraint
Based on ImageMagick
Allows defined gap
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 19 / 25
42. Untestable code
Parsers are highly dependant
De-coupling hardly possible
Huge amount of mock objects
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 20 / 25
43. Integration tests
Test parser as a whole
Small test files
Manually create / validate
Large overall tests
Manual inspection of generated data
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 21 / 25
44. Outline
1 Testing
2 PHPUnit
3 Advanced scenarios (optional)
4 The end
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 22 / 25
46. The end
I hope you enjoyed the session
Slides and material
http://schlitt.info/opensource
http://www.slideshare.net/tobyS
Contact: Tobias Schlitt <toby@php.net>
Tobias Schlitt (PHP World Kongress 2009) Unit-Tests 2009-11-24 24 / 25