Verwendung, API und Erweiterungspunkte Die Quickstart hat bereits eine gute Einführung darin gegeben wie Datenbank Tests durch Verwendung von PHPUnit und Zend Framework durchgeführt werden können. Diese Sektion gibt eine Übersicht über die API mit der die Zend_Test_PHPUnit_Db Komponente kommt und wie diese intern arbeitet. Einige Hinweise über das Testen von Datenbanken So wie der Controller TestCase eine Anwendung auf dem Level der Integration testet, ist der Datenbank TestCase eine Testmethode der Integration. Er verwendet mehrere unterschiedliche Anwendungs Layer für Testzwecke und sollte deswegen mit Vorsicht verwendet werden. Es sollte darauf hingewiesen werden dass das Testen von Domain und Business Logik mit Integrationstests wie bei Zend Framework's Controller und Datenbank TestCases eine schlechte Praxis ist. Der Zweck von Integrationstests besteht darin zu Prüfen ob verschiedene Teile einer Anwendung problemlos arbeiten wenn Sie zusammen verknüpft werden. Diese Integrationstests ersetzen nicht die Notwendigkeit für ein Set von Unittests welche die Domain und Business Logik auf einem kleineren Level testen. Die isolierten Klassen. Die Klasse Zend_Test_PHPUnit_DatabaseTestCase Die Klasse Zend_Test_PHPUnit_DatabaseTestCase ist von PHPUnit_Extensions_Database_TestCase abgeleitet welche es erlaubt Tests mit einer frischen und fixen Datenbank einfach für jeden Lauf zu erstellen. Die Implementation von Zend bietet einige bequeme zusätzliche Features über die Database Erweiterung von PHPUnit wenn es zur Verwendung von Zend_Db in den eigenen Tests kommt. Der Workflow eines Datenbank TestCases kann wie folgt beschrieben werden. Für jeden Tests erstellt PHPUnit eine neue Instanz des TestCases und ruft die setUp() Methode auf. Der Datenbank TestCase erstellt eine Instanz eines Datenbank Testers welcher das Erstellen und Herunterfahren der Datenbank behandelt. Der Datenbank Tester sammelt die Informationen der Datenbank Verbindung und des initialen Datensets von getConnection() und getDataSet() welche beide abstrakte Methoden sind und für jeden Datenbank TestCase implementiert werden. Standardmäßig schneidet der Datenbank Tester die Tabelle beim spezifizierten Datenset ab, und fügt dann die Daten ein die als initiales Fixum angegeben werden. Wenn der Datenbank Tester damit fertig ist die Datenbank herzurichten, führt PHPUnit den Test durch. Nachdem der Test gelaufen ist, wird tearDown() aufgerufen. Weil die Datenbank in setUp() eingeflochten wird bevor das initiale Fixum eingefügt wurde, werden keine Aktionen vom Datenbank Tester auf dieser Ebene ausgeführt. Der Datenbank TestCase erwartet dass das Datenbank Schema und die Tabellen korrekt hergerichtet wurden um die Tests auszuführen. Es gibt keinen Mechanismus für die Erstellung und das Herunterfahren der Datenbank Tabellen. Die Klasse Zend_Test_PHPUnit_DatabaseTestCase hat einige bequeme Funktionen die dabei helfen können Tests zu schreiben die mit der Datenbank und der Datenbank Testerweiterung zu interagieren. Die nächste Tabelle listet nur die neuen Methoden verglichen mit PHPUnit_Extensions_Database_TestCase auf, dessen API in der Dokumentation von PHPUnit dokumentiert ist. Die API Methoden von Zend_Test_PHPUnit_DatabaseTestCase Methode Beschreibung createZendDbConnection(Zend_Db_Adapter_Abstract $connection, $schema) Erstellt eine mit der PHPUnit Datenbank Erweiterung kompatible Instanz von einer Zend_Db_Adapter_Abstract Instanz. Diese Methode sollte für das Setup der Testfälle verwendet werden wenn die abstrakte getConnection() Methode des Datenbank TestCases implementiert wird. getAdapter() Bequeme Methode um auf die darunterliegende Zend_Db_Adapter_Abstract Instanz zugreifen zu können welche in der PHPUnit Datenbank Verbindung verknüpft ist die mit getConnection() erstellt wurde. createDbRowset(Zend_Db_Table_Rowset_Abstract $rowset, $tableName = null) Erstellt ein DataTable Objekt das mit den Daten aus einer angegebenen Zend_Db_Table_Rowset_Abstract Instanz gefüllt ist. Die Tabelle zu der die Zeile verbunden ist wird ausgewählt wenn $tableName NULL ist. createDbTable(Zend_Db_Table_Abstract $table, $where = null, $order = null, $count = null, $offset = null) Erstellt ein DataTable Objekt das die Daten repräsentiert wehcle in einer Zend_Db_Table_Abstract Instanz enthalten sind. Für das Empfangen der Daten wird fetchAll() verwendet, wobei die optionalen Parameter verwendet werden können um die Datentabelle auf eine bestimmtes Untermenge zu begrenzen. createDbTableDataSet(array $tables=array()) Erstellt ein DataSet das die angegebenen $tables enthält, ein Array von Zend_Db_Table_Abstract Instanzen.
Integration von Datenbank Tests mit dem ControllerTestCase Weil PHP die mehrfache Vererbung nicht unterstützt ist es nicht möglich die Controller und Datenbank Testcases in Verbindung zu verwenden. Trotzdem kann man den Zend_Test_PHPUnit_Db_SimpleTester Datenbank Tester im eigenen Controller Testcase verwenden um eine fixe Datenbankumgebung für jeden neuen Controller Test zu erstellen. Der Datenbank TestCase ist generell nur ein Set von bequemen Funktionen auf die auch zugegriffen und die auch ohne die TestCases verwendet werden können. Beispiele für die Integration der Datenbank Dieses Beispiel erweitert den User Controller Test aus der Zend_Test_PHPUnit_ControllerTestCase Dokumentation um ein Datenbank Setup zu inkludieren. setupDatabase(); $this->bootstrap = array($this, 'appBootstrap'); parent::setUp(); } public function setupDatabase() { $db = Zend_Db::factory(...); $connection = new Zend_Test_PHPUnit_Db_Connection($db, 'database_schema_name'); $databaseTester = new Zend_Test_PHPUnit_Db_SimpleTester($connection); $databaseFixture = new PHPUnit_Extensions_Database_DataSet_FlatXmlDataSet( dirname(__FILE__) . '/_files/initialUserFixture.xml' ); $databaseTester->setupDatabase($databaseFixture); } } ]]> Jetzt wird das flache XML Dataset "initialUserFixture.xml" verwendet um die Datenbank auf einen initialen Status vor jeden Test zu setzen, genauso wie DatabaseTestCase intern arbeitet.