Introducción a testing en php
-
Upload
ismael-ambrosi -
Category
Technology
-
view
160 -
download
4
Transcript of Introducción a testing en php
![Page 1: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/1.jpg)
Introducción a!Testing
![Page 2: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/2.jpg)
Testing¿Para que sirve?
![Page 3: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/3.jpg)
¿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!
![Page 4: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/4.jpg)
¿Que vamos a ver?
• Unit Testing!
• Functional Testing
![Page 5: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/5.jpg)
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
![Page 6: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/6.jpg)
¿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
![Page 7: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/7.jpg)
¿Desventajas?
• No muestran errores de integración!
• Es difícil anticipar todos los casos de uso y futuros bugs!
• Código extenso
![Page 8: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/8.jpg)
Herramientas
PHPUnit http://phpunit.de/!
SimpleTest http://simpletest.org/!
SnapTest https://github.com/Jakobo/snaptest
![Page 9: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/9.jpg)
Herramientas
PHPUnit http://phpunit.de/!
SimpleTest http://simpletest.org/!
SnapTest https://github.com/Jakobo/snaptest
![Page 10: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/10.jpg)
<?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;! }!}
![Page 11: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/11.jpg)
<?php!!namespace !class Math!{! private ! public function {! $this }!! public function {! return }!! public function {! return }!}
<?php!!namespace IsmaAmbrosi\Tests;!!use IsmaAmbrosi\Math;!!/**! * Class MathTest! *! * @package IsmaAmbrosi\Tests! */!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());! }!}
![Page 12: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/12.jpg)
<?php!!namespace !class Math!{! private ! public function {! $this }!! public function {! return }!! public function {! return }!}
<?php!!namespace IsmaAmbrosi\Tests;!!use IsmaAmbrosi\Math;!!/**! * Class MathTest! *! * @package IsmaAmbrosi\Tests! */!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
![Page 13: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/13.jpg)
<?php!!namespace !class Math!{! private ! public function {! $this }!! public function {! return }!! public function {! return }!}
<?php!!namespace IsmaAmbrosi\Tests;!!use IsmaAmbrosi\Math;!!/**! * Class MathTest! *! * @package IsmaAmbrosi\Tests! */!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
![Page 14: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/14.jpg)
<?php!!namespace !class Math!{! private ! public function {! $this }!! public function {! return }!! public function {! return }!}
<?php!!namespace IsmaAmbrosi\Tests;!!use IsmaAmbrosi\Math;!!/**! * Class MathTest! *! * @package IsmaAmbrosi\Tests! */!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
![Page 15: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/15.jpg)
Métodos comunes$this->assertEquals(2, 1 + 1);!$this->assertTrue(2 == 2);!$this->assertFalse(2 == 4);!$this->assertNull(null);!$this->assertInstanceOf('Namespace\Class', $instance);!$this->assertEmpty("");!$this->assertGreaterThan(2, 5);!$this->assertLessThan(2, 1);!$this->assertCount(3, array(1, 2, 3));!$this->assertFileExists('/path/to/file.txt');
![Page 16: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/16.jpg)
Nota: La falla en el assert finaliza la ejecución del método test.
![Page 17: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/17.jpg)
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
![Page 18: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/18.jpg)
Ejecución
$ phpunit
# Single test class!$ phpunit tests/Namespace/ClassTest.php
# Proyecto de Symfony!$ phpunit -c app
![Page 19: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/19.jpg)
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
![Page 20: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/20.jpg)
Escritura de test
Escritura del código necesario para pasar el test
Refactorización
Verificación de los tests
![Page 21: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/21.jpg)
Code CoverageIsmaAmbrosiGeneratorBundle
![Page 22: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/22.jpg)
Code CoverageIsmaAmbrosiGeneratorBundle
![Page 23: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/23.jpg)
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
![Page 24: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/24.jpg)
Herramientas
PHPUnit Mock Objects http://phpunit.de/ !
Mockery https://github.com/padraic/mockery!
Prophecy https://github.com/phpspec/prophecy
![Page 25: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/25.jpg)
<?php!!namespace IsmaAmbrosi\Logger;!!/**! * Class Logger! *! * @package IsmaAmbrosi\Logger! */!class Logger!{! private $handler;!! public function __construct(HandlerInterface $handler)! {! $this->handler = $handler;! }!! public function log($text)! {! return $this->handler->write($text);! }!}
<?php!!namespace IsmaAmbrosi\Logger;!!/**! * Interface HandlerInterface! *! * @package IsmaAmbrosi\Logger! */!interface HandlerInterface!{! public function write($log);!}
![Page 26: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/26.jpg)
<?php!!namespace !/**! * Class Logger! *! * @package IsmaAmbrosi\Logger! */!class Logger!{! private ! public function {! }!! public function {! return }!}
<?php!!namespace !/**! * Interface HandlerInterface! *! * @package IsmaAmbrosi\Logger! */!interface {! public function }
<?php!!namespace IsmaAmbrosi\Tests\Logger;!!use IsmaAmbrosi\Logger\Logger;!!/**! * Class LoggerTest! *! * @package IsmaAmbrosi\Tests\Logger! */!class LoggerTest extends \PHPUnit_Framework_TestCase!{! public function testLogger()! {! $handler = $this->getMock('IsmaAmbrosi\Logger\HandlerInterface');!! $logger = new Logger($handler);!! $logger->log('Este es un mensaje de log');! }!}
![Page 27: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/27.jpg)
!# 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('IsmaAmbrosi\Logger\HandlerInterface');! $handler! ->expects($this->any())! ->method('write')! ->will($this->returnValue(7));!! $logger = new Logger($handler);!! $this->assertEquals(7, $logger->log('Message'));!}
Ejemplo
![Page 28: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/28.jpg)
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
![Page 29: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/29.jpg)
¿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
![Page 30: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/30.jpg)
¿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
![Page 31: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/31.jpg)
<?php!!namespace IsmaAmbrosi\MyBundle\Tests\Controller;!!use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;!!class DefaultControllerTest extends WebTestCase!{! public function testIndex()! {! $client = static::createClient();!! $crawler = $client->request('GET', '/');!! $this->assertEquals(1, $crawler->filter('h1:contains("Welcome")')->count());! }!}
Ejemplo (Symfony)
![Page 32: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/32.jpg)
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
![Page 33: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/33.jpg)
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
![Page 34: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/34.jpg)
Herramientas
• Behat http://behat.org!
• PHPUnit http://phpunit.de/
![Page 35: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/35.jpg)
Behat
Un framework PHP para testing de las expectativas de negocios.
![Page 36: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/36.jpg)
BehatSe 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.
![Page 37: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/37.jpg)
FeatureFeature: 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
![Page 38: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/38.jpg)
Feature para WebFeature: 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”
![Page 39: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/39.jpg)
Para los tests de funcionalidades web se debe utilizar la extensión Mink y uno de los drivers para navegadores.
http://mink.behat.org/
![Page 40: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/40.jpg)
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/
![Page 41: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/41.jpg)
Resumen
![Page 42: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/42.jpg)
Resumen• Utilizamos Unit Testing para probar pequeños módulos
![Page 43: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/43.jpg)
Resumen• Utilizamos Unit Testing para probar pequeños módulos!
• Utilizamos Integration Testing para probar la union de varios módulos
![Page 44: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/44.jpg)
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
![Page 45: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/45.jpg)
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
![Page 46: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/46.jpg)
¿Preguntas?
![Page 47: Introducción a testing en php](https://reader033.fdocuments.co/reader033/viewer/2022042511/5597078f1a28abb42f8b460d/html5/thumbnails/47.jpg)
¡Gracias!