Tests
Tests unitaires
Un test unitaire vérifie que le comportement attendu est le bon, ce qui permet de gagner énormément de temps.
Ex : un getter doit retourner la bonne valeur 100 fois.
On ne fait pas de test unitaire sur des valeurs aléatoires, mais sur des choses qui se répètent et donnent toujours le même résultat.
Créer un test unitaire :
- installer le paquet :
composer require --dev symfony/test-pack(potentiellement mettre Ă jour le php.ini)
- créer un nouveau test :
symfony console make:test>TestCase> nom logique dans des dossiers pour avoir exactement la mĂŞme structure que src :Controller\MovieControllerTest
TestCase = tests basiques de PHPUnit (est-ce que la classe PHP fonctionne ?)
2. KernelTestCase = tests basiques qui ont accès aux services Symfony (ex : la classe testée peut être un contrôleur qui retourne un Twig)
3. WebTestCase = simule le comportement d’un navigateur web (sans exécuter de code JavaScript), avec des requêtes HTTP, des déplacements dans application, l’utilisation des boutons, formulaires…
4. ApiTestCase = simule le comportement avec une API
5. PantherTestCase = magie, simule le comportement “E2E” (end to end) où il ouvre un vrai navigateur et déplace même la souris
—> Nous, les tests 1 et 2 pour l’instant.
Lancer les tests unitaires (tous ceux qu’on a écrits) : php bin/phpunit
(on obtient le pourcentage de tests lancés qui ont réussi.)
Les tests auto-générés ne sont pas à utiliser tels quels (on vérifie si vrai est vrai). On les modifie à façon.
Exemple de test utile : si la date de sortie est inférieure à la date du jour, alors elle ne doit pas être modifiée.
namespace App\Tests\Controller;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
class MovieControllerTest extends WebTestCase
{
public function testSomething(): void
{
$client = static::createClient();
$client->request('GET', '/');
$this->assertResponseIsSuccessful();
}
}
De nombreuses méthodes sont disponibles :
- pour faire des opérations simples
$this->assertTrue();
$this->assertEquals();
$this->assertNull();
...- pour faire des requêtes, notamment avec l’objet
$client
$client->request(method, url);
$client->back();
$client->forward();
$client->reload();
// clears all cookies and the history
$client->restart();
$client->followRedirects();- pour faire des assertions, notamment du type
assertResponse...(),assertRequest...(),assertBrowser...(),…
Base de données de tests
Un .env.test a été créé : généralement on ne fait pas les tests sur la base de données de production mais sur une autre, on indique la DATABASE_URL correspondante.
Elle est créée en spécifiant l’environnement de travail concerné : symfony console doctrine:database:create --env=TEST.
BP : La base de données de tests est généralement un autre type de base de données (SQLite, par exemple).
Fixtures
Les fixtures permettent de remplir la base de données de tests avec de fausses données (aléatoires ou choisies).
- installer le paquet :
composer require orm-fixtures --dev
- créer une fixture :
symfony console make:fixture>AppFixtures(déjà créé à l’installation du paquet)
- compléter la classe PHP (qui hérite de
Fixture) avec une liste de données :
class AppFixtures extends Fixture
{
public function load(ObjectManager $manager)
{
// on met un film
$movie = new Movie();
//ici on remplit les attributs
// on persist en base
$manager->persist($serie);
$manager->flush();
}
}- au lancement des tests, la base de données sera remplie avec ces données
L’insertion de fausses données aléatoires est possible.
- installer en plus le paquet :
composer require --dev fzaninotto/faker
- dans un script PHP, importer le faker/factory et créer une série aléatoire de données en spécifiant les types d’attributs attendus
$faker = Faker\Factory::create('fr_FR');
for($i=0; $i < 1000; $i++) {
$movie = new Movie();
// on choist des attributs et faker-> a plein de méthodes de génération
$movie->setDateCreated($faker->dateTime);
$manager->persist($serie):
}
Une fois les scripts de données de tests prêts,
- on met à jour la structure de la base de données de tests (schémas et tables —DDL) :
symfony console doctrine:sschema:update --force --env=test
- on charge les fixtures (données —DML) :
symfony console doctrine:fixture:load --env=test