SlideShare una empresa de Scribd logo
Artesanía de Software y
Desarrollo Dirigido por Pruebas
¿QUÉ ES LA ARTESANÍA DE
      SOFTWARE
Manifiesto por la Artesanía de Software
   Como aspirantes a artesanos de software, estamos elevando el nivel
    de desarrollo de software profesional practicándolo y ayudando a
   otros a aprenderlo. A través de este trabajo hemos llegado a valorar:

• No sólo software que funciona,      • sino también el software bien
                                        diseñado
• No sólo responder al cambio,        • pero también agregar valor de
                                        forma sostenida
• No sólo los individuos y las        • sino también una comunidad de
  interacciones,                        profesionales
• No sólo la colaboración con los     • sino también de asociaciones
  clientes,                             productivas
     Es decir, en la búsqueda de los elementos de la izquierda hemos
     encontrado que los elementos de la derecha son indispensables.
¿Qué es la Artesanía de Software?
• Es acerca de crear conciencia de lo que está mal con
  el actual estado de la práctica.
• Es acerca de hacer el mejor trabajo posible.
• Comprometerse con nuestra profesión.
• Sentir orgullo del trabajo bien hecho.
• Mejorar continuamente nuestras habilidades.
• Satisfacer a nuestros usuarios con software de
  calidad.
Lo que la Artesanía de Software NO es
           Ingeniería de Software:

       “La promesa implícita de la ingeniería
           de software es que si tienes un
                proceso sistemático y
           cuantificado, cualquiera puede
         desarrollar software exitosamente.”

                              -Pete McBreen
Lo que la Artesanía de Software NO ES

• No es solo acerca de “Código Bonito”.
• Darle la espalda a los aspectos de negocio y
  concentrarse SOLO en el lado técnico.
• Buscar salidas fáciles, “aceite de víbora” o
  “balas de plata”.
• Crear certificaciones artificiales y un modelo
  de negocio a su alrededor.
DESARROLLO DIRIGIDO POR
     PRUEBAS (TDD)
Qué es TDD


“Test-first coding is not a testing
            technique”


                      Ward Cunningham
¿Qué es TDD? (cont.)
• Es tomar la responsabilidad de la calidad de
  nuestro código.
• Es entender el código que escribimos en todo
  momento, no solo “suponer” que
  entendemos.
• Es una habilidad y como tal, requiere práctica
  para dominarse.
• Es una disciplina.
El valor de TDD
Tres Reglas
(según Robert C. Martin)
             • No se permite escribir
               ningún código de
               producción sin tener una
               prueba que falle.
             • No se permite escribir más
               de la prueba que lo
               necesario para fallar (y no
               compilar es fallar).
             • No está permitido escribir
               más código de producción
               que el necesario para pasar
               la prueba unitaria ACTUAL.
Paso a paso…
from unittest import main, TestCase

class TestPrimeFactors(TestCase):
  def testPrimesOf0(self):
    self.assertEquals([], factorsOf[0])

if __name__ == '__main__':
    main()
E
======================================================================
ERROR: testPrimesOf0 (__main__.TestPrimeFactors)
----------------------------------------------------------------------
NameError: global name 'factorsOf' is not defined
----------------------------------------------------------------------
Ran 1 test in 0.001s

FAILED (errors=1)
Paso a paso…

...

def factorsOf(n):
  return []

...



.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK
Paso a paso…
...

def testPrimesOf0to1(self):
  self.assertEquals([], factorsOf(0))
  self.assertEquals([], factorsOf(1))

...


.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK
Paso a paso…

...

def testPrimesOf2(self):
  self.assertEquals([2], factorsOf(2))

...

.F
======================================================================
FAIL: testPrimesOf2 (__main__.TestPrimeFactors)
----------------------------------------------------------------------
AssertionError: Lists differ: [2] != []
----------------------------------------------------------------------
Ran 2 tests in 0.029s

FAILED (failures=1)
Paso a paso…
...

def factorsOf(n):
     if n > 1:
       return [n]
  return []
...


..
----------------------------------------------------------------------
Ran 2 test in 0.000s

OK
Paso a paso…

...

def testPrimesOf2to3(self):
  self.assertEquals([2], factorsOf(2))
  self.assertEquals([3], factorsOf(3))
...



..
----------------------------------------------------------------------
Ran 2 test in 0.000s

OK
Paso a paso…
...

