4. Test first, code later
Write tests for all your code
• New features come with a test
• Bugfixes come with a test
Write tests before your code
• Adding a feature means adding a test first
• Fixing a bug means writing a test first
Inspiring people to
share
5. Unit tests
Unit tests are small programs that test your code
They check
• the result of methods against expected values
• whether methods are (not) called as expected
A test should
• be well-named
• check only one assertion
Inspiring people to
share
6. Good tests
Should be...
• automated
• self-contained
• repeatable
• thorough
• small
• talk about the domain
Inspiring people to
share
7. Unit tests
Unit tests are usually run with a test runner
The xUnit family is most widespread
PHPUnit does the job for PHP
Inspiring people to
share
12. They make you feel good
The tests make you
• focus on your task
• code exactly what you need
• think from the outside
• a better programmer*
So what the tests do for you is the key
* decoupling helps with testing,
decoupled code is easier to maintain,
easier is better - q.e.d.
Inspiring people to
share
13. Reasons for TDD
Feel more comfortable
• Build confidence in your code
• Reduce fear of change
(Good) tests are (good) documentation
Acts as safety net
• Regression testing built in
• Helps with refactoring
Inspiring people to
share
14. D for Design
Writing tests first is likely to improve your code
Constant refactoring keeps code clean
Unit testing ensure decoupling
You only code what is really needed
Inspiring people to
share
17. The Mantra
Design
Test Test
Implement
Inspiring people to
share
18. More testing
Sometimes you need to test interaction with external systems,
like database access
A test should be small, encapsulated, stand-alone
So how do you test database access?
Inspiring people to
share
19. Mocks & stubs
Mock objects allow you to use fake objects instead of real
implementations
Stubs can be used to return hard-coded results
Using them is actually (somewhat) easy with PHPUnit
Inspiring people to
share
20. Saving in TYPO3CR
Assumptions / Background
• The Session object has a save() method
• It uses a Storage_Backend implementation to do the work
• That implementation has methods like addNode(),
updateNode() and deleteNode()
You need to make sure those are used when calling save()
Inspiring people to
share
25. Dependencies
Unit Testing: You want to test a small unit
You don't want to test
• The Simple File Logger
• The Card Repository
Inspiring people to
share
26. Dependencies
Unit Testing: You want to test a small unit
You want to test
• if the action returns a string representation of the
random card it gets from the repository
Inspiring people to
share
27. Dependency Injection
A class doesn't ask for the instance of another class but gets it
injected
This methodology is referred to as the quot;Hollywood Principlequot;:
quot;Don't call us, we'll call youquot;
Enforces loose coupling and high cohesion
Allows you to mock collaborators
Makes you a better programmer
Inspiring people to
share
29. Links & Literature
Test-Driven Development By Example
Kent Beck, Addison-Wesley
Continuous Integration – Improving Software Quality and
Reducing Risk
Paul M. Duvall, Addison-Wesley
xUnit Test Patterns – Refactoring Test Code
Gerard Meszaros, Addison-Wesley
Inspiring people to
share
30. Links & Literature
FLOW3
http://flow3.typo3.org/
PHPUnit
http://www.phpunit.de/
Hudson CI-Server
https://hudson.dev.java.net/
TYPO3 Forge
http://forge.typo3.org/
Inspiring people to
share