Symfony 3.4 et les tests

Par Charles-Édouard Coste / charly@occitanie.social

Sommaire

  • Quelques notions
  • Utilisation de PHPUnit
  • Différents types de tests
  • Bonnes pratiques

Notions

Qu'est ce qu'un test ?

42

Votre question est mal posée.

Ceci est un test


              class Personne {
                private $age;
                public fuction __construct($age) {
                    $this->age = $age;
                    $this->age = 19;
                }
                public function isAdult() {
                    var_dump($this->age);
                    return 18 <= $this->age;
                }
              }
            

Ceci aussi


              $ php -l monfichier.php
            

On sait tous faire des tests

mais comment les automatiser ?

comment les organiser ?

comment les rejouer ?

Automatiser des tests

  • Utiliser des scripts
  • Utiliser des frameworks (PHPUnit, Atoun, PHPSpec,…)

Où mettre mes tests ?

  • Boîte noir => dépôt à part
  • Boîte blanche => avec mon code

Comment rejouer mes tests ?

Tests à états

VS

Tests sans états

en gros… ça dépend

Installation de PHPUnit

De base


              $ symfony new --full --version=3.4 my_project
            

Via flex


              $ composer require --dev symfony/phpunit-bridge
					  

Exécution de PHPUnit


              $ bin/phpunit
		  			

Couverture de code


              $ bin/phpunit --coverage-html=coverage_folder
		  			

Nécessite xdebug


              $ sudo apt install php-xdebug
		  			

Couverture de code

Différents types de tests

Test unitaire


              // tests/AppBundle/Util/CalculatorTest.php
              namespace Tests\AppBundle\Util;

              use AppBundle\Util\Calculator;
              use PHPUnit\Framework\TestCase;

              class CalculatorTest extends TestCase {
                  public function testAdd() {
                      //…
                  }
              }
            

Test "fonctionnel"


              // tests/AppBundle/Repository/ProductRepositoryTest.php
              namespace Tests\AppBundle\Repository;

              use AppBundle\Entity\Product;
              use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;

              class ProductRepositoryTest extends KernelTestCase
              {
                //…
              }
  					

Un autre "test fonctionnel"


              // tests/AppBundle/Controller/PostControllerTest.php
              namespace Tests\AppBundle\Controller;

              use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;

              class PostControllerTest extends WebTestCase
              {
                //…
              }
  					

Bonnes pratiques

Doublures de test

Mocking pratiques

Fixtures

Autowiring

Conclusion

  • Tout test est bon à prendre
  • Privilégiez les tests sans état
  • Rendez votre code testable
  • Lisez la doc