Débâcle de test prononcée... Je suppose que vous pouvez laisser de côté la partie -db- si vous voulez un mot légèrement plus court et que vous vous sentez si enclin.
Test-DB-Acle est une bibliothèque PHP pour faciliter l'écriture de tests simples et concis pour la couche de base de données.
Je pense que l'écriture de tests doit être aussi simple que possible pour le développeur, et qu'ils doivent également être aussi faciles à lire que possible pour que les autres développeurs puissent les comprendre.
Cela signifie que toutes les données de test du test doivent être pertinentes uniquement pour le scénario de test. La plupart des tables de base de données comportent cependant des colonnes non nulles qui vous obligent à saisir des données factices qui ne font qu'introduire du bruit cognitif dans le test.
Test-Db-Acle vise à alléger ce fardeau du développeur. Le framework de test ne fait aucune hypothèse sur le fonctionnement de vos classes de couche de base de données, si elles utilisent un ORM comme Doctrine, des procédures stockées ou du SQL pur, le principe est toujours le même, à un moment donné, le code interagit avec les données des tables de base de données. , et nous devons tester cela.
Installation via le compositeur
désactive les vérifications de clés étrangères dans la base de données
traite automatiquement les colonnes non nulles
coupe automatiquement les colonnes date/heure dans MySQL lorsque les valeurs sont affirmées dans les tables de base de données - utile pour les horodatages insérés (dans SQLite, ces colonnes doivent être spécifiées)
pratiquement tous les composants peuvent être échangés et remplacés par des variétés personnalisées
prend actuellement en charge Mysql et SQLite
Est indépendant du framework, il ne fait aucune hypothèse si des ORM sont utilisés par exemple et devrait être facilement adaptable à d'autres frameworks de tests unitaires.
Les bases de données prises en charge sont actuellement MySql (et par extension MariaDB) et Sqlite.
L'architecture doit permettre d'ajouter d'autres bases de données.
Cette bibliothèque peut être utilisée directement avec PHPUnit. Il devrait être assez facile de l'utiliser avec d'autres frameworks de test en utilisant les traits fournis et en déléguant la méthode 'assertEquals' à la méthode équivalente (par exemple, je me souviens qu'il s'agissait de 'assertEqual' dans SimpleTest)
J'ai fourni un simple TestDbAclePhpUnitAbstractTestCase ainsi que TestDbAclePhpUnitTraitsDatabaseHelperTrait si vous utilisez PHP 5.4 et que cela ne vous dérange pas d'utiliser des traits.
Ok, pour être vraiment honnête, tester la couche de base de données coûte cher et ralentit les tests, et dans la mesure du possible, toutes les dépendances sur la base de données doivent être moquées. Mais parfois, nous devons simplement le faire, en espérant que dans une application bien structurée, cela puisse être réduit au minimum.
Il existe de nombreux outils et approches disponibles (par exemple DBUnit ou l'utilisation de méthodes d'usine dans vos tests unitaires) pour vous aider à tester les bases de données, chacune avec ses propres atouts. Cette approche fonctionne pour moi car :
Je n'ai pas à me soucier des colonnes nulles ou des contraintes de clé étrangère
Je fournis un ensemble de données minimal pour mes tests
Je peux voir les données de test dans un format de type grille au-dessus des tests et à nouveau lors de l'affirmation des données dans la base de données.
J'ai donc mis en place ma propre solution.
###Alors comment ça marche et à quoi ça ressemble ? Montre-moi un exemple !###
L'idée est d'utiliser une chaîne de texte "valeurs séparées par des tuyaux", appelons-la PSV - comme dans CSV, mais avec des tuyaux - pour configurer des montages de test comme celui-ci :
(Le format du PSV est très similaire au format utilisé par l'excellent framework Behat BDD (https://github.com/Behat/Behat))
$dbTablesToSetup="[table_name]id |date |name |value |dependent_table_id10 |2001-01-01 |foo |900 |60[dependent_table]id |name20 |Bar60 |Baz";//utilisez ceci si vous ne souhaitez pas utilisez les traits fournis ou les cas de test abstraits$testDbAcle = TestDbAcleTestDbAcle::create($pdo);$testDbAcle->runCommand(new TestDbAcleCommandsSetupTablesCommand($dbTablesToSetup));//utilisez ceci si vous avez étendu votre scénario de test à partir de TestDbAclePhpUnitAbstractTestCase ou si vous utilisez le TestDbAclePhpUnitTraitsDatabaseHelperTrait:$this->setupTables($dbTablesToSetup);
Le framework lui-même sait quelles colonnes ne sont pas NULL dans la table et insère des valeurs par défaut... En fait, supposons que la table nom_table comporte 30 colonnes qui ne sont toutes pas nulles....
En outre, diverses contraintes de clé étrangère peuvent exister en arrière-plan. Test-Db-Acle désactive temporairement les vérifications de clés étrangères, nous n'avons donc pas à nous soucier de cela ni de l'ordre dans lequel nous insérons les données de test.
###Que diriez-vous d'un test réel....?### Tout d'abord, si vous utilisez PHP5.4, vous pouvez utiliser la version traits :
la classe ExempleTest étend PHPUnit_Framework_TestCase implémente TestDbAclePhpUnitAbstractTestCaseInterface {utilisez TestDbAclePhpUnitTraitsDatabaseHelperTrait ; /** * Cette méthode doit être implémentée, elle doit renvoyer l'objet PDO qui doit être utilisé dans la base de données * * @return Pdo */public function providePdo() {return new Pdo("mysql:dbname=my_db_tests;host=localhost",'myTestUser', 'myTestPassword'); } /* * Un exemple de test */public function test_AddressService() {$this->setupTables(" [adresse] adresse_id |entreprise 1 |moi 3 |vous [utilisateur] utilisateur_id |nom 10 |Jean 20 |Mary "); $this->setAutoIncrement('adresse', 100); $this->addressService->addEntry("eux");$this->assertTableStateContains(" [adresse] adresse_id |entreprise 1 |moi 3 |vous 100 |eux [utilisateur] id_utilisateur |nom 10 |Jean 20 |Marie ", array(), "Les choses fonctionnent"); } }
Si vous n'utilisez pas de traits, vous pouvez utiliser AbstractTestCase
, mais vous ne pourrez pas utiliser vos propres classes de test de base dans ce cas.
la classe ExempleTest étend TestDbAclePhpUnitAbstractTestCase { protected $addressService;function Setup(){parent::Setup();$this->addressService = new ServicesAddressService(); }/** * Cette méthode doit être implémentée, elle doit renvoyer l'objet PDO qui doit être utilisé dans la base de données * * @return Pdo */public function providePdo() {return new Pdo("mysql:dbname=my_db_tests;host=localhost",'myTestUser', 'myTestPassword'); }fonction test_AddressService() {$this->setupTables(" [adresse] adresse_id |entreprise 1 |moi 3 |vous [utilisateur] utilisateur_id |nom 10 |Jean 20 |Mary "); $this->setAutoIncrement('adresse', 100); $this->addressService->addEntry("eux");$this->assertTableStateContains(" [adresse] adresse_id |entreprise 1 |moi 3 |vous 100 |eux [utilisateur] id_utilisateur |nom 10 |Jean 20 |Marie ", array(), "Les choses fonctionnent"); } }
Ok, évidemment ServicesAddressService n'existe pas ici (hé, c'est d'abord le test, non ?) et l'exemple est assez simple.
Dans la vraie vie, je placerais la méthode getPdo dans une classe de test de base commune pour le projet et elle pourrait être obtenue de manière très différente qu'ici. Mais bon, ceci est un exemple.
Comme vous pouvez le constater, setupTables peut configurer plusieurs tables à la fois et assertTableStateContains peut également vérifier l'état de plusieurs tables en même temps.
De la même manière que setupTables peut configurer des tables comportant beaucoup plus de colonnes que celles spécifiées, assertTableStateContains compare et affirme également les valeurs des colonnes spécifiées.
Le moyen le plus simple d'installer Test-Db-Acle consiste à utiliser composer ( Pour en savoir plus ici : http://packagist.org ), et je recommande fortement d'utiliser cette approche, bien que vous puissiez également décompresser le package dans un dossier et activer le chargement automatique pour le manuellement sous la forme que vous souhaitez (il utilise la convention de dénomination psr-0)
Pour l'utiliser avec composer, ajoutez ceci à votre fichier composer.json :
"require": { "test-db-acle/test-db-acle" : "dev-master" }, "repositories" : [ { "type": "git", "url": "https://github.com/malteriesch/test-db-acle.git" } ]
Vous pouvez également utiliser https://packagist.org/packages/test-db-acle/test-db-acle si vous préférez.
Les contributions (et critiques) sont plus que bienvenues... !
###Comment exécuter les tests Test-Db-Acle### Pour exécuter les tests, vous devrez créer une base de données vide sur un serveur MySql de votre choix, copier tests/Functional/config.php.dist dans tests/ Functional/config.php et remplissez-le avec les détails de votre base de données. Ensuite, espérons-le, tous les tests devraient être exécutés. (La base de données n'est en réalité nécessaire que pour le test de fumée fonctionnel)
Syntaxe PSV
Cas de test abstrait
Extension et personnalisation de TestDbAcle
Journal des modifications