Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Diseño emergente con phpspec (PHPmad)

Diseño emergente con phpspec (PHPmad)

Introducción a phpspec, una librería PHP para realizar specBDD.
Repasaremos también cómo puede ayudarnos a detectar posibles errores en el diseño de nuestras clases.

391d70e6cfd94b56b666f5074479202a?s=128

Francisco Santamaria

October 22, 2014
Tweet

Transcript

  1. DISEÑO EMERGENTE CON PHPSPEC

  2. ¿Quién soy? Francisco Santamaria Trabajo en Unidad Editorial kikobolingas@gmail.com @kikobolingas

  3. Behaviour Driven Development

  4. DEFINICIÓN http://dannorth.net/introducing-bdd/

  5. 2 escuelas diferentes Chicago / Clásica • Chequeo del resultado

    • Estado del objeto Londres / Mockists • Paso de mensajes • Comunicación entre objetos
  6. Ciclo BDD

  7. Ciclo BDD

  8. ¿Otra herramienta más? ¿No nos vale PHPUnit?

  9. PHPUnit style

  10. ¿Really?

  11. phpspec style

  12. The key in making great and growable systems is much

    more to design how its modules communicate rather than what their internal properties and behaviors should be. Alay Kay [Kay98] Messaging “ ”
  13. ¿Qué es phpspec? • Port de rspec a PHP •

    PHP >= 5.3.3 • Prophecy como librería de mocking • Muy frustrante si se utiliza para hacer cosas para las que no fue diseñado
  14. phpspec - Términos ➢ Test Case => Specification ➢ Test

    => Example ➢ Assert => Expectation
  15. phpspec - Instalación A través de composer:

  16. phpspec - Flujo de trabajo 1. Se describe la clase

    2. Creación de ejemplos 3. Ejecución de los ejemplos 4. Implementación de código 5. Más ejemplos, refactorización ...
  17. phpspec - Matchers

  18. phpspec - Matchers • Identidad • Comparación • Throw •

    Tipo • StringStart • ArrayKey • Estado del objeto • Count • Escalar • Inline • StringEnd • Regex
  19. Matchers - Identidad ===

  20. Matchers - Comparación ==

  21. Matchers - Throw

  22. Matchers - Tipo

  23. Matchers - Estado del objecto • be -> is •

    have -> has
  24. Matchers - Count array ó interfaz \Countable

  25. Matchers - Escalar funciones nativas is_string, is_array

  26. Matchers - Inline

  27. Let & Letgo ➢ Equivalentes al setUp() y tearDown() de

    PHPUnit.
  28. Construcción del SUT Disponible en v2.1.0-RC1 :

  29. Doubles (a.k.a. Colaboradores)

  30. Doubles - Dummy

  31. Doubles - Dummy

  32. Doubles - Stub

  33. Doubles - Mock

  34. Doubles - Spy

  35. Doubles - Fake • Funcional pero no para producción •

    Requiere una implementación manual • Rápida Ej: BBDD en memoria, sistema de ficheros virtuales, etc...
  36. DEMO

  37. Code Smells

  38. Demasiados Colaboradores

  39. Demasiados colaboradores

  40. Demasiados colaboradores

  41. Stubs que devuelven stubs, que devuelven stubs, que devuelven stubs,

    que devuelven stubs,...
  42. Stubs que devuelven stubs

  43. Stubs que devuelven stubs

  44. Stubs que devuelven stubs

  45. Partial mocks

  46. Partial mocks

  47. Partial mocks

  48. Partial mocks

  49. Evitar la fragilidad

  50. Evitar la fragilidad 1. Evita la sobreespecificación 2. No uses

    mocks para queries, utiliza stubs 3. No hagas mocking de librerías de terceros 4. Evita especificar secuencia de llamadas
  51. ¿PREGUNTAS? GRACIAS

  52. Referencias phpspec documentation On messaging - Alan Kay Design How

    Your Objects Talk Through Mocking - Konstantin Kudryashov Emergent Design with PhpSpec - Marcello Duarte Why Your Test Suite Sucks - Ciaran McNulty Testing para aplicaciones Symfony2 - Fernando Arconada My top ten favourite PhpSpec limitations - Marcello Duarte Understanding PhpSpec - Peter Suhm Mocks Aren't Stubs, Fakes, Dummies or Spies - Dave Marshall Named Constructors in PHP - Matthias Verraes Propecy Repository To mock or not to mock - Jordi Llonch & Eloi Poch PHPSpec 2 - The only Design Tool you need - - Kacper Gunia
  53. Imágenes From Growing Object-Oriented Software by Nat Pryce and Steve

    Freeman Terminator 2: Judment Day - TriStar Pictures Batman Returns - Warner Brothers Una cuestión de equilibrio