SlideShare una empresa de Scribd logo
Introducción a!
Testing
Testing
¿Para que sirve?
¿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!
¿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 uno de los módulos funcione
correctamente por separado.

http://es.wikipedia.org/wiki/Prueba_unitaria
¿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
¿Desventajas?
•

No muestran errores de integración!

•

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

•

Código extenso
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)!
    {!
        $this->number = $number;!
    }!

!

    public function getNumber()!
    {!
        return $this->number;!
    }!

!

    public function sum($number)!
    {!
        return $this->number += $number;!
    }!
}
<?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());!
    }!
}
<?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
<?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
<?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
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');
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 1
$pear install pear.phpunit.de/PHPUnit

# 3 - PHP Archive (PHAR)!
$ wget https://phar.phpunit.de/phpunit.phar
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 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
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 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
Herramientas
PHPUnit Mock Objects http://phpunit.de/ !
Mockery https://github.com/padraic/mockery!
Prophecy https://github.com/phpspec/prophecy
<?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);!
    }!
}

!
!
<?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
    }!
    }!
}
}
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'));!
}
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
¿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
¿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
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());!
    }!
}
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
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
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 el funcionamiento de la aplicación.!
Se separan en features.!
Cada feature desarrolla uno o más escenarios.
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
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”
Para los tests de funcionalidades web se debe utilizar la extensión Mink
y uno de los drivers para navegadores.

http://mink.behat.org/
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/
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 de varios módulos
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
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
¿Preguntas?
¡Gracias!

Más contenido relacionado

PPTX
Testing & Pizza by Lito & nitsnets
PDF
Artículo 3 sobre la plataforma ECLIPSE
PPTX
Testing en equipos ágiles con Microsoft Test Manager y Lab Manager 2010
PDF
The billion dollar mistake
PDF
Introducción a automatización de pruebas web
PPTX
Unit testing
DOCX
Las excepciones standar
PPTX
Test Automation .NET
Testing & Pizza by Lito & nitsnets
Artículo 3 sobre la plataforma ECLIPSE
Testing en equipos ágiles con Microsoft Test Manager y Lab Manager 2010
The billion dollar mistake
Introducción a automatización de pruebas web
Unit testing
Las excepciones standar
Test Automation .NET

Similar a Introducción a testing en php (20)

PDF
To mock or not to mock
PDF
DeSymfonyDay 2014 - To mock or not to mock - Spanish
PDF
DeSymfonyDay 2014 - To mock or not to mock - Spanish
PDF
DeSymfonyDay 2014 - To mock or not to mock - Spanish
PDF
PHP Unit y TDD
PDF
Introducción a TDD y PHPUnit
PPTX
Test Unitarios y E2E front y Back
PPTX
Meetup: Sesion #1 Unit Testing & Simian Army
PPTX
Pruebas Automatizadas
PPTX
Unit Testing with Mock Objects
PPTX
Pruebas automaticas
ODP
Testing etapa olvidada
PPTX
Testeo unitario
PDF
Automatizacion de Pruebas
PDF
presentacion de programacion Software testing.pdf
PDF
Pruebas unitarias
PDF
Charla evento TestingUY 2017 - El mokeo como herramienta para pruebas de Soft...
PDF
Conceptos básicos de Unit Test
PDF
Desarrollo con Java y metodologías agiles
To mock or not to mock
DeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - Spanish
PHP Unit y TDD
Introducción a TDD y PHPUnit
Test Unitarios y E2E front y Back
Meetup: Sesion #1 Unit Testing & Simian Army
Pruebas Automatizadas
Unit Testing with Mock Objects
Pruebas automaticas
Testing etapa olvidada
Testeo unitario
Automatizacion de Pruebas
presentacion de programacion Software testing.pdf
Pruebas unitarias
Charla evento TestingUY 2017 - El mokeo como herramienta para pruebas de Soft...
Conceptos básicos de Unit Test
Desarrollo con Java y metodologías agiles
Publicidad

Más de Ismael Ambrosi (6)

PDF
Assetic PHPmvd
PDF
Symfony forms
PDF
Doctrine
PDF
Empezando con Twig
PDF
Introducción a composer
PDF
Introducción a Symfony
Assetic PHPmvd
Symfony forms
Doctrine
Empezando con Twig
Introducción a composer
Introducción a Symfony
Publicidad

Último (20)

PPTX
COMO AYUDAN LAS TIC EN LA EDUCACION SUPERIOR.pptx
PDF
Estrategia de apoyo tecnología miguel angel solis
DOCX
Zarate Quispe Alex aldayir aplicaciones de internet .docx
PDF
taller de informática - LEY DE OHM
PPTX
sa-cs-82-powerpoint-hardware-y-software_ver_4.pptx
PDF
Plantilla para Diseño de Narrativas Transmedia.pdf
PPTX
Sesion 1 de microsoft power point - Clase 1
PPTX
Power Point Nicolás Carrasco (disertación Roblox).pptx
PPTX
REDES INFORMATICAS REDES INFORMATICAS.pptx
PPTX
Acronis Cyber Protect Cloud para Ciber Proteccion y Ciber Seguridad LATAM - A...
PDF
Influencia-del-uso-de-redes-sociales.pdf
PPTX
RAP02 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
PDF
CyberOps Associate - Cisco Networking Academy
PPTX
ANCASH-CRITERIOS DE EVALUACIÓN-FORMA-10-10 (2).pptx
PDF
MÓDULO DE CALOR DE GRADO DE MEDIO DE FORMACIÓN PROFESIONAL
PPTX
Presentación PASANTIAS AuditorioOO..pptx
PPTX
RAP01 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
PPT
Que son las redes de computadores y sus partes
PPTX
Presentación de Redes de Datos modelo osi
PDF
programa-de-estudios-2011-guc3ada-para-el-maestro-secundarias-tecnicas-tecnol...
COMO AYUDAN LAS TIC EN LA EDUCACION SUPERIOR.pptx
Estrategia de apoyo tecnología miguel angel solis
Zarate Quispe Alex aldayir aplicaciones de internet .docx
taller de informática - LEY DE OHM
sa-cs-82-powerpoint-hardware-y-software_ver_4.pptx
Plantilla para Diseño de Narrativas Transmedia.pdf
Sesion 1 de microsoft power point - Clase 1
Power Point Nicolás Carrasco (disertación Roblox).pptx
REDES INFORMATICAS REDES INFORMATICAS.pptx
Acronis Cyber Protect Cloud para Ciber Proteccion y Ciber Seguridad LATAM - A...
Influencia-del-uso-de-redes-sociales.pdf
RAP02 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
CyberOps Associate - Cisco Networking Academy
ANCASH-CRITERIOS DE EVALUACIÓN-FORMA-10-10 (2).pptx
MÓDULO DE CALOR DE GRADO DE MEDIO DE FORMACIÓN PROFESIONAL
Presentación PASANTIAS AuditorioOO..pptx
RAP01 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
Que son las redes de computadores y sus partes
Presentación de Redes de Datos modelo osi
programa-de-estudios-2011-guc3ada-para-el-maestro-secundarias-tecnicas-tecnol...

Introducción a testing en php