17 października 2009 ~ 1 Komentarz

ZF #1 PHPUnit

tdd

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 :)

Komentarze do wpisu “ZF #1 PHPUnit”

  1. Clifford W. Hansen 3 grudnia 2009 at 8:33 am Permalink

    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.


Dodaj komentarz