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.