Skip to content

[deprecated] Contribution : Écrire et faire passer des tests

LucileDT edited this page Sep 6, 2022 · 1 revision

Tests

Les tests sont réalisés via PHPUnit.

Les tests sont automatiquement effectués lors d'un push, voir la partie sur les Git Hooks, mais ils peuvent aussi être lancés manuellement.

⏯️ Lancer manuellement les tests

Une base de données vierge dédiée est automatiquement créée à chaque fois que les tests sont exécutés.

💡 Pensez à faire un composer install avant de lancer les tests pour être sûr.e d'avoir les libraries utilisées à jour.

Lancer le serveur de test

Le serveur web doit être lancé dans l'environnement de test :

php bin/console server:run -e test

Lancer le navigateur utilisé pour les tests

Chrome ou Chromium doit être ouvert pour permettre l'exécution des tests fonctionnels. Utilisez au choix en fonction de celui que vous avez installé :

Mode actif (la fenêtre du navigateur va prendre le focus)

google-chrome-stable --remote-debugging-address=0.0.0.0 --remote-debugging-port=9222 (pour Chrome)

chromium-browser --remote-debugging-address=0.0.0.0 --remote-debugging-port=9222 (pour Chromium)

Mode headless (les tests se feront en tâche de fond)

google-chrome-unstable --disable-gpu --headless --remote-debugging-address=0.0.0.0 --remote-debugging-port=9222 (pour Chrome)

chromium-browser --disable-gpu --headless --remote-debugging-address=0.0.0.0 --remote-debugging-port=9222 (pour Chromium)

Excécuter les tests

Dans le répertoire du projet :

./vendor/bin/simple-phpunit

👩‍💻 Développer des jeux de test

ℹ️ Nous nous réservons le droit de refuser les pull requests ne passant pas les tests.

ℹ️ Nous nous réservons le droit de refuser les pull requests faisant baisser le code coverage. Pour cette raison, veillez à développer en parallèle des fonctionnalités que vous ajoutez des jeux de test conséquents.

Tests unitaires

Les méthodes des modèles (Entity) doivent être testées au même titre que les méthodes des services.

Tests fonctionnels

Chaque page créée doit être testée, ainsi que ses interactions avec les autres pages (liens entrants et sortants) et ce pour chaque rôle. Ce travail est fastidieux mais nous évitera beaucoup de problème au fil du développement. Merci de maintenir l'application en ajoutant les tests fonctionnels liés à vos développements ainsi qu'en maintenant les tests existants.

Tester une page n'utilisant pas de JavaScript

Pour les tests sur les pages qui fonctionnent sans interaction Javascript, la connexion à l'application par un utilisateur (nécessaire pour la tester) s'effectue de la façon suivante :

// Session creation
$client = static::createClient();
$container = static::$kernel->getContainer();
$session = $container->get('session');

// Get the user
$person = self::$kernel->getContainer()->get('doctrine')->getRepository('AppBundle:User')->findOneByUsername('username');
// Create the token used to connect the user
$token = new UsernamePasswordToken($person, null, 'main', $person->getRoles());

// Set the session
$session->set('_security_main', serialize($token));
$session->save();

// Set the cookie
$client->getCookieJar()->set(new Cookie($session->getName(), $session->getId()));
$crawler = $client->request('GET', '/url');

Plusse d'information ici :

https://github.com/dmaicher/doctrine-test-bundle#debugging https://github.com/dmaicher/doctrine-test-bundle/blob/master/tests/Functional/FunctionalTest.php

Tester une page utilisant du JavaScript

Pour exécuter le JavaScript, il est nécessaire de faire appel à un navigateur capable de l'exécuter. Le navigateur utilisé par défaut dans les tests fonctionnels Symfony ne le permettant pas, nous avons choisi d'utiliser dans le cadre de ce projet Mink couplé à ChromeDriver. Chrome offre plus de fonctionnalités que les autres drivers, et Mink permet de coupler ce driver avec PHPUnit.

Pour tester une page de l'application, il faut être connecté. La connexion avec Mink s'effectue de la façon suivante :

$mink = new Mink(array(
            'browser' => new Session(new ChromeDriver('http://localhost:9222', null, 'http://www.google.com'))
        ));
$mink->setDefaultSessionName('browser');
$mink->getSession()->visit('http://127.0.0.1:8000/');

// !! Keep the same double fillField, otherwise it can lead to errors
// The browser prefills the form fields and it's the only way to erase them
$mink->getSession()->getPage()->fillField("_username", "username");
$mink->getSession()->getPage()->fillField("_username", "username");
$mink->getSession()->getPage()->fillField("_password", "password");
$mink->getSession()->getPage()->fillField("_password", "password");