def testPrimesOf2to4(self):
  self.assertEquals([2], factorsOf(2))
  self.assertEquals([3], factorsOf(3))
  self.assertEquals([2,2], factorsOf(4))
...

.F
======================================================================
FAIL: testPrimesOf2to4 (__main__.TestPrimeFactors)
----------------------------------------------------------------------
AssertionError: Lists differ: [2, 2] != [4]
----------------------------------------------------------------------
Ran 2 tests in 0.001s

FAILED (failures=1)
Paso a paso…
...
def factorsOf(n):
    result, factor = [], 2
      if n > 1:
      while n > 1:
          return [n]
          while n % factor == 0:
              result.append(factor)
              n /= factor
          factor += 1
      return []
      return result
...
..
----------------------------------------------------------------------
Ran 2 test in 0.000s

OK
Aprendiendo TDD: Trampas
• Las pruebas se tornan difíciles de escribir, por lo
  que sentimos una desaceleración importante.
• Corren lentamente, lo que nos volvemos
  renuentes a ejecutarlas frecuentemente.
• Son frágiles, por lo que cambios aparentemente
  sin importancia en el código provocan que un
  montón de pruebas fallen.
• Mantenerlas en forma y funcionando se vuelve
  complejo y consume tiempo.
Escribiendo pruebas unitarias efectivas


       “Las pruebas unitarias deben ser
  legibles, confiables y fáciles de mantener”

                                 -Roy Osherove
                       “The Art of Unit Testing”
Escribiendo pruebas unitarias efectivas:
                 Legibilidad
• Mis pruebas son tan importantes como el
  código de producción.
• Aspirar a que mis pruebas se lean como una
  “receta de cocina” (patrón composed
  method).
• Si no es posible determinar lo que una prueba
  está haciendo, es probable que en realidad
  esté verificando múltiples cosas.
Escribiendo pruebas unitarias efectivas:
                Confiabilidad

• Evita a toda cosa colocar lógica en el código de
  una prueba (if-then, switch/case, etc).
• Evita calcular el valor esperado DENTRO de la
  prueba.
• Evita compartir estado entre pruebas.
• Usa inyección de dependencias.
Escribiendo pruebas unitarias efectivas:
               Mantenibilidad
• Mantén simple el código de inicialización.
• Crea fixtures o incluso casos de prueba
  especializados para cada escenario.
• Si es necesario, convierte cada escenario en
  una clase de prueba individual.
• Si una parte del código es particularmente
  difícil de probar, busca problemas en el diseño
  del mismo.
Escribiendo pruebas unitarias efectivas:
                   Rapidez

• Una prueba unitaria efectiva debería
  ejecutarse en milisegundos, NO EN
  SEGUNDOS.
• Si las pruebas no son rápidas, NO SE USARÁN.
• Mantén conjuntos pequeños y bien enfocados
  de pruebas, además de la suite global.
Aprendiendo TDD (revisado)
• Comienza con algo sencillo (¡pero no te detengas
  ahí!)

• Escribe muchas pruebas (tantas como puedas).

• Familiarízate con el ritmo y las reglas de TDD.

• Cuando encuentres algo que no sabes como
  probar, apóyate en un compañero.

• Nunca dejes de aprender.
Bibliografía
• “The Clean Coder” de Robert C. Martin.
• “Test Driven Development: By Example” de Kent Beck.
• “The Art of Unit Testing” de Roy Osherove.
• “Growing Object-Oriented Software, Guided by Tests” de
  Steve Freeman y Nat Pryce.
• “Agile Java: Crafting Code with Test-Driven Development”
  de Jeff Langr.
• “Diseño Ágil con TDD” de Carlos Ble Jurado -> !Es gratis!
  http://www.dirigidoportests.com/el-libro
• Twitter: @alfredochv
• Blog: http://pensamientoobjetivo.blogspot.mx

Más contenido relacionado

La actualidad más candente

[ES] webcat 2014-03 Demystifying Development Techniques
[ES] webcat 2014-03 Demystifying Development Techniques[ES] webcat 2014-03 Demystifying Development Techniques
[ES] webcat 2014-03 Demystifying Development Techniques
Eduardo Turiño
 
Automatizacion de Pruebas
Automatizacion de PruebasAutomatizacion de Pruebas
Automatizacion de Pruebas
Guino Henostroza
 
Conceptos de desarrollo ágil
Conceptos de desarrollo ágilConceptos de desarrollo ágil
Conceptos de desarrollo ágil
Guino Henostroza
 
