Ausgesprochenes Testdebakel ... Ich schätze, Sie können den -db--Teil weglassen, wenn Sie ein etwas kürzeres Wort möchten und dazu Lust haben.
Test-DB-Acle ist eine PHP-Bibliothek, die das Schreiben einfacher und prägnanter Tests für die Datenbankebene erleichtert.
Ich bin davon überzeugt, dass das Schreiben von Tests für den Entwickler so einfach wie möglich sein sollte und dass sie auch für andere Entwickler so einfach zu lesen wie möglich sein sollten.
Das bedeutet, dass alle Testdaten im Test nur für das Testszenario relevant sein sollten. Die meisten Datenbanktabellen verfügen jedoch über Nicht-Null-Spalten, die die Eingabe von Dummy-Daten erfordern, die lediglich kognitives Rauschen in den Test einbringen.
Ziel von Test-Db-Acle ist es, dem Entwickler diese Last abzunehmen. Das Test-Framework macht keine Annahmen darüber, wie Ihre Klassen auf Datenbankebene funktionieren. Wenn sie ein ORM wie Doctrine, gespeicherte Prozeduren oder reines SQL verwenden, ist das Prinzip immer dasselbe: Irgendwann interagiert der Code mit den Daten in den DB-Tabellen , und wir müssen das testen.
Installation über Composer
Deaktiviert Fremdschlüsselprüfungen in der Datenbank
Behandelt automatisch Nicht-Null-Spalten
schneidet automatisch Datums-/Uhrzeitspalten in MySQL ab, wenn bestätigt wird, dass Werte in Datenbanktabellen vorliegen – nützlich für eingefügte Zeitstempel (in SQLite müssen diese Spalten angegeben werden)
Nahezu alle Komponenten können ausgetauscht und durch kundenspezifische Varianten ersetzt werden
unterstützt derzeit MySQL und SQLite
Ist Framework-unabhängig, macht es keine Annahmen, wenn beispielsweise ORMs verwendet werden, und sollte leicht an andere Unit-Test-Frameworks anpassbar sein.
Unterstützte Datenbanken sind derzeit MySql (und damit auch MariaDB) und Sqlite.
Die Architektur sollte das Hinzufügen weiterer Datenbanken ermöglichen.
Diese Bibliothek kann sofort mit PHPUnit verwendet werden. Es sollte ziemlich einfach sein, es mit anderen Test-Frameworks zu verwenden, indem man die bereitgestellten Merkmale verwendet und die Methode „assertEquals“ an die entsprechende Methode delegiert (ich erinnere mich beispielsweise, dass es in SimpleTest „assertEqual“ war).
Ich habe ein einfaches TestDbAclePhpUnitAbstractTestCase sowie TestDbAclePhpUnitTraitsDatabaseHelperTrait bereitgestellt, wenn Sie PHP 5.4 verwenden und Ihnen die Verwendung von Merkmalen nichts ausmacht.
Ok, um ganz fair zu sein, das Testen der Datenbankschicht ist teuer und verlangsamt die Tests, und wo immer möglich sollten alle Abhängigkeiten von der Datenbank verspottet werden. Aber manchmal müssen wir das einfach tun, hoffentlich kann dies in einer gut strukturierten Bewerbung auf ein Minimum beschränkt werden.
Es stehen viele Tools und Ansätze zur Verfügung (z. B. DBUnit oder die Verwendung von Factory-Methoden in Ihren Unit-Tests), die Sie beim Testen von Datenbanken unterstützen. Jedes hat seine eigenen Stärken. Dieser Ansatz funktioniert für mich, weil:
Ich muss mir keine Gedanken über Nullspalten oder Fremdschlüsseleinschränkungen machen
Ich stelle für meine Tests einen minimalen Datensatz zur Verfügung
Ich kann die Testdaten in einem rasterähnlichen Format über den Tests sehen und noch einmal, wenn die Daten in der Datenbank bestätigt werden.
Also habe ich meine eigene Lösung eingerichtet.
###Wie funktioniert es also und wie sieht es aus? Zeig mir ein Beispiel!###
Die Idee besteht darin, eine Textzeichenfolge mit „durch Pipes getrennten Werten“ zu verwenden, nennen wir sie PSV – wie in CSV, aber mit Pipes –, um Testvorrichtungen wie folgt einzurichten:
(Das Format des PSV ist dem Format des hervorragenden Behat BDD-Frameworks (https://github.com/Behat/Behat) sehr ähnlich.)
$dbTablesToSetup="[table_name]id |date |name |value |dependent_table_id10 |2001-01-01 |foo |900 |60[dependent_table]id |name20 |Bar60 |Baz";//verwenden Sie dies, wenn Sie dies nicht möchten Verwenden Sie die bereitgestellten Merkmale oder abstrakten Testfälle $testDbAcle = TestDbAcleTestDbAcle::create($pdo);$testDbAcle->runCommand(new TestDbAcleCommandsSetupTablesCommand($dbTablesToSetup));//verwenden Sie dies, wenn Sie Ihren Testfall von TestDbAclePhpUnitAbstractTestCase erweitert haben oder verwenden TestDbAclePhpUnitTraitsDatabaseHelperTrait:$this->setupTables($dbTablesToSetup);
Das Framework selbst weiß, welche Spalten in der Tabelle nicht NULL-fähig sind und fügt Standardwerte ein ... Nehmen wir tatsächlich an, dass die Tabelle Tabellenname 30 Spalten hat, die alle nicht null sind ...
Außerdem können im Hintergrund verschiedene Fremdschlüsseleinschränkungen auftreten. Test-Db-Acle deaktiviert vorübergehend Fremdschlüsselprüfungen, sodass wir uns darüber keine Gedanken machen müssen oder in welcher Reihenfolge wir die Testdaten einfügen.
###Wie wäre es mit einem tatsächlichen Test...?### Erstens: Wenn Sie PHP5.4 verwenden, können Sie die Traits-Version verwenden:
Die Klasse „ExampleTest“ erweitert PHPUnit_Framework_TestCase und implementiert TestDbAclePhpUnitAbstractTestCaseInterface {use TestDbAclePhpUnitTraitsDatabaseHelperTrait; /** * Diese Methode muss implementiert werden, sie sollte das PDO-Objekt zurückgeben, das in den Datenbank-Fixtures verwendet werden soll * * @return Pdo */public function ProvidePdo() {return new Pdo("mysql:dbname=my_db_tests;host=localhost",'myTestUser', 'myTestPassword'); } /* * Ein Beispieltest */public function test_AddressService() {$this->setupTables(" [Adresse] Adress-ID |Unternehmen 1 |Ich 3 |Sie [Benutzer] Benutzer-ID |Name 10 |Johannes 20 |Maria "); $this->setAutoIncrement('address', 100); $this->addressService->addEntry("them");$this->assertTableStateContains(" [address] address_id |company 1 |me 3 |you 100 |them [user] user_id |name 10 |John 20 |Mary ", array(), „Sachen funktioniert“); } }
Wenn Sie keine Merkmale verwenden, können Sie AbstractTestCase
verwenden. In diesem Fall können Sie jedoch keine eigenen Basistestklassen verwenden.
Die Klasse „ExampleTest“ erweitert TestDbAclePhpUnitAbstractTestCase { protected $addressService;function Setup(){parent::Setup();$this->addressService = new ServicesAddressService(); }/** * Diese Methode muss implementiert werden, sie sollte das PDO-Objekt zurückgeben, das in den Datenbank-Fixtures verwendet werden soll * * @return Pdo */public function ProvidePdo() {return new Pdo("mysql:dbname=my_db_tests;host=localhost",'myTestUser', 'myTestPassword'); }function test_AddressService() {$this->setupTables(" [Adresse] Adress-ID |Unternehmen 1 |Ich 3 |Sie [Benutzer] Benutzer-ID |Name 10 |Johannes 20 |Maria "); $this->setAutoIncrement('address', 100); $this->addressService->addEntry("them");$this->assertTableStateContains(" [address] address_id |company 1 |me 3 |you 100 |them [user] user_id |name 10 |John 20 |Mary ", array(), „Sachen funktioniert“); } }
Ok, ServicesAddressService existiert hier offensichtlich nicht (hey, es ist test-first, oder?) und das Beispiel ist recht einfach.
Im wirklichen Leben würde ich die getPdo-Methode in eine gemeinsame Basistestklasse für das Projekt einfügen und sie könnte ganz anders als hier erhalten werden. Aber nun ja, das ist ein Beispiel.
Wie Sie sehen, kann „setupTables“ mehrere Tabellen gleichzeitig einrichten und „asserTableStateContains“ kann auch den Status verschiedener Tabellen gleichzeitig überprüfen.
Ähnlich wie setupTables Tabellen einrichten kann, die viel mehr Spalten als die angegebenen haben, vergleicht und bestätigt auch AssertTableStateContains nur die Werte der angegebenen Spalten.
Der einfachste Weg, Test-Db-Acle zu installieren, ist die Verwendung von Composer (Weitere Informationen finden Sie hier: http://packagist.org). Ich empfehle dringend, diesen Ansatz zu verwenden. Sie können das Paket jedoch auch in einen Ordner entpacken und das automatische Laden aktivieren es manuell in der von Ihnen gewünschten Form (es verwendet die PSR-0-Namenskonvention)
Um es mit Composer zu verwenden, fügen Sie Folgendes zu Ihrer Composer.json-Datei hinzu:
"require": { "test-db-acle/test-db-acle" : "dev-master" }, "repositories" : [ { "type": "git", "url": "https://github.com/malteriesch/test-db-acle.git" } ]
Wenn Sie möchten, können Sie auch https://packagist.org/packages/test-db-acle/test-db-acle verwenden.
Beiträge (und Kritik) sind herzlich willkommen...!
###So führen Sie die Test-Db-Acle-Tests aus### Um die Tests auszuführen, müssen Sie eine leere Datenbank auf einem MySql-Server Ihrer Wahl erstellen und Tests/Functional/config.php.dist nach Tests/ kopieren. Functional/config.php und füllen Sie es mit Ihren Datenbankdetails aus. Dann sollten hoffentlich alle Tests laufen. (Die Datenbank wird eigentlich nur für den funktionellen Rauchtest benötigt)
PSV-Syntax
AbstractTestCase
TestDbAcle erweitern und anpassen
Änderungsprotokoll