Introducción a!
Testing
Testing
¿Para que sirve?
¿Para que sirve?
•

Verificar del funcionamiento de la aplicación!

•

Automatización!

•

Evitar recurrir en bugs!

•

Con...
¿Que vamos a ver?
•

Unit Testing!

•

Functional Testing
Unit Testing
Es una forma de probar el correcto funcionamiento de un módulo de
código. Esto sirve para asegurar que cada u...
¿Ventajas?
•

Facilita el debug!

•

Demuestra el funcionamiento del código sin importar el entorno!

•

Viendo el test pu...
¿Desventajas?
•

No muestran errores de integración!

•

Es difícil anticipar todos los casos de uso y futuros bugs!

•

C...
Herramientas
PHPUnit http://phpunit.de/!
SimpleTest http://simpletest.org/!
SnapTest https://github.com/Jakobo/snaptest
Herramientas
PHPUnit http://phpunit.de/!
SimpleTest http://simpletest.org/!
SnapTest https://github.com/Jakobo/snaptest
<?php!

!

namespace IsmaAmbrosi;!

!

class Math!
{!
    private $number;!

!

    public function __construct($number)!
...
<?php!

!

namespace 

!

class Math!
{!
    private 

!

    public function 
    {!
        $this
    }!

!

    public ...
<?php!

!

namespace 

!

class Math!
{!
    private 

!

    public function 
    {!
        $this
    }!

!

    public ...
<?php!

!

namespace 

!

class Math!
{!
    private 

!

    public function 
    {!
        $this
    }!

!

    public ...
<?php!

!

namespace 

!

class Math!
{!
    private 

!

    public function 
    {!
        $this
    }!

!

