test in action – week 1
TRANSCRIPT
Test in Action – Week 1Introduction
Hubert Chan
What is Test?
• Testing– Definition• Verification between actual and expected result
– Example• fibonacci(6) == 8• Fill <script> string in input box, there is no XSS hole
Definition of Test – Unit Test
• Unit Test– Write code to test your code– White box testing– Unit Under Test• Class• Function
Definition of Test – Unit Test
• Single Failure Point– Limited Dependency– Limited to • Module• Class
Unit Testing Example
• Fibonacci Numberfunction fib($n) { if ($n < 3 ) { return 1; } else { return fib($n-1) + fib($n-2); }}
Unit Testing Example
• Test Coderequire_once(__DIR__ . '/fib.php');
class FibTest extends PHPUnit_Framework_TestCase { public function testfib() { $res = fib(6); $this->assertEquals(8, $res); }}
Unit Testing Example
• Handler Test Codeclass LogHandlerTest extends PHPUnit_Framework_TestCase { public function test_generate_ajax_expect_json() { $handler = new LogHandler(); $res_json = $handler->generate_ajax(); $expect_json = "..."; $this->assertEquals($expect_json, $res_json); }}
Definition of Test – Integration Test
• Integration Test– Testing more dependent modules as a group– Black Box Testing– Usage Model Testing• Feature Based Testing• User Targeted Testing
Definition of Test – Integration Test
• Multiple Failure Point– Dependency– System Wise
Integration Test Example
• Selenium Example<?phprequire_once 'PHPUnit/Extensions/SeleniumTestCase.php'; 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'); }}
DifferenceUnit Testing Integration Test
Speed Fast Relatively Slow
Failure Point Less More
Test Coverage Better Neutral (*)
Failure Path Testing Easier Harder
Benefit of Test
• Facilitates Change– Ensure modules still work correctly after change– Foundation of change• Feature change• Refactoring
What’s good Unit Test
• Good Unit Test– Automated and repeatable– Reliable and consistent result– Focus on units– Anyone/CI should be able to run it– It should run at the push of a button– It should run quickly
Benefit of Unit Test
• Software Quality Enhancement– Verification• Catch bugs in code level• Faster than integration test• Quality Enforcing
– Faster bug identification• Identify the bugs location
Benefit of Unit Test
• Documentation– Living documentation of the module– Gain a basic understanding of the unit API
Benefit of Unit Test
• Code Quality Enhancement– Foundation of Refactoring– Test drives better OO design• Good OO design is essential for unit test
– Testability• Singleton => Anti-Pattern for testing
Hard to do Unit Test?
• Why?– Too complex• Violate Single Responsibility Principle
– Breaking encapsulation– Not program by interface– Messy hierarchy and responsibility
What’s TDD?
• Principle– Red– Green– Refactor
TDD – Red
• Red– Before actual implementation– Write a test that fails
TDD – Red (Example)
• Red– Before writing LogHandler implementation– Write the test code first class LogHandlerTest extends PHPUnit_Framework_TestCase { public function test_generate_ajax_expect_json() { $handler = new LogHandler(); $res_json = $handler->generate_ajax(); $expect_json = "..."; $this->assertEquals($expect_json, $res_json); }}
TDD – Green
• Green– Make the code work– Using mock/stub for dependency
TDD – Green (Example)
• Green (Example)class LogHander { private dbmodel; public function generate_ajax() { $data = dbmodel->query(); return $this->data_to_json($data); } protected function data_to_json($data) { // processing ... return json_encode($res); }}
TDD – Green (Example)
• In Green Example– Faking in TDD• We need a “fake” dbmodel• Can dbmodel->query() return dummy data?
– Think• How do we fake it?• Is it a good responsibility for module?
TDD – Refactor
• Refactor– Do Refactoring– Implement Real dbmodel– It breaks the test• Repeat another TDD cycle
Benefit of TDD
• Benefit– Make you think about your design• Design by Contract• Modularize/Flexible/Extensible
– Enforce you have tests
Continuous Integration
• Continuous Integration– Automation• Build • Testing
– More• Static Code Analysis• Test Coverage• Coding Style Checking
Continuous Integration
• Benefit of Continuous Integration– Fully automate– Catch and enforce to fix bugs– Report
Q & A
• How do you think about testing?• Think about– TDD / Testing is not elixir– BDD and ATDD– Real OO design– Legacy Code