<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect2 id="zend.test.phpunit.db.testing">
    <title>Verwendung, API und Erweiterungspunkte</title>

    <para>
        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 <acronym>API</acronym> mit der die
        <classname>Zend_Test_PHPUnit_Db</classname> Komponente kommt und wie diese intern arbeitet.
    </para>

    <note>
        <title>Einige Hinweise über das Testen von Datenbanken</title>

        <para>
            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.
        </para>

        <para>
            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.
        </para>
    </note>

    <sect3 id="zend.test.phpunit.db.testing.testcase">
        <title>Die Klasse Zend_Test_PHPUnit_DatabaseTestCase</title>

        <para>
            Die Klasse <classname>Zend_Test_PHPUnit_DatabaseTestCase</classname> ist von
            <classname>PHPUnit_Extensions_Database_TestCase</classname> 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
            <classname>Zend_Db</classname> in den eigenen Tests kommt. Der Workflow eines
            Datenbank TestCases kann wie folgt beschrieben werden.
        </para>

        <orderedlist>
            <listitem>
                <para>
                    Für jeden Tests erstellt PHPUnit eine neue Instanz des TestCases und ruft
                    die <methodname>setUp()</methodname> Methode auf.
                </para>
            </listitem>

            <listitem>
                <para>
                    Der Datenbank TestCase erstellt eine Instanz eines Datenbank Testers welcher
                    das Erstellen und Herunterfahren der Datenbank behandelt.
                </para>
            </listitem>

            <listitem>
                <para>
                    Der Datenbank Tester sammelt die Informationen der Datenbank Verbindung und
                    des initialen Datensets von <methodname>getConnection()</methodname> und
                    <methodname>getDataSet()</methodname> welche beide abstrakte Methoden sind
                    und für jeden Datenbank TestCase implementiert werden.
                </para>
            </listitem>

            <listitem>
                <para>
                    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.
                </para>
            </listitem>

            <listitem>
                <para>
                    Wenn der Datenbank Tester damit fertig ist die Datenbank herzurichten,
                    führt PHPUnit den Test durch.
                </para>
            </listitem>

            <listitem>
                <para>
                    Nachdem der Test gelaufen ist, wird <methodname>tearDown()</methodname>
                    aufgerufen. Weil die Datenbank in <methodname>setUp()</methodname>
                    eingeflochten wird bevor das initiale Fixum eingefügt wurde, werden keine
                    Aktionen vom Datenbank Tester auf dieser Ebene ausgeführt.
                </para>
            </listitem>
        </orderedlist>

        <note>
            <para>
                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.
            </para>
        </note>

        <para>
            Die Klasse <classname>Zend_Test_PHPUnit_DatabaseTestCase</classname> hat einige
            bequeme Funktionen die dabei helfen können Tests zu schreiben die mit der Datenbank
            und der Datenbank Testerweiterung zu interagieren.
        </para>

        <para>
            Die nächste Tabelle listet nur die neuen Methoden verglichen mit
            <classname>PHPUnit_Extensions_Database_TestCase</classname> auf, dessen <ulink
                url="http://www.phpunit.de/manual/current/en/database.html">API in der
                Dokumentation von PHPUnit dokumentiert ist</ulink>.
        </para>

        <table id="zend.test.phpunit.db.testing.testcase.api-methods">
            <title>Die API Methoden von Zend_Test_PHPUnit_DatabaseTestCase</title>

            <tgroup cols="2">
                <thead>
                    <row>
                        <entry>Methode</entry>
                        <entry>Beschreibung</entry>
                    </row>
                </thead>

                <tbody>
                    <row>
                        <entry>
                            <methodname>createZendDbConnection(Zend_Db_Adapter_Abstract $connection,
                                $schema)</methodname>
                        </entry>

                        <entry>
                            Erstellt eine mit der PHPUnit Datenbank Erweiterung kompatible Instanz
                            von einer <classname>Zend_Db_Adapter_Abstract</classname> Instanz.
                            Diese Methode sollte für das Setup der Testfälle verwendet werden wenn
                            die abstrakte <methodname>getConnection()</methodname> Methode des
                            Datenbank TestCases implementiert wird.
                        </entry>
                    </row>

                    <row>
                        <entry><methodname>getAdapter()</methodname></entry>

                        <entry>
                            Bequeme Methode um auf die darunterliegende
                            <classname>Zend_Db_Adapter_Abstract</classname> Instanz zugreifen zu
                            können welche in der PHPUnit Datenbank Verbindung verknüpft ist die mit
                            <methodname>getConnection()</methodname> erstellt wurde.
                        </entry>
                    </row>

                    <row>
                        <entry>
                            <methodname>createDbRowset(Zend_Db_Table_Rowset_Abstract $rowset,
                                $tableName = null)</methodname>
                        </entry>

                        <entry>
                            Erstellt ein DataTable Objekt das mit den Daten aus einer angegebenen
                            <classname>Zend_Db_Table_Rowset_Abstract</classname> Instanz gefüllt
                            ist. Die Tabelle zu der die Zeile verbunden ist wird ausgewählt wenn
                            <varname>$tableName</varname> <constant>NULL</constant> ist.
                        </entry>
                    </row>

                    <row>
                        <entry>
                            <methodname>createDbTable(Zend_Db_Table_Abstract $table, $where = null,
                                $order = null, $count = null, $offset = null)</methodname>
                        </entry>

                        <entry>
                            Erstellt ein DataTable Objekt das die Daten repräsentiert wehcle in
                            einer <classname>Zend_Db_Table_Abstract</classname> Instanz enthalten
                            sind. Für das Empfangen der Daten wird
                            <methodname>fetchAll()</methodname> verwendet, wobei die optionalen
                            Parameter verwendet werden können um die Datentabelle auf eine
                            bestimmtes Untermenge zu begrenzen.
                        </entry>
                    </row>

                    <row>
                        <entry>
                            <methodname>createDbTableDataSet(array $tables=array())</methodname>
                        </entry>

                        <entry>
                            Erstellt ein DataSet das die angegebenen <varname>$tables</varname>
                            enthält, ein Array von <classname>Zend_Db_Table_Abstract</classname>
                            Instanzen.
                        </entry>
                    </row>
                </tbody>
            </tgroup>
        </table>
    </sect3>

    <sect3 id="zend.test.phpunit.db.testing.controllerintegration">
        <title>Integration von Datenbank Tests mit dem ControllerTestCase</title>

        <para>
            Weil <acronym>PHP</acronym> die mehrfache Vererbung nicht unterstützt ist es nicht
            möglich die Controller und Datenbank Testcases in Verbindung zu verwenden. Trotzdem
            kann man den <classname>Zend_Test_PHPUnit_Db_SimpleTester</classname> 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.
        </para>

        <example id="zend.test.phpunit.db.testing.controllerintegration.example">
            <title>Beispiele für die Integration der Datenbank</title>

            <para>
                Dieses Beispiel erweitert den User Controller Test aus der
                <classname>Zend_Test_PHPUnit_ControllerTestCase</classname> Dokumentation um ein
                Datenbank Setup zu inkludieren.
            </para>

            <programlisting language="php"><![CDATA[
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);
    }
}
]]></programlisting>

            <para>
                Jetzt wird das flache <acronym>XML</acronym> Dataset "initialUserFixture.xml"
                verwendet um die Datenbank auf einen initialen Status vor jeden Test zu setzen,
                genauso wie DatabaseTestCase intern arbeitet.
            </para>
        </example>
    </sect3>
</sect2>
