Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Les tests en Symfony

GBProd
February 20, 2018

Les tests en Symfony

Slides pour les cours d'IUT sur les tests en Symfony

GBProd

February 20, 2018
Tweet

More Decks by GBProd

Other Decks in Programming

Transcript

  1. Les tests en Symfony

    View Slide

  2. Les tests en Symfony

    View Slide

  3. Les tests en PHP

    View Slide

  4. Les tests en PHP

    View Slide

  5. Les tests

    View Slide

  6. about:me
    @GillesRoustan

    View Slide

  7. View Slide

  8. View Slide

  9. about:tests

    View Slide

  10. C’est quoi un (bon) test ?

    View Slide

  11. View Slide

  12. Du code qui vérifie le
    comportement du code

    View Slide

  13. Un peu de théorie ?

    View Slide

  14. View Slide

  15. Pyramide de Cohn

    View Slide

  16. View Slide

  17. Hiérarchie des tests
    Pyramide de Cohn

    View Slide

  18. Tests Unitaires
    Tests fonctionnels /
    intégration
    IHM
    Tests fonctionnels
    manuels

    View Slide

  19. View Slide

  20. Tests unitaires :
    Teste une portion isolée de
    code

    View Slide

  21. Tests fonctionnel :
    Teste une fonctionnalité de
    l’application

    View Slide

  22. View Slide

  23. Tests IHM :
    Vérifie que c’est joli

    View Slide

  24. Tests IHM :
    Vérifie que c’est joli

    View Slide

  25. Tests manuels :

    View Slide

  26. Ce qu’il faut éviter

    View Slide

  27. Tests
    Unitaires
    Tests de intégration
    / fonctionnels
    Tests IHM
    Tests fonctionnels manuels

    View Slide

  28. View Slide

  29. Pourquoi on teste ?

    View Slide

  30. Valide que le code répond aux
    spécifications attendues

    View Slide

  31. Trouver les problèmes/bugs

    View Slide

  32. Trouver les effets de bords

    View Slide

  33. View Slide

  34. Refactorer sereinement

    View Slide

  35. Être agile
    Responding to change over following a plan

    View Slide

  36. Donne confiance

    View Slide

  37. Conduit (souvent) à un
    meilleur design
    STUPID

    View Slide

  38. Devient la documentation du
    code

    View Slide

  39. Pour le patron ?

    View Slide

  40. Pour le patron :
    FAIRE DES ÉCONOMIES

    View Slide

  41. View Slide

  42. Qu’est-ce qu’un bon test ?

    View Slide

  43. F.I.R.S.T

    View Slide

  44. Fast

    View Slide

  45. Independant

    View Slide

  46. Repeatable

    View Slide

  47. Self-validating

    View Slide

  48. Timely

    View Slide

  49. View Slide

  50. about:tdd

    View Slide

  51. Test-driven development

    View Slide

  52. Red
    Green
    Refactor

    View Slide

  53. Red
    Green
    Refactor

    View Slide

  54. Red
    Green
    Refactor

    View Slide

  55. Red
    Green
    Refactor

    View Slide

  56. Composition d’un test

    View Slide

  57. Prepare
    Act
    Check

    View Slide

  58. Un mauvais test vaut mieux
    que pas de tests

    View Slide

  59. Prédictible

    View Slide

  60. about:frameworks

    View Slide

  61. Les frameworks de tests en
    PHP

    View Slide

  62. Atoum

    View Slide

  63. PHPUnit

    View Slide

  64. PHPSpec

    View Slide

  65. WebTestCase

    View Slide

  66. Behat

    View Slide

  67. Selenium

    View Slide

  68. PhantomJS / CasperJS

    View Slide

  69. Les assertions

    View Slide

  70. $this->assert*()

    View Slide

  71. $this->assertTrue()
    $this->assertFalse()
    $this->assertEquals()
    $this->assertNull()
    $this->assertInstanceOf()

    View Slide

  72. webmozart/assert

    View Slide

  73. about:mocks

    View Slide

  74. Mock / Stub

    View Slide

  75. Mock PHPUnit

    View Slide

  76. $stub = $this
    ->createMock(SomeClass::class);

    View Slide

  77. $stub->method(‘doItNow’)
    ->willReturn(‘Oui chef !’);

    View Slide

  78. $stub->method(‘doItNow’)
    ->willReturn(‘Oui chef !’);

    View Slide

  79. $em
    ->expects($this->once())
    ->method(‘flush’);

    View Slide

  80. $rickRoll
    ->expects($this->never())
    ->method("makeYouUnderstand")
    ->willReturn("give you up");

    View Slide

  81. View Slide

  82. Mock PHPSpec

    View Slide

  83. $stub = $this
    ->prophesize(SomeClass::class);

    View Slide

  84. $stub->doItNow()
    ->willReturn(‘Oui chef !’);

    View Slide

  85. $stub->method(‘doItNow’)
    ->willReturn(‘Oui chef !’);

    View Slide

  86. $em->flush()
    ->shouldBeCalled();

    View Slide

  87. $rickRoll
    ->makeYouUnderstand()
    ->willReturn(‘give you up’)
    ->shouldNotBeCalled();

    View Slide

  88. $rickRoll->reveal();

    View Slide

  89. Expectations

    View Slide

  90. $this->expectException(
    \InvalidArgumentException::class
    );

    View Slide

  91. Fixtures

    View Slide

  92. Alice

    View Slide

  93. PHPUnit/DbUnit

    View Slide

  94. DoctrineFixtureBundle

    View Slide

  95. liip/LiipFunctionalTestBundle

    View Slide

  96. Mysql Dump

    View Slide

  97. WebTestCase

    View Slide

  98. use
    Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
    class AwesomeControllerTest extends WebTestCase

    View Slide

  99. $client = static::createClient();

    View Slide

  100. $client->getResponse()->getContent()

    View Slide

  101. $crawler = $client->request(
    'GET',
    '/lucky'
    );

    View Slide

  102. View Slide

  103. $client->request(
    'POST',
    '/submit',
    ['name' => 'GBProd']
    );

    View Slide

  104. $crawler
    ->filter(
    'html:contains("Hello World")'
    )
    ->count()

    View Slide

  105. 'a:contains("Pay for it!")'
    'ul.tags > li'
    'input[type=submit]'
    'h3[test-tag="cgu-title"]'

    View Slide

  106. $form = $crawler
    ->filter(
    'input[test-tag=pay-button]'
    )
    ->form();

    View Slide

  107. about:metrics

    View Slide

  108. Code coverage

    View Slide

  109. Code coverage

    View Slide

  110. Code coverage

    View Slide

  111. Mutations
    Modifier le code pour faire planter les tests

    View Slide

  112. Mutations
    kahlan

    View Slide

  113. about:test-after

    View Slide

  114. about:test-after

    View Slide

  115. Détecter les spécifications

    View Slide

  116. if / else / while / for / switch...

    View Slide

  117. Have a break

    View Slide

  118. about:kata

    View Slide

  119. Kata FizzBuzz

    View Slide

  120. Fizz Buzz
    Ecrire une méthode fizzbuzzify(int n) qui retourne une chaîne de caractères (string) à partir
    du nombre n.
    Pour les multiples de 3, il faudra remplacer le nombre par Fizz.
    Pour les multiples de 5, il faudra remplacer le nombre par Buzz.
    Pour les multiples et 3 et de 5, il faudra remplacer le nombre par FizzBuzz.
    Sinon on renvoie le nombre sans le modifier.
    Exemple :
    1 2 Fizz 4 Buzz …
    Remarque : Pour 15, il faudra afficher FizzBuzz.

    View Slide