| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258 |
- <?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>
|