Zend_Test-PHPUnit-Bootstrapping.xml 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: 20807 -->
  4. <sect2 id="zend.test.phpunit.bootstrapping">
  5. <title>Bootstrapping der eigenen Testfälle</title>
  6. <para>
  7. Wie im <link linkend="zend.test.phpunit.loginexample">Login-Beispiel</link> gezeigt, sollten
  8. alle <acronym>MVC</acronym>-Testfälle
  9. <classname>Zend_Test_PHPUnit_ControllerTestCase</classname> erweitern. Diese Klasse
  10. ihrerseits erweitert <classname>PHPUnit_Framework_TestCase</classname> und gibt einem alle
  11. Strukturen und Zusicherungen, die man von PHPUnit erwartet -- sowie einiges an Scaffolding und
  12. Zusicherungen, die genau auf die Zend Framework <acronym>MVC</acronym>-Implementation zugeschnitten sind.
  13. </para>
  14. <para>
  15. Um die eigene <acronym>MVC</acronym>-Anwendung zu testen, muß diese ein Bootstrap ausführen.
  16. Es gibt verschiedene Wege, dies zu tun, wobei sich alle der öffentlichen
  17. <varname>$bootstrap</varname>-Eigenschaft bedienen.
  18. </para>
  19. <para>
  20. Erstens und möglicherweise am zielgerichtetsten kann man einfach eine Instanz von
  21. <classname>Zend_Application</classname> erstellen, wie man es in der
  22. <filename>index.php</filename> machen würde und diese der <varname>$bootstrap</varname>-Eigenschaft
  23. zuweisen. Normalerweise macht man das in der <methodname>setUp()</methodname>-Methode;
  24. anschließend muss man <methodname>parent::setUp()</methodname> aufrufen:
  25. </para>
  26. <programlisting language="php"><![CDATA[
  27. class UserControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
  28. {
  29. public function setUp()
  30. {
  31. // Zuordnen und Initiieren in einem Schritt:
  32. $this->bootstrap = new Zend_Application(
  33. 'testing',
  34. APPLICATION_PATH . '/configs/application.ini'
  35. );
  36. parent::setUp();
  37. }
  38. }
  39. ]]></programlisting>
  40. <para>
  41. Zweitens kann diese Eigenschaft so gesetzt werden, dass sie auf eine Datei zeigt. Wenn dieser
  42. Weg gewählt wird, sollte diese Datei <emphasis>nicht</emphasis> den Front-Controller ausführen,
  43. sondern stattdessen den Front-Controller konfigurieren und alles, was die Anwendung an
  44. speziellen Anforderungen benötigt.
  45. </para>
  46. <programlisting language="php"><![CDATA[
  47. class UserControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
  48. {
  49. public $bootstrap = '/path/to/bootstrap/file.php'
  50. // ...
  51. }
  52. ]]></programlisting>
  53. <para>
  54. Drittens kann ein <acronym>PHP</acronym>-Callback angegeben werden, der nach dem Bootstrap
  55. der Anwendung ausgeführt wird. Diese Methode kann im <link
  56. linkend="zend.test.phpunit.loginexample">Login-Beispiel</link> gesehen werden. Wenn das
  57. Callback eine Funktion oder statische Methode ist, könnte sie auch in der Klasse gesetzt
  58. werden:
  59. </para>
  60. <programlisting language="php"><![CDATA[
  61. class UserControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
  62. {
  63. public $bootstrap = array('App', 'bootstrap');
  64. // ...
  65. }
  66. ]]></programlisting>
  67. <para>
  68. In Fällen, in denen eine Objektinstanz notwendig ist, empfehlen wir die Durchführung in der
  69. eigenen <methodname>setUp()</methodname>-Methode:
  70. </para>
  71. <programlisting language="php"><![CDATA[
  72. class UserControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
  73. {
  74. public function setUp()
  75. {
  76. // Verwende die 'start' Methode einer Bootstrap-Objektinstanz:
  77. $bootstrap = new Bootstrap('test');
  78. $this->bootstrap = array($bootstrap, 'start');
  79. parent::setUp();
  80. }
  81. }
  82. ]]></programlisting>
  83. <para>
  84. Man beachte, dass <methodname>parent::setUp()</methodname> aufgerufen wird; das ist notwendig, da
  85. die <methodname>setUp()</methodname>-Methode von
  86. <classname>Zend_Test_PHPUnit_ControllerTestCase</classname> den Rest des Bootstrap-Prozesses
  87. durchführen wird (was den Aufruf des Callbacks einschließt).
  88. </para>
  89. <para>
  90. Während der normalen Anwendung wird die <methodname>setUp()</methodname>-Methode das
  91. Bootstrap der Anwendung ausführen. Dieser Prozess wird zunächst das Löschen der Umgebung
  92. enthalten, um einen sauberen Anfragestatus zu erhalten, das Zurücksetzen aller Plugins, Helfer
  93. und Antwortobjekte. Sobald das getan wurde, wird sie anschließend die Datei mit
  94. <methodname>include()</methodname> laden, die in <varname>$bootstrap</varname> angegeben
  95. ist oder den spezifizierten Callback aufrufen.
  96. </para>
  97. <para>
  98. Das Bootstrappen sollte so nahe wie möglich daran sein, wie die Anwendung das Bootstrap
  99. durchführt. Trotzdem gibt es einige Fallstricke:
  100. </para>
  101. <itemizedlist>
  102. <listitem>
  103. <para>
  104. Wir bieten keine alternative Implementierung der Anfrage- und Antwortobjekte; diese
  105. werden nicht verwendet. <classname>Zend_Test_PHPUnit_ControllerTestCase</classname>
  106. verwendet eigene Anfrage- und Antwortobjekte,
  107. <classname>Zend_Controller_Request_HttpTestCase</classname> und
  108. <classname>Zend_Controller_Response_HttpTestCase</classname>. Diese Objekte stellen
  109. Methoden zur Verfügung, um die Anfrageumgebung gezielt aufzusetzen und um auf
  110. speziellem Weg die Antwort als Prüfgegenstand abzuholen.
  111. </para>
  112. </listitem>
  113. <listitem>
  114. <para>
  115. Man sollte nicht erwarten Server-spezifisches zu testen. Mit anderen Worten, die Tests
  116. garantieren nicht, dass der Code in einer speziellen Serverkonfiguration läuft, aber
  117. dass die Anwendung wie erwartet funktionieren sollte und der Router eine gegebene
  118. Anfrage routen kann. Aus diesem Grund sollten keine Server-spezifischen Header im
  119. Anfrageobjekt gesetzt werden.
  120. </para>
  121. </listitem>
  122. </itemizedlist>
  123. <para>
  124. Sobald die Anwendung das Bootstrapping ausgeführt hat, kann damit begonnen werden, eigene
  125. Tests zu erstellen.
  126. </para>
  127. </sect2>