Pruebas Unitarias

¿Qué son pruebas unitarias?

  • Una forma automatizada de verificar pequeñas porciones de una aplicación contra una especificación.
    • “¿Ésta 'unidad' de código hace lo que debería hacer?”
       
  • Automatizada - no tendrás que hacer demasiados esfuerzos ejecutando las pruebas una vez sean escritas.
    Ejecutas un comando y el framework hará el resto.
     
  • Pequeñas porciones - métodos individuales
    de una clase y cómo interactúan con sus
    dependencias y/o colaboradores.
     
  • Especificación - tu definición de cómo
    deberían uncionar las cosas.

¿Por qué hacer Pruebas?

  • Porque es una buena idea.
     
  • Te permite asegurarte que tus cambios no harán que algo más falle.
     
  • Ayudará a que otros devs entiendan lo que hace tu código, y además en el proceso de integración.
     
  • Acelerará el proceso de desarrollo en un futuro.
     
  • Ayuda a mantenerse bajo control al escribir código. Te obligará a pensar cosas como "¿cómo voy a probar esto?"

"Unit tests"

  • Son funciones y clases diseñadas para asegurarse de que el código se comporte de una determinada forma
     
  • Es más efectivo cuando tu código no contiene funciones  con mucho código.
     
  • Son en el primer paso para un código bien escrito y mantenible.

Pruebas Unitarias

Empezando con PHPUnit

Instalación

$ composer require --dev "phpunit/phpunit=5.0.*"

Pruebas Unitarias

Empezando con PHPUnit

Código

class Unicorns() {
    private $count = 8;

    public function getCount() {
        return $this->count;
    }

    public function steal($number) {
        $this->count -= $number;
    }
}
class UnicornsTest extends PHPUnit_Framework_TestCase() {
    public function test_can_steal() {
        // Setup
        $unicorns = Unicorns();

        // Action
        $unicorns->steal(5);
        
        // Assert
        $this->assertEquals(3, $unicorns->getCount());
    }
}

Prueba Unitaria

Pruebas Unitarias

Empezando con PHPUnit

Asserts

assertEquals($expected, $actual [, $message = '']);
  • $expected - El valor que esperas obtener.
     
  • $actual - El valor que obtuviste realmente (con fé es igual que el esperado).
     
  • $message - Un valor opcional para describir el Assert, útil cuando los tests son ejecutados.

Pruebas Unitarias

Empezando con PHPUnit

Ejecutando el test

$ phpunit tests/unicorns.php
PHPUnit 3.4.0 by Sebastian Bergmann.

..

Time: 0 seconds, Memory: 0.5Mb

OK (1 test, 1 assertion)

Pruebas Unitarias

Optimizando el código | PHPUnit

Código

class Unicorns() {
    private $count = 8;

    public function getCount() {
        return $this->count;
    }

    public function steal($number) {
        // Make sure we can't have negative unicorns
        if($this->count - $number >= 0) {
            $this->count -= $number;
        }
    }
}

Pruebas Unitarias

Optimizando el código | PHPUnit

Unit Test

class UnicornsTest extends PHPUnit_Framework_TestCase() {
    public function test_can_steal() {
        $unicorns = Unicorns();
        $unicorns->steal(5);
        $this->assertEquals(3, $unicorns->getCount());
    }

    public function test_cant_steal() {
        $unicorns = Unicorns();
        $unicorns->steal(1000);
        $this->assertEquals(8, $unicorns->getCount());
    }
}

Pruebas Unitarias

Optimizando el código | PHPUnit

Código

class Unicorns() {
    private $count = 8;

    public function getCount() {
        return $this->count;
    }

    public function steal($number) {
        $this->count -= $this->count - $number >= 0 ? $number : 0;
    }
}

Pruebas Unitarias

Optimizando el código | PHPUnit

Ejecutando el test

$ phpunit tests/unicorns.php
PHPUnit 3.4.0 by Sebastian Bergmann.

..

Time: 0 seconds, Memory: 0.5Mb

OK (2 tests, 2 assertions)

Pruebas Unitarias

Ups! | PHPUnit

Código

class Unicorns() {
    private $count = 8;

    public function getCount() {
        return $this->count;
    }

    public function steal($num) {
        $this->count -= $this->count - $num >= 0 ? $num : $this->count;
    }
}

Pruebas Unitarias

Optimizando el código | PHPUnit

Ejecutando el test

