Código Fácil De Testear
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Código Fácil De Testear

  • 5,532 views
Uploaded on

Charla dada durante la conferencia deSymfony en Castellón, España....

Charla dada durante la conferencia deSymfony en Castellón, España.

http://www.desymfony.com

More in: Technology , Education
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
5,532
On Slideshare
2,538
From Embeds
2,994
Number of Embeds
24

Actions

Shares
Downloads
57
Comments
0
Likes
3

Embeds 2,994

http://magdkudama.com 832
http://blog.liip.ch 702
http://www.symfony.es 569
http://desymfony.com 437
https://blog.liip.ch 226
http://symfony.es 90
http://www.desymfony.com 43
http://desymfony.es 24
http://blog.local 19
http://librosweb.es 15
http://192.168.11.11 6
http://www.desymfony.es 5
http://coderwall.com 4
http://www.aggregator.ch 4
http://5.135.163.193 3
http://192.168.11.10 3
http://www.newsblur.com 3
https://twitter.com 3
http://desymfony.local 1
http://desymfony.eu 1
http://ranksit.com 1
http://www.magdkudama.com 1
http://tech.local 1
http://news.google.com 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Saturday, June 16, 12
  • 2. Saturday, June 16, 12
  • 3. Acerca de • Programador en Liip AG | Zürich • Blog: http://videlalvaro.github.com/ • Twitter: @old_soundSaturday, June 16, 12
  • 4. Hecho en UruguaySaturday, June 16, 12
  • 5. Acerca de Co Autor de ConillMQ en acció http://bit.ly/rabbitmqSaturday, June 16, 12
  • 6. Acerca de Co Autor de RabbitMQ in Action http://bit.ly/rabbitmqSaturday, June 16, 12
  • 7. No SoySaturday, June 16, 12
  • 8. No Soy • Gurú del testeo de aplicacionesSaturday, June 16, 12
  • 9. No Soy • Guru del testeo de aplicaciones • Abogado del TDDSaturday, June 16, 12
  • 10. Unit Testing The goal of unit testing is to isolate each part of the program and show that the individual parts are correct. http://en.wikipedia.org/wiki/Unit_testingSaturday, June 16, 12
  • 11. Unit Tests Por definición, sólo prueban las unidades por sí solas. Por lo tanto, no descubrirán errores de integración, problemas de rendimiento y otros problemas que afectan a todo el sistema en su conjunto. http://es.wikipedia.org/wiki/Prueba_unitariaSaturday, June 16, 12
  • 12. Dogma vs. RealidadSaturday, June 16, 12
  • 13. Trade OffsSaturday, June 16, 12
  • 14. ¿Qué testear?Saturday, June 16, 12
  • 15. ¿Cuánto testear?Saturday, June 16, 12
  • 16. "I get paid for code that works, not for tests, so my philosophy is to test as little as possible to reach a given level of confidence" – Kent Beck http://stackoverflow.com/questions/153234/how-deep-are-your-unit-tests/153565#153565Saturday, June 16, 12
  • 17. El Secreto del TDDSaturday, June 16, 12
  • 18. El Secreto del TDDSaturday, June 16, 12
  • 19. El Secreto del TDDSaturday, June 16, 12
  • 20. Algunos Libros de Kent BeckSaturday, June 16, 12
  • 21. Para escribir buenos Tests primero hay que saber programarSaturday, June 16, 12
  • 22. Saturday, June 16, 12
  • 23. Los Programadores somos como los usuarios de los que tanto nos quejamosSaturday, June 16, 12
  • 24. El diseño se madura y macera con el tiempoSaturday, June 16, 12
  • 25. TIPSSaturday, June 16, 12
  • 26. Separar el código puro del impuro o statefulSaturday, June 16, 12
  • 27. Funciones PurasSaturday, June 16, 12
  • 28. Funciones Puras • Devuelven datos en bases a los parámetros que aceptanSaturday, June 16, 12
  • 29. Funciones Puras • Devuelven datos en bases a los parámetros que aceptan • No modifican estado externoSaturday, June 16, 12
  • 30. Funciones Puras • Devuelven datos en bases a los parámetros que aceptan • No modifican estado externo • No producen efectos secundariosSaturday, June 16, 12
  • 31. ¿Qué tiene de malo este código? if($player->getScore() > 0) { $player->setSwizzle(7); } else { $player->setSwizzle( $player->getSwizzle() + 1 ); } http://dl.dropbox.com/u/7810909/docs/what-does-fp-mean/what-does-fp-mean/chunk-html/ar01s05.htmlSaturday, June 16, 12
  • 32. Version que no mezcla modificaciones de estado $newScore = $player->getScore() > 0 ? 7 : $player->getSwizzle() + 1; $player->setSwizzle($newScore); http://dl.dropbox.com/u/7810909/docs/what-does-fp-mean/what-does-fp-mean/chunk-html/ar01s05.htmlSaturday, June 16, 12
  • 33. El cálculo del Score se puede extraer a una funciónSaturday, June 16, 12
  • 34. El cálculo del Score se puede testearSaturday, June 16, 12
  • 35. Primero Escribir Código PuroSaturday, June 16, 12
  • 36. Agregar paso a paso el codigo impuro necesarioSaturday, June 16, 12
  • 37. Código Fácil de ComponerSaturday, June 16, 12
  • 38. Function Composition http://en.wikipedia.org/wiki/Function_(mathematics)Saturday, June 16, 12
  • 39. Function Composition http://en.wikipedia.org/wiki/Function_(mathematics)Saturday, June 16, 12
  • 40. Esto suena familiarSaturday, June 16, 12
  • 41. “Many UNIX programs do quite trivial tasks in isolation, but, combined with other programs, become general and useful tools.” http://math.albany.edu/math/pers/hammond/unixphil.htmlSaturday, June 16, 12
  • 42. Number of open connections per IP netstat -ntu | awk {print $5} | cut -d: -f1 | sort | uniq -c | sort -n http://www.commandlinefu.com/commands/view/1767/number-of-open-connections-per-ip.Saturday, June 16, 12
  • 43. ¿Por qué no programar código de esa forma?Saturday, June 16, 12
  • 44. Esto suena familiarSaturday, June 16, 12
  • 45. ¡Bienvenido a la Programación Funcional!Saturday, June 16, 12
  • 46. “Writing unit tests is reinventing functional programming in non-functional languages” http://noss.github.com/2009/02/25/writing-unit-tests-is-reinventing-functional-programming-in-non-functional-languages.htmlSaturday, June 16, 12
  • 47. ¿Qué nos enseña la programación funcional?Saturday, June 16, 12
  • 48. Uso Correcto de TypesSaturday, June 16, 12
  • 49. ¿Qué significa ‘null’?Saturday, June 16, 12
  • 50. ¿Qué significa ‘false|true’?Saturday, June 16, 12
  • 51. Código semánticamente correctoSaturday, June 16, 12
  • 52. Vamos a hacer la comidaSaturday, June 16, 12
  • 53. Vamos a cocinar la comidaSaturday, June 16, 12
  • 54. Funciones que cumplen sólo una funciónSaturday, June 16, 12
  • 55. Separación radical de código puro del impuroSaturday, June 16, 12
  • 56. Veamos un Ejemplo http://pastie.org/4097327Saturday, June 16, 12
  • 57. Testeando AMQP https://github.com/videlalvaro/php-amqplib/Saturday, June 16, 12
  • 58. Testeando queue_declare public  function  queue_declare($queue="",  $passive=false,  $durable=false,        $exclusive=false,  $auto_delete=true,  $nowait=false,    $arguments=NULL,  $ticket=NULL) {    if($arguments  ==  NULL)        $arguments  =  array();      $args  =  new  AMQPWriter();      if($ticket  !=  NULL)          $args-­‐>write_short($ticket);      else          $args-­‐>write_short($this-­‐>default_ticket);      $args-­‐>write_shortstr($queue);      $args-­‐>write_bit($passive);      $args-­‐>write_bit($durable);      $args-­‐>write_bit($exclusive);      $args-­‐>write_bit($auto_delete);      $args-­‐>write_bit($nowait);      $args-­‐>write_table($arguments);      $this-­‐>send_method_frame(array(50,  10),  $args);      if(!$nowait)          return  $this-­‐>wait(array("50,11"));        //  Channel.queue_declare_ok }Saturday, June 16, 12
  • 59. Testeando queue_declare class  AMQPChannel  extends  AbstractChannel {    public  function  __construct($connection,  $channel_id=null,  $auto_decode=true)    {        $this-­‐>frameBuilder  =  new  FrameBuilder();        if  ($channel_id  ==  null)  {            $channel_id  =  $connection-­‐>get_free_channel_id();        }        parent::__construct($connection,  $channel_id);        if  ($this-­‐>debug)  {            MiscHelper::debug_msg("using  channel_id:  "  .  $channel_id);        }        $this-­‐>default_ticket  =  0;        $this-­‐>is_open  =  false;        $this-­‐>active  =  true;  //  Flow  control        $this-­‐>alerts  =  array();        $this-­‐>callbacks  =  array();        $this-­‐>auto_decode  =  $auto_decode;        $this-­‐>x_open();    }    /*  ...  más  métodos  y  propiedades  omitidos  */ }Saturday, June 16, 12
  • 60. Testeando queue_declare public  function  queueDeclare($queue,  $passive,  $durable,  $exclusive,   $auto_delete,  $nowait,  $arguments,  $ticket) {    $args  =  new  AMQPWriter();    $args-­‐>write_short($ticket)              -­‐>write_shortstr($queue)              -­‐>write_bit($passive)              -­‐>write_bit($durable)              -­‐>write_bit($exclusive)              -­‐>write_bit($auto_delete)              -­‐>write_bit($nowait)              -­‐>write_table($arguments);    return  $args; }Saturday, June 16, 12
  • 61. Testeando queue_declare public  function  queue_declare($queue="",  $passive=false,  $durable=false,                                                                  $exclusive=false,  $auto_delete=true,  $nowait=false,                                                              $arguments=NULL,  $ticket=NULL) {    $arguments  =  $this-­‐>getArguments($arguments);    $ticket  =  $this-­‐>getTicket($ticket);    $args  =  $this-­‐>frameBuilder-­‐>queueDeclare(                                              $queue,  $passive,  $durable,  $exclusive,  $auto_delete,  $nowait,  $arguments,  $ticket);        $this-­‐>send_method_frame(array(50,  10),  $args);    if  (!$nowait)  {        return  $this-­‐>wait(array("50,11"));        //  Channel.queue_declare_ok                                } }Saturday, June 16, 12
  • 62. Testeando queue_declare public  function  testQueueDeclare() {    $expected  =  "x00x00x03foox00x00x00x00x00";    $args  =  $this-­‐>frameBuilder                              -­‐>queueDeclare(      foo,  false,  false,  false,  false,  false,  array(),  0 );    $this-­‐>assertEquals($expected,  $args-­‐>getvalue()); }Saturday, June 16, 12
  • 63. ¿Cómo aplico esto al mundo real?Saturday, June 16, 12
  • 64. ¿Cómo aplico esto al mundo real? • Ver la charla de Ricard “Servicios en Symfony2”Saturday, June 16, 12
  • 65. ¿Cómo aplico esto al mundo real? • Ver la charla de Ricard “Servicios en Symfony2” • Muchos servicios especializados y desacopladosSaturday, June 16, 12
  • 66. ¿Cómo aplico esto al mundo real? • Ver la charla de Ricard “Servicios en Symfony2” • Muchos servicios especializados y desacoplados • Clases que cumplen sólo una funciónSaturday, June 16, 12
  • 67. “Inside every well- written large program is a well-written small program” http://www.linfo.org/q_programming.htmlSaturday, June 16, 12
  • 68. ¿Preguntas?Saturday, June 16, 12
  • 69. ¡Gracias! Álvaro Videla http://twitter.com/old_sound http://github.com/videlalvaro http://www.slideshare.net/old_soundSaturday, June 16, 12