Zend_Test-PHPUnit-Db-Testing.xml 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect2 id="zend.test.phpunit.db.testing">
  5. <title>Verwendung, API und Erweiterungspunkte</title>
  6. <para>
  7. Die Quickstart hat bereits eine gute Einführung darin gegeben wie Datenbank Tests durch
  8. Verwendung von PHPUnit und Zend Framework durchgeführt werden können. Diese Sektion gibt
  9. eine Übersicht über die <acronym>API</acronym> mit der die
  10. <classname>Zend_Test_PHPUnit_Db</classname> Komponente kommt und wie diese intern arbeitet.
  11. </para>
  12. <note>
  13. <title>Einige Hinweise über das Testen von Datenbanken</title>
  14. <para>
  15. So wie der Controller TestCase eine Anwendung auf dem Level der Integration testet,
  16. ist der Datenbank TestCase eine Testmethode der Integration. Er verwendet mehrere
  17. unterschiedliche Anwendungs Layer für Testzwecke und sollte deswegen mit Vorsicht
  18. verwendet werden.
  19. </para>
  20. <para>
  21. Es sollte darauf hingewiesen werden dass das Testen von Domain und Business Logik
  22. mit Integrationstests wie bei Zend Framework's Controller und Datenbank TestCases
  23. eine schlechte Praxis ist. Der Zweck von Integrationstests besteht darin zu Prüfen
  24. ob verschiedene Teile einer Anwendung problemlos arbeiten wenn Sie zusammen
  25. verknüpft werden. Diese Integrationstests ersetzen nicht die Notwendigkeit für ein
  26. Set von Unittests welche die Domain und Business Logik auf einem kleineren Level
  27. testen. Die isolierten Klassen.
  28. </para>
  29. </note>
  30. <sect3 id="zend.test.phpunit.db.testing.testcase">
  31. <title>Die Klasse Zend_Test_PHPUnit_DatabaseTestCase</title>
  32. <para>
  33. Die Klasse <classname>Zend_Test_PHPUnit_DatabaseTestCase</classname> ist von
  34. <classname>PHPUnit_Extensions_Database_TestCase</classname> abgeleitet welche es
  35. erlaubt Tests mit einer frischen und fixen Datenbank einfach für jeden Lauf zu
  36. erstellen. Die Implementation von Zend bietet einige bequeme zusätzliche Features
  37. über die Database Erweiterung von PHPUnit wenn es zur Verwendung von
  38. <classname>Zend_Db</classname> in den eigenen Tests kommt. Der Workflow eines
  39. Datenbank TestCases kann wie folgt beschrieben werden.
  40. </para>
  41. <orderedlist>
  42. <listitem>
  43. <para>
  44. Für jeden Tests erstellt PHPUnit eine neue Instanz des TestCases und ruft
  45. die <methodname>setUp()</methodname> Methode auf.
  46. </para>
  47. </listitem>
  48. <listitem>
  49. <para>
  50. Der Datenbank TestCase erstellt eine Instanz eines Datenbank Testers welcher
  51. das Erstellen und Herunterfahren der Datenbank behandelt.
  52. </para>
  53. </listitem>
  54. <listitem>
  55. <para>
  56. Der Datenbank Tester sammelt die Informationen der Datenbank Verbindung und
  57. des initialen Datensets von <methodname>getConnection()</methodname> und
  58. <methodname>getDataSet()</methodname> welche beide abstrakte Methoden sind
  59. und für jeden Datenbank TestCase implementiert werden.
  60. </para>
  61. </listitem>
  62. <listitem>
  63. <para>
  64. Standardmäßig schneidet der Datenbank Tester die Tabelle beim spezifizierten
  65. Datenset ab, und fügt dann die Daten ein die als initiales Fixum angegeben
  66. werden.
  67. </para>
  68. </listitem>
  69. <listitem>
  70. <para>
  71. Wenn der Datenbank Tester damit fertig ist die Datenbank herzurichten,
  72. führt PHPUnit den Test durch.
  73. </para>
  74. </listitem>
  75. <listitem>
  76. <para>
  77. Nachdem der Test gelaufen ist, wird <methodname>tearDown()</methodname>
  78. aufgerufen. Weil die Datenbank in <methodname>setUp()</methodname>
  79. eingeflochten wird bevor das initiale Fixum eingefügt wurde, werden keine
  80. Aktionen vom Datenbank Tester auf dieser Ebene ausgeführt.
  81. </para>
  82. </listitem>
  83. </orderedlist>
  84. <note>
  85. <para>
  86. Der Datenbank TestCase erwartet dass das Datenbank Schema und die Tabellen korrekt
  87. hergerichtet wurden um die Tests auszuführen. Es gibt keinen Mechanismus für die
  88. Erstellung und das Herunterfahren der Datenbank Tabellen.
  89. </para>
  90. </note>
  91. <para>
  92. Die Klasse <classname>Zend_Test_PHPUnit_DatabaseTestCase</classname> hat einige
  93. bequeme Funktionen die dabei helfen können Tests zu schreiben die mit der Datenbank
  94. und der Datenbank Testerweiterung zu interagieren.
  95. </para>
  96. <para>
  97. Die nächste Tabelle listet nur die neuen Methoden verglichen mit
  98. <classname>PHPUnit_Extensions_Database_TestCase</classname> auf, dessen <ulink
  99. url="http://www.phpunit.de/manual/current/en/database.html">API in der
  100. Dokumentation von PHPUnit dokumentiert ist</ulink>.
  101. </para>
  102. <table id="zend.test.phpunit.db.testing.testcase.api-methods">
  103. <title>Die API Methoden von Zend_Test_PHPUnit_DatabaseTestCase</title>
  104. <tgroup cols="2">
  105. <thead>
  106. <row>
  107. <entry>Methode</entry>
  108. <entry>Beschreibung</entry>
  109. </row>
  110. </thead>
  111. <tbody>
  112. <row>
  113. <entry>
  114. <methodname>createZendDbConnection(Zend_Db_Adapter_Abstract $connection,
  115. $schema)</methodname>
  116. </entry>
  117. <entry>
  118. Erstellt eine mit der PHPUnit Datenbank Erweiterung kompatible Instanz
  119. von einer <classname>Zend_Db_Adapter_Abstract</classname> Instanz.
  120. Diese Methode sollte für das Setup der Testfälle verwendet werden wenn
  121. die abstrakte <methodname>getConnection()</methodname> Methode des
  122. Datenbank TestCases implementiert wird.
  123. </entry>
  124. </row>
  125. <row>
  126. <entry><methodname>getAdapter()</methodname></entry>
  127. <entry>
  128. Bequeme Methode um auf die darunterliegende
  129. <classname>Zend_Db_Adapter_Abstract</classname> Instanz zugreifen zu
  130. können welche in der PHPUnit Datenbank Verbindung verknüpft ist die mit
  131. <methodname>getConnection()</methodname> erstellt wurde.
  132. </entry>
  133. </row>
  134. <row>
  135. <entry>
  136. <methodname>createDbRowset(Zend_Db_Table_Rowset_Abstract $rowset,
  137. $tableName = null)</methodname>
  138. </entry>
  139. <entry>
  140. Erstellt ein DataTable Objekt das mit den Daten aus einer angegebenen
  141. <classname>Zend_Db_Table_Rowset_Abstract</classname> Instanz gefüllt
  142. ist. Die Tabelle zu der die Zeile verbunden ist wird ausgewählt wenn
  143. <varname>$tableName</varname> <constant>NULL</constant> ist.
  144. </entry>
  145. </row>
  146. <row>
  147. <entry>
  148. <methodname>createDbTable(Zend_Db_Table_Abstract $table, $where = null,
  149. $order = null, $count = null, $offset = null)</methodname>
  150. </entry>
  151. <entry>
  152. Erstellt ein DataTable Objekt das die Daten repräsentiert wehcle in
  153. einer <classname>Zend_Db_Table_Abstract</classname> Instanz enthalten
  154. sind. Für das Empfangen der Daten wird
  155. <methodname>fetchAll()</methodname> verwendet, wobei die optionalen
  156. Parameter verwendet werden können um die Datentabelle auf eine
  157. bestimmtes Untermenge zu begrenzen.
  158. </entry>
  159. </row>
  160. <row>
  161. <entry>
  162. <methodname>createDbTableDataSet(array $tables=array())</methodname>
  163. </entry>
  164. <entry>
  165. Erstellt ein DataSet das die angegebenen <varname>$tables</varname>
  166. enthält, ein Array von <classname>Zend_Db_Table_Abstract</classname>
  167. Instanzen.
  168. </entry>
  169. </row>
  170. </tbody>
  171. </tgroup>
  172. </table>
  173. </sect3>
  174. <sect3 id="zend.test.phpunit.db.testing.controllerintegration">
  175. <title>Integration von Datenbank Tests mit dem ControllerTestCase</title>
  176. <para>
  177. Weil <acronym>PHP</acronym> die mehrfache Vererbung nicht unterstützt ist es nicht
  178. möglich die Controller und Datenbank Testcases in Verbindung zu verwenden. Trotzdem
  179. kann man den <classname>Zend_Test_PHPUnit_Db_SimpleTester</classname> Datenbank
  180. Tester im eigenen Controller Testcase verwenden um eine fixe Datenbankumgebung für
  181. jeden neuen Controller Test zu erstellen. Der Datenbank TestCase ist generell nur
  182. ein Set von bequemen Funktionen auf die auch zugegriffen und die auch ohne die
  183. TestCases verwendet werden können.
  184. </para>
  185. <example id="zend.test.phpunit.db.testing.controllerintegration.example">
  186. <title>Beispiele für die Integration der Datenbank</title>
  187. <para>
  188. Dieses Beispiel erweitert den User Controller Test aus der
  189. <classname>Zend_Test_PHPUnit_ControllerTestCase</classname> Dokumentation um ein
  190. Datenbank Setup zu inkludieren.
  191. </para>
  192. <programlisting language="php"><![CDATA[
  193. class UserControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
  194. {
  195. public function setUp()
  196. {
  197. $this->setupDatabase();
  198. $this->bootstrap = array($this, 'appBootstrap');
  199. parent::setUp();
  200. }
  201. public function setupDatabase()
  202. {
  203. $db = Zend_Db::factory(...);
  204. $connection = new Zend_Test_PHPUnit_Db_Connection($db,
  205. 'database_schema_name');
  206. $databaseTester = new Zend_Test_PHPUnit_Db_SimpleTester($connection);
  207. $databaseFixture =
  208. new PHPUnit_Extensions_Database_DataSet_FlatXmlDataSet(
  209. dirname(__FILE__) . '/_files/initialUserFixture.xml'
  210. );
  211. $databaseTester->setupDatabase($databaseFixture);
  212. }
  213. }
  214. ]]></programlisting>
  215. <para>
  216. Jetzt wird das flache <acronym>XML</acronym> Dataset "initialUserFixture.xml"
  217. verwendet um die Datenbank auf einen initialen Status vor jeden Test zu setzen,
  218. genauso wie DatabaseTestCase intern arbeitet.
  219. </para>
  220. </example>
  221. </sect3>
  222. </sect2>