$ phpunit tests/unicorns.php
PHPUnit 3.4.0 by Sebastian Bergmann.

.F

Time: 0 seconds, Memory: 0.5Mb

There was 1 failure:

1) UnicornsTest::test_cant_steal
Failed asserting that 0 matches expected 8.

/path/to/test/unicorns.php:11

FAILURES!
Tests: 2, Assertions: 2, Failures: 1.

Pruebas Unitarias

Optimizando el código | PHPUnit

Ejecutando tests

$ phpunit tests/
PHPUnit 3.4.0 by Sebastian Bergmann.

...

Time: 0 seconds, Memory: 0.5Mb

OK (13 tests, 13 assertions)
PISTA: El nombre de las pruebas debe ser *Test

Pruebas Unitarias

Funciones de PHPUnit 

setUp()

Se ejecuta antes de cada test dentro de la misma clase. 

class UnicornsTest extends PHPUnit_Framework_TestCase() {
    protected function setUp() {
        // Create the unicorns object for each test
        $this->unicorns = Unicorns();
    }

    public function test_can_steal() {
        $this->unicorns->steal(5);
        $this->assertEquals(3, $this->unicorns->getCount());
    }

    public function test_cant_steal() {
        $this->unicorns->steal(1000);
        $this->assertEquals(8, $this->unicorns->getCount());
    }
}

Pruebas Unitarias

Funciones de PHPUnit 

tearDown()

Se ejecuta luego de cada test dentro de la misma clase. 

class UnicornsTest extends PHPUnit_Framework_TestCase() {
    protected function tearDown() {
        // Clean up the mess you've made
    }

    public function test_can_steal() {
        $this->unicorns->steal(5);
        $this->assertEquals(3, $this->unicorns->getCount());
    }

    public function test_cant_steal() {
        $this->unicorns->steal(1000);
        $this->assertEquals(8, $this->unicorns->getCount());
    }
}

Pruebas Unitarias

Funciones de PHPUnit 

Asserts

  • assertEquals()
  • assertTrue()
  • assertFalse()
  • assertLessThan()
  • assertNull()
  • assertRegExp()

Pruebas Unitarias

Funciones de PHPUnit 

Asserts

¡Muchos asserts!

assertArrayHasKey()

assertClassHasAttribute()

assertClassHasStaticAttribute()

assertContains()

assertContainsOnly()

assertContainsOnlyInstancesOf()

assertCount()

assertEmpty()

assertEqualXMLStructure()

assertEquals()

assertFalse()

 

assertFileEquals()

assertFileExists()

assertGreaterThan()

assertGreaterThanOrEqual()

assertInstanceOf()

assertInternalType()

assertJsonFileEqualsJsonFile()

assertJsonStringEqualsJsonFile()

assertJsonStringEqualsJsonString()

assertLessThan()

assertLessThanOrEqual()

assertNull()

assertObjectHasAttribute()

 

assertRegExp()

assertStringMatchesFormat()

assertStringMatchesFormatFile()

assertSame()

assertSelectCount()

assertSelectEquals()

assertSelectRegExp()

assertStringEndsWith()

assertStringEqualsFile()

assertStringStartsWith()

assertTag()

assertThat()

assertTrue()

assertXmlFileEqualsXmlFile()

assertXmlStringEqualsXmlFile()

assertXmlStringEqualsXmlString()

Pruebas Unitarias

Funciones de PHPUnit 

Exceptions

class Unicorns() {
    private $count = 8;

    public function getCount() {
        return $this->count;
    }

    public function steal($num) {
        if ($num < $this->count) {
            throw new Exception('Not enough unicorns to steal');
        }
        $this->count -= $num;
    }
}

Pruebas Unitarias

Funciones de PHPUnit 

Exceptions

class UnicornsTest extends PHPUnit_Framework_TestCase() {
    /**
     * @expectedException        Exception
     * @expectedExceptionMessage Not enough unicorns to steal
     */
    public function test_cant_steal() {
        $unicorns = Unicorns();
        $unicorns->steal(1000);
    }
}
PHPUnit 3.4.0 by Sebastian Bergmann.

.

Time: 0 seconds, Memory: 0.5Mb

OK (1 tests, 1 assertions)

Pruebas Unitarias

Funciones de PHPUnit 

Annontations

Son decorators especiales para clases y funciones.

Sirven sobre todo para darle información adicional

PHPunit

By Richard Cotrina