Dev ops e infraestructura – acompañando nuestro software a producción
Dev ops e infraestructura – acompañando nuestro software a producciónDev ops e infraestructura – acompañando nuestro software a producción
Dev ops e infraestructura – acompañando nuestro software a producciónKleer Agile Coaching & Training
 
Workshop: Testeando nuestra aplicaciones.
Workshop: Testeando nuestra aplicaciones.Workshop: Testeando nuestra aplicaciones.
Workshop: Testeando nuestra aplicaciones.
José María Pérez Ramos
 
Charla evento TestingUY 2016 - Test Driven Development en la Plataforma Sales...
Charla evento TestingUY 2016 - Test Driven Development en la Plataforma Sales...Charla evento TestingUY 2016 - Test Driven Development en la Plataforma Sales...
Charla evento TestingUY 2016 - Test Driven Development en la Plataforma Sales...
TestingUy
 
Evento CDA Abstracta - Perú 2015 - Testing de performance y testing automátic...
Evento CDA Abstracta - Perú 2015 - Testing de performance y testing automátic...Evento CDA Abstracta - Perú 2015 - Testing de performance y testing automátic...
Evento CDA Abstracta - Perú 2015 - Testing de performance y testing automátic...
Federico Toledo
 
Java 8, tópicos de estudio para el examen upgrade
Java 8, tópicos de estudio para el examen upgradeJava 8, tópicos de estudio para el examen upgrade
Java 8, tópicos de estudio para el examen upgrade
Software Guru
 
Análisis estático de código en Java
Análisis estático de código en JavaAnálisis estático de código en Java
Análisis estático de código en Java
César Hernández
 
GCV Agile testing y videojuegos (Francisco Moreno) - Gestión de la Calidad en...
GCV Agile testing y videojuegos (Francisco Moreno) - Gestión de la Calidad en...GCV Agile testing y videojuegos (Francisco Moreno) - Gestión de la Calidad en...
GCV Agile testing y videojuegos (Francisco Moreno) - Gestión de la Calidad en...
Federico Peinado
 
BDD y tests automatizados
BDD y tests automatizadosBDD y tests automatizados
BDD y tests automatizados
Sofia Swidarowicz
 
El coste de no usar integración continua
El coste de no usar integración continuaEl coste de no usar integración continua
El coste de no usar integración continua
Cristian Romero Matesanz
 
Td dvs bdd
Td dvs bddTd dvs bdd
Td dvs bddlsajrf
 
Abstracta-CDA - TESTING: Automatización y Performance - Herramientas para opt...
Abstracta-CDA - TESTING: Automatización y Performance - Herramientas para opt...Abstracta-CDA - TESTING: Automatización y Performance - Herramientas para opt...
Abstracta-CDA - TESTING: Automatización y Performance - Herramientas para opt...Abstracta
 
BDD & Cucumber
BDD & CucumberBDD & Cucumber
BDD & Cucumber
Enrique Sánchez-Bayuela
 
Codigo Escalable WDT
Codigo Escalable WDTCodigo Escalable WDT
Codigo Escalable WDT
Edwin Cruz
 
Buenas practicas desarrollando software
Buenas practicas desarrollando softwareBuenas practicas desarrollando software
Buenas practicas desarrollando software
Gabriel Moral
 
Continuous testing
Continuous testingContinuous testing
Continuous testingVemn1
 

La actualidad más candente (18)

[ES] webcat 2014-03 Demystifying Development Techniques
[ES] webcat 2014-03 Demystifying Development Techniques[ES] webcat 2014-03 Demystifying Development Techniques
[ES] webcat 2014-03 Demystifying Development Techniques
 
Automatizacion de Pruebas
Automatizacion de PruebasAutomatizacion de Pruebas
Automatizacion de Pruebas
 
Conceptos de desarrollo ágil
Conceptos de desarrollo ágilConceptos de desarrollo ágil
Conceptos de desarrollo ágil
 
Dev ops e infraestructura – acompañando nuestro software a producción
Dev ops e infraestructura – acompañando nuestro software a producciónDev ops e infraestructura – acompañando nuestro software a producción
Dev ops e infraestructura – acompañando nuestro software a producción
 
Workshop: Testeando nuestra aplicaciones.
Workshop: Testeando nuestra aplicaciones.Workshop: Testeando nuestra aplicaciones.
Workshop: Testeando nuestra aplicaciones.
 
