Introducción
PHPUnit / TDD
¿Que es TDD?

Es una metodología de desarrollo ágil
¿Para que sirve?

Código Testeable
¿Para que sirve?

Código Robusto
¿Para que sirve?

Código Robusto
¿Cómo?

Traducción de casos
de uso a ejemplos.
¿Para que sirve?

Diseñado desde un punto de vista diferente.
¿Para que sirve?

Funcionalidad Justa … o
no?? ...
¿Cómo?

Las decisiones de diseño quedan para la fase de
desarrollo.
¿Cómo?

Escribir la especificación
¿Cómo?

Implementar el codigo para el ejemplo
¿Cómo?

Refactorizar y realizar mejoras.
Test Automáticos

  ¿Para que?
¿Cómo?

<?php

echo count($array_fixture);

echo count($array_fixture) == 1 ? "okn" : "not okn";

assertTrue(count($fixture) == 1);

function assertTrue($condition) {
   if (!$condition) {
       throw new Exception('Assertion failed.');
   }
}
¿Cómo?

<?php

class FixturesTest extends PHPUnit_Framework_TestCase {

    public function testCountFixture($array_fixture) {
      $this->assertEquals(1, count($array_fixture));
    }

}
¿Cómo?
Instalación
pear channel-discover pear.phpunit.de
pear channel-discover components.ez.no
pear channel-discover pear.symfony-project.com


pear install --alldeps phpunit/PHPUnit
Escribiendo un Test
<?php
// test/FixturesTest.php

require_once 'PHPUnit/Framework.php';
require_once '../Fixtures.php';

class FixturesTest extends PHPUnit_Framework_TestCase {

    public function testCountFixturesArray() {
      $fixtures = new Fixtures();
      $fixtures_array = $fixtures->generate();
      $this->assertEquals(1, count($fixtures_array));
    }

}
Data Providers
<?php
class DataTest extends PHPUnit_Framework_TestCase {
   /**
    * @dataProvider provider
    */
   public function testAdd($a, $b, $c) {
       $this->assertEquals($c, $a + $b);
   }
   public function provider() {
       return array(
          array(0, 0, 0),
          array(0, 1, 1),
          array(1, 0, 1),
          array(1, 1, 3)
       );
   }
}
Excepciones y errores
<?php

class ExceptionTest extends PHPUnit_Framework_TestCase {

    /**
     * @expectedException InvalidArgumentException
     */
    public function testException() {
        throw new InvalidArgumentException();
    }

}
Excepciones y errores
<?php

class ExpectedErrorTest extends PHPUnit_Framework_TestCase {

    /**
     * @expectedException PHPUnit_Framework_Error
     */
    public function testFailingInclude() {
        include 'not_existing_file.php';
    }

}
Afirmaciones
/**
 * Asserts that a condition is true.
 *
 * @param boolean $condition
 * @param string $message
 * @throws PHPUnit_Framework_AssertionFailedError
 */
function assertTrue($condition, $message = '')
{
    return PHPUnit_Framework_Assert::assertTrue($condition, $message);
}
Afirmaciones
/**
 * Asserts that a variable is of a given type.
 *
 * @param string $expected
 * @param mixed $actual
 * @param string $message
 * @since Method available since Release 3.5.0
 */
function assertInstanceOf($expected, $actual, $message = '')
{
    return PHPUnit_Framework_Assert::assertInstanceOf($expected, $actual, $message);
}
Afirmaciones
/**
 * Asserts that two variables are equal.
 *
 * @param mixed $expected
 * @param mixed $actual
 * @param string $message
 * @param float $delta
 * @param integer $maxDepth
 * @param boolean $canonicalize
 * @param boolean $ignoreCase
 */
function assertEquals($expected, $actual, $message = '', $delta = 0, $maxDepth = 10,
$canonicalize = FALSE, $ignoreCase = FALSE)
{
    return PHPUnit_Framework_Assert::assertEquals($expected, $actual, $message, $delta,
$maxDepth, $canonicalize, $ignoreCase);
}
Afirmaciones

PHPUnit tiene más
de   120 Asserts !!!
Afirmaciones


               Pero mejor NO las
               repasamos
               ahora !!!
setUp() y tearDown()
<?php

class FixturesTest extends PHPUnit_Framework_TestCase {

    protected $item = false;

    public function setUp() {
      $this->item = new ItemObject();
    }

    public function tearDown() {
      unset($this->item);
    }

}
Aplausos !!!

Introducción a TDD y PHPUnit