# 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.

1. Für jeden Tests erstellt PHPUnit eine neue Instanz des TestCases und ruft die `setUp()` Methode auf.

2. Der Datenbank TestCase erstellt eine Instanz eines Datenbank Testers welcher das Erstellen und Herunterfahren der Datenbank behandelt.

3. 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.

4. 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.

5. Wenn der Datenbank Tester damit fertig ist die Datenbank herzurichten, führt PHPUnit den Test durch.

6. 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.

    class UserControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
    {
        public function setUp()
        {
            $this->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.