Charla evento TestingUY 2016 - Test Driven Development en la Plataforma Sales...
Charla evento TestingUY 2016 - Test Driven Development en la Plataforma Sales...Charla evento TestingUY 2016 - Test Driven Development en la Plataforma Sales...
Charla evento TestingUY 2016 - Test Driven Development en la Plataforma Sales...
 
Evento CDA Abstracta - Perú 2015 - Testing de performance y testing automátic...
Evento CDA Abstracta - Perú 2015 - Testing de performance y testing automátic...Evento CDA Abstracta - Perú 2015 - Testing de performance y testing automátic...
Evento CDA Abstracta - Perú 2015 - Testing de performance y testing automátic...
 
Java 8, tópicos de estudio para el examen upgrade
Java 8, tópicos de estudio para el examen upgradeJava 8, tópicos de estudio para el examen upgrade
Java 8, tópicos de estudio para el examen upgrade
 
Análisis estático de código en Java
Análisis estático de código en JavaAnálisis estático de código en Java
Análisis estático de código en Java
 
GCV Agile testing y videojuegos (Francisco Moreno) - Gestión de la Calidad en...
GCV Agile testing y videojuegos (Francisco Moreno) - Gestión de la Calidad en...GCV Agile testing y videojuegos (Francisco Moreno) - Gestión de la Calidad en...
GCV Agile testing y videojuegos (Francisco Moreno) - Gestión de la Calidad en...
 
BDD y tests automatizados
BDD y tests automatizadosBDD y tests automatizados
BDD y tests automatizados
 
El coste de no usar integración continua
El coste de no usar integración continuaEl coste de no usar integración continua
El coste de no usar integración continua
 
Td dvs bdd
Td dvs bddTd dvs bdd
Td dvs bdd
 
Abstracta-CDA - TESTING: Automatización y Performance - Herramientas para opt...
Abstracta-CDA - TESTING: Automatización y Performance - Herramientas para opt...Abstracta-CDA - TESTING: Automatización y Performance - Herramientas para opt...
Abstracta-CDA - TESTING: Automatización y Performance - Herramientas para opt...
 
BDD & Cucumber
BDD & CucumberBDD & Cucumber
BDD & Cucumber
 
Codigo Escalable WDT
Codigo Escalable WDTCodigo Escalable WDT
Codigo Escalable WDT
 
Buenas practicas desarrollando software
Buenas practicas desarrollando softwareBuenas practicas desarrollando software
Buenas practicas desarrollando software
 
Continuous testing
Continuous testingContinuous testing
Continuous testing
 

Similar a Artesania de Software y TDD

Desarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agilesDesarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agiles
Jobsket
 
Desarrollo de Software Guiado por Pruebas
Desarrollo de Software Guiado por PruebasDesarrollo de Software Guiado por Pruebas
Desarrollo de Software Guiado por Pruebas
.. ..
 
Dev ops e infraestructura – acompañando nuestro software a producción
Dev ops e infraestructura – acompañando nuestro software a producciónDev ops e infraestructura – acompañando nuestro software a producción
Dev ops e infraestructura – acompañando nuestro software a producción
Kleer Agile Coaching & Training
 
DeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - SpanishDeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - SpanishJordi Llonch
 
DeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - SpanishDeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - SpanishAkamon Engineering
 
DeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - SpanishDeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - SpanishJordi Llonch
 
Artalde Tdd intro
Artalde Tdd introArtalde Tdd intro
Artalde Tdd intro
fperezplain
 
Módulo 4. Desarrollador ágil
Módulo 4. Desarrollador ágilMódulo 4. Desarrollador ágil
Módulo 4. Desarrollador ágil
Johnny Ordóñez
 
Practicas tecnicas
Practicas tecnicasPracticas tecnicas
Practicas técnicas
Practicas técnicasPracticas técnicas
Practicas técnicas
Joan Sebastián Ramírez Pérez
 
Optimizacion de software
Optimizacion de softwareOptimizacion de software
Optimizacion de software
Oskar Barrio Ferreiro
 
Conceptos básicos de Unit Test
Conceptos básicos de Unit Test Conceptos básicos de Unit Test
Conceptos básicos de Unit Test
Juan Vladimir
 
S9-DAW-2022S1.pptx
S9-DAW-2022S1.pptxS9-DAW-2022S1.pptx
S9-DAW-2022S1.pptx
Luis Fernando Aguas Bucheli
 
