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?”
-
“¿É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.phpPHPUnit 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.phpPHPUnit 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.phpPHPUnit 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
PHPunit
- 1,328