    public ...
Métodos comunes
$this->assertEquals(2, 1 + 1);!
$this->assertTrue(2 == 2);!
$this->assertFalse(2 == 4);!
$this->assertNull...
Nota: La falla en el assert finaliza la ejecución del método test.
Instalación
# 1 - Composer!
$ composer require —dev “phpunit/phpunit” “~3.7”

# 2 - Pear!
$ pear config-set auto_discover ...
Ejecución
$ phpunit

# Single test class!
$ phpunit tests/Namespace/ClassTest.php

# Proyecto de Symfony!
$ phpunit -c app
Test Driven Development
Es un proceso de desarrollo que se basa en la repetición de un corto ciclo
de desarrollo: Primero ...
Escritura de test

Escritura del código necesario para pasar el test

Refactorización

Verificación de los tests
Code Coverage
IsmaAmbrosiGeneratorBundle
Code Coverage
IsmaAmbrosiGeneratorBundle
Mock Objects
Son objetos que imitan el comportamiento de objetos reales de una forma
controlada. Se usan para probar a otr...
Herramientas
PHPUnit Mock Objects http://phpunit.de/ !
Mockery https://github.com/padraic/mockery!
Prophecy https://github...
<?php!

<?php!

namespace IsmaAmbrosiLogger;!

namespace IsmaAmbrosiLogger;!

/**!
 * Class Logger!
 *!
 * @package IsmaAm...
<?php!

!

namespace 

!

<?php!

!

namespace IsmaAmbrosiTestsLogger;!

!

<?php!

!

namespace 

!

/**!
/**!
use IsmaAm...
Ejemplo
!
# src/IsmaAmbrosi/Logger/Logger.php!
public function log($text)!
{!
    return $this->handler->write($text);!
}!...
Functional Testing
Una prueba funcional es una prueba basada en la ejecución, revisión y
retroalimentación de las funciona...
¿Ventajas?
•

Se escriben una sola vez!

•

Ofrecen mayor cobertura de casos de uso!

•

Puedo ver como se comporta mi apl...
¿Desventajas?
•

Es difícil descubrir todos los errores del código!

•

No siempre puedo determinar que hace el código!

•...
Ejemplo (Symfony)
<?php!

!

namespace IsmaAmbrosiMyBundleTestsController;!

!

use SymfonyBundleFrameworkBundleTestWebTes...
Pruebas de Integración

Son aquellas que se realizan en el ámbito del desarrollo de software una
vez que se han aprobado l...
Behavior Driven Development
Es una técnica de desarrollo ágil de software que nos permite crear una
aplicación describiend...
Herramientas

•

Behat http://behat.org!

•

PHPUnit http://phpunit.de/
Behat

Un framework PHP para testing de las expectativas de negocios.
Behat
Se escriben historias en lenguaje entendible para cualquier
humano(Gherkin).!
Esas historias luego se comprueban con...
Feature
Feature: ls!
In order to see the directory structure!
As a UNIX user!
I need to be able to list the current direct...
Feature para Web
Feature: Login!
Para poder acceder al sistema!
Como un usuario registrado!
Necesito poder identificarme c...
Para los tests de funcionalidades web se debe utilizar la extensión Mink
y uno de los drivers para navegadores.

http://mi...
Para los tests de funcionalidades web se debe utilizar la extensión Mink
y uno de los drivers para navegadores.

Goutte

S...
Resumen
Resumen
•

Utilizamos Unit Testing para probar pequeños módulos
Resumen
•

Utilizamos Unit Testing para probar pequeños módulos!

•

Utilizamos Integration Testing para probar la union d...
Resumen
•

Utilizamos Unit Testing para probar pequeños módulos!

•

Utilizamos Integration Testing para probar la union d...
Resumen
•

Utilizamos Unit Testing para probar pequeños módulos!

•

Utilizamos Integration Testing para probar la union d...
¿Preguntas?
¡Gracias!
Upcoming SlideShare
Loading in …5
×

Introducción a testing en php

353 views
231 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
353
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Introducción a testing en php

  1. 1. Introducción a! Testing
  2. 2. Testing ¿Para que sirve?
  3. 3. ¿Para que sirve? • Verificar del funcionamiento de la aplicación! • Automatización! • Evitar recurrir en bugs! • Construir casos de uso difíciles de reproducir! • Simplificar la introducción de cambios! • Simplificar la refactorización!
  4. 4. ¿Que vamos a ver? • Unit Testing! • Functional Testing
  5. 5. Unit Testing Es una forma de probar el correcto funcionamiento de un módulo de código. Esto sirve para asegurar que cada uno de los módulos funcione correctamente por separado. http://es.wikipedia.org/wiki/Prueba_unitaria
  6. 6. ¿Ventajas? • Facilita el debug! • Demuestra el funcionamiento del código sin importar el entorno! • Viendo el test puedo determinar que hace el código! • Confirma si el pequeño cambio en realidad fue tan pequeño! • El código tiende a ser más limpio! • Nos permite corregir bugs y asegurarnos que no vuelven a aparecer! • Simplifica la integración
  7. 7. ¿Desventajas? • No muestran errores de integración! • Es difícil anticipar todos los casos de uso y futuros bugs! • Código extenso
  8. 8. Herramientas PHPUnit http://phpunit.de/! SimpleTest http://simpletest.org/! SnapTest https://github.com/Jakobo/snaptest
  9. 9. Herramientas PHPUnit http://phpunit.de/! SimpleTest http://simpletest.org/! SnapTest https://github.com/Jakobo/snaptest
  10. 10. <?php! ! namespace IsmaAmbrosi;! ! class Math! {!     private $number;! !     public function __construct($number)!     {!         $this->number = $number;!     }! !     public function getNumber()!     {!         return $this->number;!     }! !     public function sum($number)!     {!         return $this->number += $number;!     }! }
  11. 11. <?php! ! namespace  ! class Math! {!     private  !     public function      {!         $this     }! !     public function      {!         return      }! !     public function      {!         return      }! } <?php! ! namespace IsmaAmbrosiTests;! ! use IsmaAmbrosiMath;! ! /**!  * Class MathTest!  *!  * @package IsmaAmbrosiTests!  */! class MathTest extends PHPUnit_Framework_TestCase! {!     public function testSumWorks()!     {!         $math = new Math(5);! !         $this->assertEquals(5, $math->getNumber());! !         $math->sum(2); # Sumo 2 al valor original! !         $this->assertEquals(7, $math->getNumber());!     }! }
  12. 12. <?php! ! namespace  ! class Math! {!     private  !     public function      {!         $this     }! !     public function      {!         return      }! !     public function      {!         return      }! } <?php! ! namespace IsmaAmbrosiTests;! ! use IsmaAmbrosiMath;! ! /**!  * Class MathTest!  *!  * @package IsmaAmbrosiTests!  */! class MathTest extends PHPUnit_Framework_TestCase! {!     public function testSumWorks()!     {!         $math = new Math(5);! !         $this->assertEquals(5, $math->getNumber());! !         $math->sum(2); # Sumo 2 al valor original! !         $this->assertEquals(7, $math->getNumber());!     }! } Clase base para las clases de tests
  13. 13. <?php! ! namespace  ! class Math! {!     private  !     public function      {!         $this     }! !     public function      {!         return      }! !     public function      {!         return      }! } <?php! ! namespace IsmaAmbrosiTests;! ! use IsmaAmbrosiMath;! ! /**!  * Class MathTest!  *!  * @package IsmaAmbrosiTests!  */! class MathTest extends PHPUnit_Framework_TestCase! {!     public function testSumWorks()!     {!         $math = new Math(5);! !         $this->assertEquals(5, $math->getNumber());! !         $math->sum(2); # Sumo 2 al valor original! !         $this->assertEquals(7, $math->getNumber());!     }! } Verifica el valor de getNumber() es el original
  14. 14. <?php! ! namespace  ! class Math! {!     private  !     public function      {!         $this     }! !     public function      {!         return      }! !     public function      {!         return      }! } <?php! ! namespace IsmaAmbrosiTests;! ! use IsmaAmbrosiMath;! ! /**!  * Class MathTest!  *!  * @package IsmaAmbrosiTests!  */! class MathTest extends PHPUnit_Framework_TestCase! {!     public function testSumWorks()!     {!         $math = new Math(5);! !         $this->assertEquals(5, $math->getNumber());! !         $math->sum(2); # Sumo 2 al valor original! !         $this->assertEquals(7, $math->getNumber());!     }! } Verifica que el valor actual sea igual al resultado de la suma
  15. 15. Métodos comunes $this->assertEquals(2, 1 + 1);! $this->assertTrue(2 == 2);! $this->assertFalse(2 == 4);! $this->assertNull(null);! $this->assertInstanceOf('NamespaceClass', $instance);! $this->assertEmpty("");! $this->assertGreaterThan(2, 5);! $this->assertLessThan(2, 1);! $this->assertCount(3, array(1, 2, 3));! $this->assertFileExists('/path/to/file.txt');
  16. 16. Nota: La falla en el assert finaliza la ejecución del método test.
  17. 17. Instalación # 1 - Composer! $ composer require —dev “phpunit/phpunit” “~3.7” # 2 - Pear! $ pear config-set auto_discover 1 $pear install pear.phpunit.de/PHPUnit # 3 - PHP Archive (PHAR)! $ wget https://phar.phpunit.de/phpunit.phar
  18. 18. Ejecución $ phpunit # Single test class! $ phpunit tests/Namespace/ClassTest.php # Proyecto de Symfony! $ phpunit -c app
  19. 19. Test Driven Development Es un proceso de desarrollo que se basa en la repetición de un corto ciclo de desarrollo: Primero se desarrollan los test, definiendo como debe funcionar la librería a desarrollar, luego se escribe la mínima cantidad de código necesaria para que pasen los tests, y finalmente se hace la refactorización del código a los estandares aceptables. http://en.wikipedia.org/wiki/Test-driven_development
  20. 20. Escritura de test Escritura del código necesario para pasar el test Refactorización Verificación de los tests
  21. 21. Code Coverage IsmaAmbrosiGeneratorBundle
  22. 22. Code Coverage IsmaAmbrosiGeneratorBundle
  23. 23. Mock Objects Son objetos que imitan el comportamiento de objetos reales de una forma controlada. Se usan para probar a otros objetos en pruebas unitarias que esperan mensajes de una clase en particular para sus métodos, al igual que los diseñadores de autos usan un crash dummy cuando simulan un accidente. http://es.wikipedia.org/wiki/Objeto_simulado
  24. 24. Herramientas PHPUnit Mock Objects http://phpunit.de/ ! Mockery https://github.com/padraic/mockery! Prophecy https://github.com/phpspec/prophecy
  25. 25. <?php! <?php! namespace IsmaAmbrosiLogger;! namespace IsmaAmbrosiLogger;! /**!  * Class Logger!  *!  * @package IsmaAmbrosiLogger!  */! class Logger! {!     private $handler;! /**!  * Interface HandlerInterface!  *!  * @package IsmaAmbrosiLogger!  */! interface HandlerInterface! {!     public function write($log);! } ! ! !     public function __construct(HandlerInterface $handler)!     {!         $this->handler = $handler;!     }! !     public function log($text)!     {!         return $this->handler->write($text);!     }! } ! !
  26. 26. <?php! ! namespace  ! <?php! ! namespace IsmaAmbrosiTestsLogger;! ! <?php! ! namespace  ! /**! /**! use IsmaAmbrosiLoggerLogger;!  * Class Logger!  * Interface HandlerInterface! !  *!  *! /**!  * @package IsmaAmbrosiLogger!  * @package IsmaAmbrosiLogger!  * Class LoggerTest!  */!  */!  *! class Logger! interface   * @package IsmaAmbrosiTestsLogger! {! {!  */!     private      public function  class LoggerTest extends PHPUnit_Framework_TestCase! ! } {!     public function      public function testLogger()!     {!     {!                  $handler = $this->getMock('IsmaAmbrosiLoggerHandlerInterface');!     }! ! !         $logger = new Logger($handler);!     public function  !     {!         $logger->log('Este es un mensaje de log');!         return     }!     }! } }
  27. 27. Ejemplo ! # src/IsmaAmbrosi/Logger/Logger.php! public function log($text)! {!     return $this->handler->write($text);! }! ! ! # src/IsmaAmbrosi/Tests/Logger/LoggerTest.php! public function testLogger()! {!     $handler = $this->getMock('IsmaAmbrosiLoggerHandlerInterface');!     $handler!         ->expects($this->any())!         ->method('write')!         ->will($this->returnValue(7));! !     $logger = new Logger($handler);! !     $this->assertEquals(7, $logger->log('Message'));! }
  28. 28. Functional Testing Una prueba funcional es una prueba basada en la ejecución, revisión y retroalimentación de las funcionalidades previamente diseñadas para el software. Son pruebas específicas, concretas y exhaustivas para probar y validar que el software hace lo que debe y sobre todo, lo que se ha especificado. http://es.wikipedia.org/wiki/Pruebas_funcionales
  29. 29. ¿Ventajas? • Se escriben una sola vez! • Ofrecen mayor cobertura de casos de uso! • Puedo ver como se comporta mi aplicación y para casos específicos! • Sirven como test de integración en algunos casos! • Confirma si los pequeños cambios en realidad fue tan pequeños
  30. 30. ¿Desventajas? • Es difícil descubrir todos los errores del código! • No siempre puedo determinar que hace el código! • Es difícil anticipar todos los casos de uso y futuros bugs
  31. 31. Ejemplo (Symfony) <?php! ! namespace IsmaAmbrosiMyBundleTestsController;! ! use SymfonyBundleFrameworkBundleTestWebTestCase;! ! class DefaultControllerTest extends WebTestCase! {!     public function testIndex()!     {!         $client = static::createClient();! !         $crawler = $client->request('GET', '/');! !         $this->assertEquals(1, $crawler->filter('h1:contains("Welcome")')->count());!     }! }
  32. 32. Pruebas de Integración Son aquellas que se realizan en el ámbito del desarrollo de software una vez que se han aprobado las pruebas unitarias. Únicamente se refieren a la prueba o pruebas de todos los elementos unitarios que componen un proceso, hecha en conjunto, de una sola vez. http://es.wikipedia.org/wiki/Pruebas_de_integración
  33. 33. Behavior Driven Development Es una técnica de desarrollo ágil de software que nos permite crear una aplicación describiendo su funcionamiento desde la perspectiva de los inversores. http://www.ticketea.com/introduccion-bdd-granada
  34. 34. Herramientas • Behat http://behat.org! • PHPUnit http://phpunit.de/
  35. 35. Behat Un framework PHP para testing de las expectativas de negocios.
  36. 36. Behat Se escriben historias en lenguaje entendible para cualquier humano(Gherkin).! Esas historias luego se comprueban con el funcionamiento de la aplicación.! Se separan en features.! Cada feature desarrolla uno o más escenarios.
  37. 37. Feature Feature: ls! In order to see the directory structure! As a UNIX user! I need to be able to list the current directory's contents! ! Scenario: List 2 files in a directory! Given I am in a directory "test"! And I have a file named "foo"! And I have a file named "bar"! When I run "ls"! Then I should get:! """! bar! foo! """ http://docs.behat.org/quick_intro.html
  38. 38. Feature para Web Feature: Login! Para poder acceder al sistema! Como un usuario registrado! Necesito poder identificarme con un usuario y contraseña! ! Scenario: Ingreso al sistema con usuario válido! Given I am on “/login”! When I fill in “username” with “iambrosi”! And I fill in “password” with “12345”! And I press “Ingresar”! Then I should see “Bienvenido Ismael”
  39. 39. Para los tests de funcionalidades web se debe utilizar la extensión Mink y uno de los drivers para navegadores. http://mink.behat.org/
  40. 40. Para los tests de funcionalidades web se debe utilizar la extensión Mink y uno de los drivers para navegadores. Goutte Sahi Zombie Selenium Selenium2 http://mink.behat.org/
  41. 41. Resumen
  42. 42. Resumen • Utilizamos Unit Testing para probar pequeños módulos
  43. 43. Resumen • Utilizamos Unit Testing para probar pequeños módulos! • Utilizamos Integration Testing para probar la union de varios módulos
  44. 44. Resumen • Utilizamos Unit Testing para probar pequeños módulos! • Utilizamos Integration Testing para probar la union de varios módulos ! • Utilizamos Fuctional Testing para probar el resultado de la ejecución
  45. 45. Resumen • Utilizamos Unit Testing para probar pequeños módulos! • Utilizamos Integration Testing para probar la union de varios módulos! • Utilizamos Fuctional Testing para probar el resultado de la ejecución! • Utilizamos BDD(Behat) para desarrollar los test tal cual es visto en el negocio
  46. 46. ¿Preguntas?
  47. 47. ¡Gracias!

×