ZF #1 PHPUnit

Zanim przejdę do innych tematów o Zend Framework, chcę przygotować bazę do następnych tutoriali. Wszystkie tutoriale będą pisane w TDD (Test Driven Development). Zend Framework tworzy każdy projekt z katalogiem tests. Niestety ktlog ten zawiera tylko 3 puste pliki i zacząć jest trudno jeżeli nie ma się dużej wiedzy na temat PHPUnit.
Na początku trzeba przygotować główny plik konfiguracyjny dla potrzeb testowania czyli phpunit.xml:
<phpunit bootstrap="./application/bootstrap.php" colors="true">
<testsuite name="App">
<directory>./</directory>
</testsuite>
<filter>
<whitelist>
<directory suffix=".php">../application/</directory>
<exclude>
<directory suffix=".php">D:\xampp\php\PEAR\Zend\</directory>
<file>../application/Bootstrap.php</file>
<file>../application/controllers/ErrorController.php</file>
</exclude>
</whitelist>
</filter>
<logging>
<log type="coverage-html" target="./log/report" charset="UTF-8"
yui="true" highlight = "true" lowUpperBound="50" highLowerBound="80" />
<log type="testdox" target="./log/testdox.html" />
</logging>
</phpunit>
W pierwszej linijce ustalamy plik bootstrapa na potrzeby testów. Bootstrap przygotuje całe środowisko do testów i będziemy mieli dostęp do wszystkich obiektów w naszej aplikacji. Narazie nasz plik z bootstrapem jest pusty, ale później to naprwimy :)
Od drugiej do czwartej linijki ustalamy katalogi gdzie phpunit będzie szukać naszych testów. Główna konfiguracja znajduje się w znaczniku filter. Ustalamy w nim jakie pliki powinny być sprawdzane przy budowie raportów pokrycia kodu aplikacji z testami czyli code coverage.
Ok, pora napisać bootstrapa w pliku /tests/application/bootstrap.php :
<?php
error_reporting(E_ALL | E_STRICT);
// Define path to application directory
defined('APPLICATION_PATH')
|| define('APPLICATION_PATH', realpath(dirname(__FILE__)
. '/../../application'));
// Define application environment
defined('APPLICATION_ENV')
|| define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ?
getenv('APPLICATION_ENV') : 'testing'));
// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
realpath(APPLICATION_PATH . '/../library'),
get_include_path(),
)));
/** Zend_Application */
require_once 'Zend/Application.php';
require_once 'ControllerTestCase.php';
Następnym krokiem jest stworzenie klasy ControllerTestCase, która tak naprawdę będzie abstrakcyjną nadklasą dla wszystkich naszych testów.
Plik /tests/application/ControllerTestCase.php:
class ControllerTestCase
extends Zend_Test_PHPUnit_ControllerTestCase
{
/**
* @var Zend_Application
*/
protected $application;
public function setUp()
{
$this->bootstrap = array($this, 'appBootstrap');
parent::setUp();
}
public function appBootstrap()
{
$this->application =
new Zend_Application(APPLICATION_ENV,
APPLICATION_PATH . '/configs/application.ini');
$this->application->bootstrap();
}
}
Ok gotowe, pora napisac nasz pierwszy test w pliku \tests\library\CanTest.php:
<?php
/**
* Test Class CanTest
*
* This test checks if PHPUnit and ZF is configured in proper way
*
* @author Nexik
*/
class CanTest
extends ControllerTestCase
{
public function testCanDoUnitTest()
{
$this->assertTrue(true);
}
}
Aby sprawdzić czy wszystko działa przejdźmy do katalogu /tests :
PS C:\www$ cd zfForTotalBeginners/tests PS C:\www\zfForTotalBeginners\tests$ phpunit PHPUnit 3.4.1 by Sebastian Bergmann. . Time: 12 seconds ←[30;42m←[2KOK (1 test, 1 assertion) ←[0m←[2K Generating code coverage report, this may take a moment.
Wszystko działa pięknie :)

Greetings,
Thanks for the info, the only issue I found was I needed to add:
require_once(‘Zend/Loader/Autoloader.php’);
$autoloader = Zend_Loader_Autoloader::getInstance();
to the bootstrap
HTH
Clifford.