Introducción a TDD
Introducción a TDDIntroducción a TDD
Introducción a TDD
Adrian Marino
 
INDUCCION A QA TESTER.pptx
INDUCCION A QA TESTER.pptxINDUCCION A QA TESTER.pptx
INDUCCION A QA TESTER.pptx
OdalisLinares
 
Proceso Del Software
Proceso Del SoftwareProceso Del Software
Proceso Del Software
leo_ruth
 
Tdd
TddTdd
Clean code 9
Clean code 9Clean code 9
Clean code 9
540deg
 
Calidad de software y TDD
Calidad de software y TDDCalidad de software y TDD
Calidad de software y TDD
Jose Luis Bugarin Peche
 

Similar a Artesania de Software y TDD (20)

Desarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agilesDesarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agiles
 
Desarrollo de Software Guiado por Pruebas
Desarrollo de Software Guiado por PruebasDesarrollo de Software Guiado por Pruebas
Desarrollo de Software Guiado por Pruebas
 
Dev ops e infraestructura – acompañando nuestro software a producción
Dev ops e infraestructura – acompañando nuestro software a producciónDev ops e infraestructura – acompañando nuestro software a producción
Dev ops e infraestructura – acompañando nuestro software a producción
 
DeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - SpanishDeSymfonyDay 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
DeSymfonyDay 2014 - To mock or not to mock - SpanishDeSymfonyDay 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
DeSymfonyDay 2014 - To mock or not to mock - SpanishDeSymfonyDay 2014 - To mock or not to mock - Spanish
DeSymfonyDay 2014 - To mock or not to mock - Spanish
 
Artalde Tdd intro
Artalde Tdd introArtalde Tdd intro
Artalde Tdd intro
 
Módulo 4. Desarrollador ágil
Módulo 4. Desarrollador ágilMódulo 4. Desarrollador ágil
Módulo 4. Desarrollador ágil
 
Practicas tecnicas
Practicas tecnicasPracticas tecnicas
Practicas tecnicas
 
Practicas técnicas
Practicas técnicasPracticas técnicas
Practicas técnicas
 
Optimizacion de software
Optimizacion de softwareOptimizacion de software
Optimizacion de software
 
Conceptos básicos de Unit Test
Conceptos básicos de Unit Test Conceptos básicos de Unit Test
Conceptos básicos de Unit Test
 
S9-DAW-2022S1.pptx
S9-DAW-2022S1.pptxS9-DAW-2022S1.pptx
S9-DAW-2022S1.pptx
 
Introducción a TDD
Introducción a TDDIntroducción a TDD
Introducción a TDD
 
INDUCCION A QA TESTER.pptx
INDUCCION A QA TESTER.pptxINDUCCION A QA TESTER.pptx
INDUCCION A QA TESTER.pptx
 
Proceso Del Software
Proceso Del SoftwareProceso Del Software
Proceso Del Software
 
Proceso Del Software
Proceso Del SoftwareProceso Del Software
Proceso Del Software
 
Tdd
TddTdd
Tdd
 
Clean code 9
Clean code 9Clean code 9
Clean code 9
 
Calidad de software y TDD
Calidad de software y TDDCalidad de software y TDD
Calidad de software y TDD
 

Último

leidy fuentes - power point -expocccion -unidad 4 (1).pptx
leidy fuentes - power point -expocccion -unidad 4 (1).pptxleidy fuentes - power point -expocccion -unidad 4 (1).pptx
leidy fuentes - power point -expocccion -unidad 4 (1).pptx
Leidyfuentes19
 
Alan Turing Vida o biografía resumida como presentación
Alan Turing Vida o biografía resumida como presentaciónAlan Turing Vida o biografía resumida como presentación
Alan Turing Vida o biografía resumida como presentación
JuanPrez962115
 
Estructuras básicas_ conceptos básicos de programación.pdf
Estructuras básicas_  conceptos básicos de programación.pdfEstructuras básicas_  conceptos básicos de programación.pdf
Estructuras básicas_ conceptos básicos de programación.pdf
ItsSofi
 
trabajo de tecnologia, segundo periodo 9-6f
trabajo de tecnologia, segundo periodo 9-6ftrabajo de tecnologia, segundo periodo 9-6f
trabajo de tecnologia, segundo periodo 9-6f
zoecaicedosalazar
 
Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5
JulyMuoz18
 
Inteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdfInteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdf
Emilio Casbas
 
