Code testing with PHP
Martin Pernica | @martindeveloper
čtvrtek, 25. července 13
Slide 2
Slide 2 text
Why code testing?
• Reduce bugs in your code
• Stable class API
• Automatic feedback
• More readable code (automatic docs)
• It is cool :)
čtvrtek, 25. července 13
Slide 3
Slide 3 text
Types of tests
• Unit
• Integration
• System
• Acceptance
• ... and more
Unit tests
Integration tests
Acceptance
System tests
čtvrtek, 25. července 13
Slide 4
Slide 4 text
Requirements
• Fast
• Timely
• Independent
• Repeatable
• Self-validating
• Short
• Simple
čtvrtek, 25. července 13
Slide 5
Slide 5 text
Testing is easy, if ...
čtvrtek, 25. července 13
Slide 6
Slide 6 text
If you using Dependecy Injection
DI is not about container!
čtvrtek, 25. července 13
Slide 7
Slide 7 text
If you using Dependecy Injection
Controller
DI is not about container!
čtvrtek, 25. července 13
Slide 8
Slide 8 text
If you using Dependecy Injection
Controller
DI is not about container!
čtvrtek, 25. července 13
Slide 9
Slide 9 text
If you using Dependecy Injection
Data
Repository
Controller
DI is not about container!
čtvrtek, 25. července 13
Slide 10
Slide 10 text
If you using Dependecy Injection
Database
Data
Repository
Controller
DI is not about container!
čtvrtek, 25. července 13
Slide 11
Slide 11 text
If you using Dependecy Injection
Database Mamcache
Data
Repository
Controller
DI is not about container!
čtvrtek, 25. července 13
Slide 12
Slide 12 text
If you using Dependecy Injection
Database Mamcache
Data
Repository
Controller
DI is not about container!
čtvrtek, 25. července 13
Slide 13
Slide 13 text
If you using Dependecy Injection
Database Mamcache
Data
Repository
Controller
DI is not about container!
čtvrtek, 25. července 13
Slide 14
Slide 14 text
DI example in PHP
content
+=
max(0,
(float)$amount);
}
}
class
Oil
{
}
class
Engine
{
public
function
__construct(IGas
$gas,
Oil
$oil)
{}
}
čtvrtek, 25. července 13
Slide 15
Slide 15 text
Unit testing
• Test single class
• Test all methods
• Needs some dependencies? Mock
it!
čtvrtek, 25. července 13
Slide 16
Slide 16 text
Unit testing
• Test single class
• Test all methods
• Needs some dependencies? Mock
it!
• PHPUnit
• Nette Tester
• SimpleTest
čtvrtek, 25. července 13
Slide 17
Slide 17 text
Mocking?
• Class Engine needs IGas and Oil objects
• Unit testing is about testing single class
• Create mocks of IGas and Oil objects
• Mock is dummy object which return defined
values
Original
object
Mock
čtvrtek, 25. července 13
Slide 18
Slide 18 text
Mock example
content
+=
max(0,
(float)$amount);
if($this-‐>content
>
100)
{
throw
new
\Exception(“Overflow!);
}
}
}
class
NaturalGasMock
extends
NaturalGas
implements
IGas
{
pulic
fill($amount)
{
return
true;
}
}
čtvrtek, 25. července 13
Slide 19
Slide 19 text
Mocking frameworks
• PHPUnit
• Phake
• Mockery
• Mockista (by Jan Marek)
čtvrtek, 25. července 13
Slide 20
Slide 20 text
Unit testing example
multiplicationBy2(2);
$this-‐>assertEquals($result,
2);
}
}
Using PHPUnit
čtvrtek, 25. července 13
Slide 21
Slide 21 text
PHPUnit in PHPStorm
• You can integrate your testing routine into PHPStorm
• PHPStorm support testing with code coverage option
čtvrtek, 25. července 13
Slide 22
Slide 22 text
• Write testable code
• Write tests
• Deliver code with better quality
čtvrtek, 25. července 13
Slide 23
Slide 23 text
Questions?
čtvrtek, 25. července 13
Slide 24
Slide 24 text
• Write some tests for your code
• Next time tell us your experience
• Next time we will learn how to write acceptance tests
What next?
čtvrtek, 25. července 13
Slide 25
Slide 25 text
Thank you for your attention!
Please fill feedback form on http://bit.ly/feedback-code-testing
čtvrtek, 25. července 13