2. About Me
- Lukasz Kujawa
- Lead Developer at Gloople
- http://systemsarchitect.net/
- @lukaszkujawa
3. What is TDD?
"Test-driven development (TDD) is a software
development process that relies on the repetition of a
very short development cycle: first the developer writes
an (initially failing) automated test case that defines a
desired improvement or new function, then produces the
minimum amount of code to pass that test, and finally
refactors the new code to acceptable standards"
- Wikipedia
4. What is TDD in English?
Create test before code
7. The Three Laws of TDD
- You might not write production code until you
have written a failing unit test
- You might not write more of a unit test than is
sufficient to fail, and not compiling is failing
- You may not write more production code then
is sufficient to pass the currently failing test
8. TDD Iterations
Test Production code
Write minimal Unit Test Create a Class
Call method of the class Create the Method
Assert output of the Add logic to return
method expected output
9. Unit Testing
"In computer programming, unit testing is a method by
which individual units of source code, sets of one or more
computer program modules together with associated
control data, usage procedures, and operating procedures,
are tested to determine if they are fit for use."
- Wikipedia
10. Unit Testing in English
Testing smallest testable parts of application
11. Unit Test is not a Test
- Very narrow and well defined scope
- No complex dependencies
- Test only one application layer
- Environment independent
- Fast
16. Research 1
"Art of Unit Testing" by Roy Osherove
Stage Team without tests Team with tests
Implementation 7 days 14 days
(coding)
Integration 7 days 2 days
Testing / Bug Fixing 12 days 8 days
Overall release time 26 days 24 days
Bugs in production 71 11
17. Research 2
Quality improvement through test driven
development: results and experiences of four
industrial teams (2008) by Nachiappan
Nagappan, E. Michael Maximilien, Thirumalesh
Bhat and Laurie Williams
http://biblio.gdinwiddie.
com/biblio/StudiesOfTestDrivenDevelopment
18. Research 2
Metric IBM Drivers Microsoft: Microsoft: Microsoft: VS
description Windows MSN
Defect density W X Y Z
of comparable
team in
organization
but not using
TDD
Defect density 0.61W 0.38X 0.24Y 0.09Z
of team using
TDD
Increase in time 15-20% 25-35% 15% 20-25%
taken to code
the feature
because
of TDD (%)
19. How to test?
<?php
MyFramework::bootstrap();
$obj = new Class_Under_Test();
if( $obj->something('Foo') != 47 ) {
throw new Exception('Incorrect output for Foo');
}
if( $obj->someting('Bar') !== false ) {
throw new Exception('Incorrect output for Bar');
}
21. Using Framework
- API
- No maintenance
- Integration with IDE
- Code coverage report
- Mocks
22.
23. <?php
class MyClassTest extends PHPUnit_Framework_TestCase {
public static function setUpBeforeClass() {
MyFramework::initAutoloader();
}
protected function setUp() {
$this->myClass = new MyClass();
}
public function testSomething() {
$this->assertEquals(1, $this->myClass->something());
}
public function testSomethingElse() {
$this->assertTrue( $this->myClass->somethingElse() );
$this->assertFalse $this->myClass->somethingElse( 47 ) );
}
}
25. Unit Testing - small print
- Can't test directly private, protected and static
methods
- Tests only functionality
- Database
- Requires rigorous discipline