Desarrollo de Habilidades de Pensamiento.
Desarrollo de Habilidades de Pensamiento.Desarrollo de Habilidades de Pensamiento.
Desarrollo de Habilidades de Pensamiento.
AlejandraCasallas7
 
Diagrama de flujo soporte técnico 5to semestre
Diagrama de flujo soporte técnico 5to semestreDiagrama de flujo soporte técnico 5to semestre
Diagrama de flujo soporte técnico 5to semestre
rafaelsalazar0615
 
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdfDESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
marianabz2403
 
Conceptos Básicos de Programación. Tecnología
Conceptos Básicos de Programación. TecnologíaConceptos Básicos de Programación. Tecnología
Conceptos Básicos de Programación. Tecnología
coloradxmaria
 
Robótica educativa para la eduacion primaria .pptx
Robótica educativa para la eduacion primaria .pptxRobótica educativa para la eduacion primaria .pptx
Robótica educativa para la eduacion primaria .pptx
44652726
 
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdfTrabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
jjfch3110
 
EduFlex, una educación accesible para quienes no entienden en clases
EduFlex, una educación accesible para quienes no entienden en clasesEduFlex, una educación accesible para quienes no entienden en clases
EduFlex, una educación accesible para quienes no entienden en clases
PABLOCESARGARZONBENI
 
3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto
cdraco
 
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTALINFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
CrystalRomero18
 
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Telefónica
 
Conceptos Básicos de Programación Proyecto
Conceptos Básicos de Programación ProyectoConceptos Básicos de Programación Proyecto
Conceptos Básicos de Programación Proyecto
cofferub
 
Desarrollo de Habilidades de Pensamiento.docx (3).pdf
Desarrollo de Habilidades de Pensamiento.docx (3).pdfDesarrollo de Habilidades de Pensamiento.docx (3).pdf
Desarrollo de Habilidades de Pensamiento.docx (3).pdf
AlejandraCasallas7
 
Diagrama de flujo - ingenieria de sistemas 5to semestre
Diagrama de flujo - ingenieria de sistemas 5to semestreDiagrama de flujo - ingenieria de sistemas 5to semestre
Diagrama de flujo - ingenieria de sistemas 5to semestre
DiegoCampos433849
 
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdfTrabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
cj3806354
 

Último (20)

leidy fuentes - power point -expocccion -unidad 4 (1).pptx
leidy fuentes - power point -expocccion -unidad 4 (1).pptxleidy fuentes - power point -expocccion -unidad 4 (1).pptx
leidy fuentes - power point -expocccion -unidad 4 (1).pptx
 
Alan Turing Vida o biografía resumida como presentación
Alan Turing Vida o biografía resumida como presentaciónAlan Turing Vida o biografía resumida como presentación
Alan Turing Vida o biografía resumida como presentación
 
Estructuras básicas_ conceptos básicos de programación.pdf
Estructuras básicas_  conceptos básicos de programación.pdfEstructuras básicas_  conceptos básicos de programación.pdf
Estructuras básicas_ conceptos básicos de programación.pdf
 
trabajo de tecnologia, segundo periodo 9-6f
trabajo de tecnologia, segundo periodo 9-6ftrabajo de tecnologia, segundo periodo 9-6f
trabajo de tecnologia, segundo periodo 9-6f
 
Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5
 
Inteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdfInteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdf
 
Desarrollo de Habilidades de Pensamiento.
Desarrollo de Habilidades de Pensamiento.Desarrollo de Habilidades de Pensamiento.
Desarrollo de Habilidades de Pensamiento.
 
Diagrama de flujo soporte técnico 5to semestre
Diagrama de flujo soporte técnico 5to semestreDiagrama de flujo soporte técnico 5to semestre
Diagrama de flujo soporte técnico 5to semestre
 
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdfDESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
 
Conceptos Básicos de Programación. Tecnología
Conceptos Básicos de Programación. TecnologíaConceptos Básicos de Programación. Tecnología
Conceptos Básicos de Programación. Tecnología
 
Robótica educativa para la eduacion primaria .pptx
Robótica educativa para la eduacion primaria .pptxRobótica educativa para la eduacion primaria .pptx
Robótica educativa para la eduacion primaria .pptx
 
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdfTrabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
 
EduFlex, una educación accesible para quienes no entienden en clases
EduFlex, una educación accesible para quienes no entienden en clasesEduFlex, una educación accesible para quienes no entienden en clases
EduFlex, una educación accesible para quienes no entienden en clases
 
