Unit and Functional Testing with Symfony2

  • 28,609 views
Uploaded on

 

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
No Downloads

Views

Total Views
28,609
On Slideshare
0
From Embeds
0
Number of Embeds
12

Actions

Shares
Downloads
355
Comments
4
Likes
36

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Unit & Functional Tests Fabien Potencier
  • 2. Standardization
  • 3. PHPUnit 3.5
  • 4. Best practices
  • 5. AllTests.php
  • 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. <testsuites> <testsuite name="Project Test Suite"> <directory> ../src/Application/*/Tests </directory> </testsuite> </testsuites>
  • 8. <filter> <whitelist> <directory>../src/Application</directory> <exclude> <directory> ../src/Application/*/Resources </directory> <directory> ../src/Application/*/Tests </directory> </exclude> </whitelist> </filter>
  • 9. Application/ HelloBundle/ Model/ Article.php Tests/ Model/ ArticleTest.php Application/Tests/Model/ArticleTest.php
  • 10. $ phpunit –c hello/
  • 11. $ cd hello/ $ phpunit
  • 12. $ phpunit -c hello/ src/Application/HelloBundle/ $ phpunit -c hello/ src/Application/HelloBundle/ Tests/Controller/HelloControllerTest.php
  • 13. $ cd hello/ $ phpunit --coverage-html=cov/
  • 14. Standard artifacts --coverage-clover=clover.xml --log-junit=junit.xml
  • 15. Functional Tests
  • 16. Do not write Unit Tests for a Controller
  • 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. $client = $this->createClient(); $crawler = $client->request( 'GET', '/hello/Fabien'); $this->assertTrue($crawler->filter( 'html:contains("Hello Fabien")')->count());
  • 19. Environment Debug mode $this->createClient('test', true);
  • 20. # hello/config/config_test.yml imports: - { resource: config_dev.yml } web.config: toolbar: false zend.logger: priority: debug kernel.test: ~
  • 21. The Client makes requests to the Symfony2 application The Crawler parses the Response to allow navigation The PHPUnit Assertions tests the Response
  • 22. Assertions
  • 23. $this->assertEquals( 10, $crawler->filter('div.hentry')->count()); $this->assertTrue( $client->getResponse()->isSuccessful());
  • 24. The Client / The Crawler
  • 25. $crawler = $client->request( 'GET', 'hello/Lucas' );
  • 26. $link = $crawler->selectLink("Greet Lucas"); $client->click($link);
  • 27. $form = $crawler->selectButton('submit'); $client->submit($form, array( 'name' => 'Lucas', 'country' => 'France', 'like_symfony' => true, 'photo' => '/path/to/lucas.jpg', ));
  • 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. $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. 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. 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. Simulate or use HTTP
  • 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. Questions?
  • 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/