Unit and Functional Testing with Symfony2

34,038 views
33,707 views

Published on

Published in: Technology
4 Comments
44 Likes
Statistics
Notes
No Downloads
Views
Total views
34,038
On SlideShare
0
From Embeds
0
Number of Embeds
14
Actions
Shares
0
Downloads
380
Comments
4
Likes
44
Embeds 0
No embeds

No notes for slide

Unit and Functional Testing with Symfony2

  1. 1. Unit & Functional Tests Fabien Potencier
  2. 2. Standardization
  3. 3. PHPUnit 3.5
  4. 4. Best practices
  5. 5. AllTests.php
  6. 6. phpunit.xml(.dist) <phpunit backupGlobals="false" backupStaticAttributes="false" colors="false" convertErrorsToExceptions="true" convertNoticesToExceptions="true" convertWarningsToExceptions="true" processIsolation="true" stopOnFailure="false" syntaxCheck="false" bootstrap="../src/autoload.php" >
  7. 7. <testsuites> <testsuite name="Project Test Suite"> <directory> ../src/Application/*/Tests </directory> </testsuite> </testsuites>
  8. 8. <filter> <whitelist> <directory>../src/Application</directory> <exclude> <directory> ../src/Application/*/Resources </directory> <directory> ../src/Application/*/Tests </directory> </exclude> </whitelist> </filter>
  9. 9. Application/ HelloBundle/ Model/ Article.php Tests/ Model/ ArticleTest.php Application/Tests/Model/ArticleTest.php
  10. 10. $ phpunit –c hello/
  11. 11. $ cd hello/ $ phpunit
  12. 12. $ phpunit -c hello/ src/Application/HelloBundle/ $ phpunit -c hello/ src/Application/HelloBundle/ Tests/Controller/HelloControllerTest.php
  13. 13. $ cd hello/ $ phpunit --coverage-html=cov/
  14. 14. Standard artifacts --coverage-clover=clover.xml --log-junit=junit.xml
  15. 15. Functional Tests
  16. 16. Do not write Unit Tests for a Controller
  17. 17. namespace ApplicationHelloBundleTestsController; use SymfonyFrameworkWebBundleTestWebTestCase; class HelloControllerTest extends WebTestCase { public function testIndex() { $client = $this->createClient(); $crawler = $client->request( 'GET', '/hello/Fabien'); $this->assertTrue($crawler->filter( 'html:contains("Hello Fabien")')->count()); } }
  18. 18. $client = $this->createClient(); $crawler = $client->request( 'GET', '/hello/Fabien'); $this->assertTrue($crawler->filter( 'html:contains("Hello Fabien")')->count());
  19. 19. Environment Debug mode $this->createClient('test', true);
  20. 20. # hello/config/config_test.yml imports: - { resource: config_dev.yml } web.config: toolbar: false zend.logger: priority: debug kernel.test: ~
  21. 21. The Client makes requests to the Symfony2 application The Crawler parses the Response to allow navigation The PHPUnit Assertions tests the Response
  22. 22. Assertions
  23. 23. $this->assertEquals( 10, $crawler->filter('div.hentry')->count()); $this->assertTrue( $client->getResponse()->isSuccessful());
  24. 24. The Client / The Crawler
  25. 25. $crawler = $client->request( 'GET', 'hello/Lucas' );
  26. 26. $link = $crawler->selectLink("Greet Lucas"); $client->click($link);
  27. 27. $form = $crawler->selectButton('submit'); $client->submit($form, array( 'name' => 'Lucas', 'country' => 'France', 'like_symfony' => true, 'photo' => '/path/to/lucas.jpg', ));
  28. 28. $harry = $this->createClient(); $sally = $this->createClient(); $harry->request('POST', '/say/sally/Hello'); $sally->request('GET', '/messages'); $this->assertEquals(201, $harry->getResponse()->getStatusCode()); $this->assertRegExp('/Hello/', $sally->getResponse()->getContent());
  29. 29. $harry = $this->createClient(); $sally = $this->createClient(); $harry->insulate(); $sally->insulate(); $harry->request('POST', '/say/sally/Hello'); $sally->request('GET', '/messages'); $this->assertEquals(201, $harry->getResponse()->getStatusCode()); $this->assertRegExp('/Hello/', $sally->getResponse()->getContent());
  30. 30. Main PHP Process 1 4 $harry = $this->createClient(); $this->assertEquals(201, $sally = $this->createClient(); $harry->getResponse()->getStatusCode()); $this-­‐>assertRegExp('/Hello/',   $harry->insulate();    $sally-­‐>getResponse()-­‐>getContent());   $sally->insulate(); 2 Forked PHP Process $harry->request('POST', '/say/sally/Hello'); 3 Forked PHP Process $sally-­‐>request('GET',  '/messages');
  31. 31. Main PHP Process 1 3 $harry = $this->createClient(); $sally->request('GET', '/messages'); $sally = $this->createClient(); $this->assertEquals(201, $harry->insulate(); $harry->getResponse()->getStatusCode()); $this-­‐>assertRegExp('/Hello/',      $sally-­‐>getResponse()-­‐>getContent());   2 Forked PHP Process $harry->request('POST', '/say/sally/Hello');
  32. 32. Simulate or use HTTP
  33. 33. $response = $client->getResponse(); $profiler = $this->getProfiler($response); if ($profiler) { $this->assertEquals(2, $profiler['db']->getQueryCount()); $this->assertEquals('blog_post', $profiler['app']->getRoute()); $this->assertTrue( $profiler['timer']->getTime() < 0.5); }
  34. 34. Questions?
  35. 35. Sensio S.A. 92-98, boulevard Victor Hugo 92 115 Clichy Cedex FRANCE Tél. : +33 1 40 99 80 80 Contact Fabien Potencier fabien.potencier at sensio.com http://www.sensiolabs.com/ http://www.symfony-project.org/ http://fabien.potencier.org/

×