3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto
 
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTALINFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
 
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
 
Conceptos Básicos de Programación Proyecto
Conceptos Básicos de Programación ProyectoConceptos Básicos de Programación Proyecto
Conceptos Básicos de Programación Proyecto
 
Desarrollo de Habilidades de Pensamiento.docx (3).pdf
Desarrollo de Habilidades de Pensamiento.docx (3).pdfDesarrollo de Habilidades de Pensamiento.docx (3).pdf
Desarrollo de Habilidades de Pensamiento.docx (3).pdf
 
Diagrama de flujo - ingenieria de sistemas 5to semestre
Diagrama de flujo - ingenieria de sistemas 5to semestreDiagrama de flujo - ingenieria de sistemas 5to semestre
Diagrama de flujo - ingenieria de sistemas 5to semestre
 
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdfTrabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
 

Artesania de Software y TDD

  • 1. Artesanía de Software y Desarrollo Dirigido por Pruebas
  • 2. ¿QUÉ ES LA ARTESANÍA DE SOFTWARE
  • 3. Manifiesto por la Artesanía de Software Como aspirantes a artesanos de software, estamos elevando el nivel de desarrollo de software profesional practicándolo y ayudando a otros a aprenderlo. A través de este trabajo hemos llegado a valorar: • No sólo software que funciona, • sino también el software bien diseñado • No sólo responder al cambio, • pero también agregar valor de forma sostenida • No sólo los individuos y las • sino también una comunidad de interacciones, profesionales • No sólo la colaboración con los • sino también de asociaciones clientes, productivas Es decir, en la búsqueda de los elementos de la izquierda hemos encontrado que los elementos de la derecha son indispensables.
  • 4. ¿Qué es la Artesanía de Software? • Es acerca de crear conciencia de lo que está mal con el actual estado de la práctica. • Es acerca de hacer el mejor trabajo posible. • Comprometerse con nuestra profesión. • Sentir orgullo del trabajo bien hecho. • Mejorar continuamente nuestras habilidades. • Satisfacer a nuestros usuarios con software de calidad.
  • 5. Lo que la Artesanía de Software NO es Ingeniería de Software: “La promesa implícita de la ingeniería de software es que si tienes un proceso sistemático y cuantificado, cualquiera puede desarrollar software exitosamente.” -Pete McBreen
  • 6. Lo que la Artesanía de Software NO ES • No es solo acerca de “Código Bonito”. • Darle la espalda a los aspectos de negocio y concentrarse SOLO en el lado técnico. • Buscar salidas fáciles, “aceite de víbora” o “balas de plata”. • Crear certificaciones artificiales y un modelo de negocio a su alrededor.
  • 7. DESARROLLO DIRIGIDO POR PRUEBAS (TDD)
  • 8. Qué es TDD “Test-first coding is not a testing technique” Ward Cunningham
  • 9. ¿Qué es TDD? (cont.) • Es tomar la responsabilidad de la calidad de nuestro código. • Es entender el código que escribimos en todo momento, no solo “suponer” que entendemos. • Es una habilidad y como tal, requiere práctica para dominarse. • Es una disciplina.
  • 10. El valor de TDD
  • 11. Tres Reglas (según Robert C. Martin) • No se permite escribir ningún código de producción sin tener una prueba que falle. • No se permite escribir más de la prueba que lo necesario para fallar (y no compilar es fallar). • No está permitido escribir más código de producción que el necesario para pasar la prueba unitaria ACTUAL.
  • 12. Paso a paso… from unittest import main, TestCase class TestPrimeFactors(TestCase): def testPrimesOf0(self): self.assertEquals([], factorsOf[0]) if __name__ == '__main__': main() E ====================================================================== ERROR: testPrimesOf0 (__main__.TestPrimeFactors) ---------------------------------------------------------------------- NameError: global name 'factorsOf' is not defined ---------------------------------------------------------------------- Ran 1 test in 0.001s FAILED (errors=1)
  • 13. Paso a paso… ... def factorsOf(n): return [] ... . ---------------------------------------------------------------------- Ran 1 test in 0.000s OK
  • 14. Paso a paso… ... def testPrimesOf0to1(self): self.assertEquals([], factorsOf(0)) self.assertEquals([], factorsOf(1)) ... . ---------------------------------------------------------------------- Ran 1 test in 0.000s OK
  • 15. Paso a paso… ... def testPrimesOf2(self): self.assertEquals([2], factorsOf(2)) ... .F ====================================================================== FAIL: testPrimesOf2 (__main__.TestPrimeFactors) ---------------------------------------------------------------------- AssertionError: Lists differ: [2] != [] ---------------------------------------------------------------------- Ran 2 tests in 0.029s FAILED (failures=1)
  • 16. Paso a paso… ... def factorsOf(n): if n > 1: return [n] return [] ... .. ---------------------------------------------------------------------- Ran 2 test in 0.000s OK
  • 17. Paso a paso… ... def testPrimesOf2to3(self): self.assertEquals([2], factorsOf(2)) self.assertEquals([3], factorsOf(3)) ... .. ---------------------------------------------------------------------- Ran 2 test in 0.000s OK
  • 18. Paso a paso… ... def testPrimesOf2to4(self): self.assertEquals([2], factorsOf(2)) self.assertEquals([3], factorsOf(3)) self.assertEquals([2,2], factorsOf(4)) ... .F ====================================================================== FAIL: testPrimesOf2to4 (__main__.TestPrimeFactors) ---------------------------------------------------------------------- AssertionError: Lists differ: [2, 2] != [4] ---------------------------------------------------------------------- Ran 2 tests in 0.001s FAILED (failures=1)
  • 19. Paso a paso… ... def factorsOf(n): result, factor = [], 2 if n > 1: while n > 1: return [n] while n % factor == 0: result.append(factor) n /= factor factor += 1 return [] return result ... .. ---------------------------------------------------------------------- Ran 2 test in 0.000s OK
  • 20. Aprendiendo TDD: Trampas • Las pruebas se tornan difíciles de escribir, por lo que sentimos una desaceleración importante. • Corren lentamente, lo que nos volvemos renuentes a ejecutarlas frecuentemente. • Son frágiles, por lo que cambios aparentemente sin importancia en el código provocan que un montón de pruebas fallen. • Mantenerlas en forma y funcionando se vuelve complejo y consume tiempo.
  • 21. Escribiendo pruebas unitarias efectivas “Las pruebas unitarias deben ser legibles, confiables y fáciles de mantener” -Roy Osherove “The Art of Unit Testing”
  • 22. Escribiendo pruebas unitarias efectivas: Legibilidad • Mis pruebas son tan importantes como el código de producción. • Aspirar a que mis pruebas se lean como una “receta de cocina” (patrón composed method). • Si no es posible determinar lo que una prueba está haciendo, es probable que en realidad esté verificando múltiples cosas.
  • 23. Escribiendo pruebas unitarias efectivas: Confiabilidad • Evita a toda cosa colocar lógica en el código de una prueba (if-then, switch/case, etc). • Evita calcular el valor esperado DENTRO de la prueba. • Evita compartir estado entre pruebas. • Usa inyección de dependencias.
  • 24. Escribiendo pruebas unitarias efectivas: Mantenibilidad • Mantén simple el código de inicialización. • Crea fixtures o incluso casos de prueba especializados para cada escenario. • Si es necesario, convierte cada escenario en una clase de prueba individual. • Si una parte del código es particularmente difícil de probar, busca problemas en el diseño del mismo.
  • 25. Escribiendo pruebas unitarias efectivas: Rapidez • Una prueba unitaria efectiva debería ejecutarse en milisegundos, NO EN SEGUNDOS. • Si las pruebas no son rápidas, NO SE USARÁN. • Mantén conjuntos pequeños y bien enfocados de pruebas, además de la suite global.
  • 26. Aprendiendo TDD (revisado) • Comienza con algo sencillo (¡pero no te detengas ahí!) • Escribe muchas pruebas (tantas como puedas). • Familiarízate con el ritmo y las reglas de TDD. • Cuando encuentres algo que no sabes como probar, apóyate en un compañero. • Nunca dejes de aprender.
  • 27. Bibliografía • “The Clean Coder” de Robert C. Martin. • “Test Driven Development: By Example” de Kent Beck. • “The Art of Unit Testing” de Roy Osherove. • “Growing Object-Oriented Software, Guided by Tests” de Steve Freeman y Nat Pryce. • “Agile Java: Crafting Code with Test-Driven Development” de Jeff Langr. • “Diseño Ágil con TDD” de Carlos Ble Jurado -> !Es gratis! http://www.dirigidoportests.com/el-libro
  • 28. • Twitter: @alfredochv • Blog: http://pensamientoobjetivo.blogspot.mx