10
votes

Avec PHPUNIT, comment fonctionne-t-il un code d'initialisation avant que tous les tests soient exécutés?

Nous exécutons actuellement le code pour configurer la base de données dans Setupbeforeclass. Cependant, cela fonctionne avant que chaque classe de test soit testée. Est-il possible d'avoir exécuté de code une fois avant que les tests sont exécutés, et peut-être exécuter du code lorsque tous les tests sont trop complets?


1 commentaires

J'ai le même besoin: initier ma base de données avant de lancer des tests. Pouvez-vous poster une réponse avec votre solution détaillée?


3 Réponses :


-4
votes

Pourquoi voudriez-vous faire cela? Les tests d'unités doivent être indépendants les uns des autres et si toutes les préconditions sont donc également restaurées au même état avant que chaque test soit exécuté.

Si vous ressentez la nécessité d'avoir une méthode d'initialisation qui fonctionne une fois pour toute la suite, vos tests ne sont probablement pas configurés à droite.


2 commentaires

Nous voulons apporter la base de données et la déchirer une fois, pas pour chaque test. Nous avons des transactions en place pour isoler les tests.


Bien que je suis d'accord avec vous en principe, il existe de nombreuses raisons légitimes de le faire, l'un de cet exemple est ce que @subone mentionné. Je teste Laravel via Travis.ci et je dois exécuter les scripts de création de la base de données pour vous assurer qu'il a le bon environnement pour les tests.



0
votes

Je suis d'accord avec le commentaire de Kris que vous souhaitez éviter ce type de comportement, mais si vous en avez besoin, vous pourriez peut-être faire quelque chose comme ceci:

class My_PHPUnit_Framework_TestCase extends PHPUnit_Framework_TestCase {
    function __construct() {
       parent::__construct();
       // Insert your one time setup scripts here
    }
}


3 commentaires

Si je comprends bien, cela équivaudrait à setupbeforeclass


En fait, tous les cas de test sont instanciés avant que toutes les méthodes de test soient exécutées - une méthode de test par jeu de données et une instance supplémentaire par procédé avec un @DataProvider . Si vous remplacez le constructeur, vous devez vous assurer d'accepter et de transmettre également les trois paramètres.


@Subone, ce n'est pas équivalent à setupbeforeclass, sa fonction statique



14
votes

Ceci est précisément ce que le fichier bootstrap est conçu pour gérer. Par défaut, phpunit exécutera le code dans bootstrap.php dans le répertoire actuel. Vous pouvez utiliser le phpunit.xml fichier de configuration ou - bootstrap commutateur de ligne de commande pour pointer vers un fichier différent.

Ce fichier est exécuté exactement une fois avant d'essayer de localiser les tests à exécuter. Il vous permet de configurer un chemin d'accès, de l'autochargeur, des constantes, etc. avant d'instantifier ou d'exécuter des tests.


1 commentaires

C'est ce que je cherchais. Quelqu'un m'a mentionné ça hier. Je ne sais pas pourquoi je ne pensais pas à cela.