SlideShare una empresa de Scribd logo
1 de 28
Descargar para leer sin conexión
Artesanía	
  de	
  So-ware	
  y	
  
Desarrollo	
  Dirigido	
  por	
  Pruebas	
  
¿QUÉ	
  ES	
  LA	
  ARTESANÍA	
  DE	
  
         SOFTWARE	
  
Manifiesto	
  por	
  la	
  Artesanía	
  de	
  So-ware	
  
     Como	
  aspirantes	
  a	
  artesanos	
  de	
  so-ware,	
  estamos	
  elevando	
  el	
  nivel	
  
      de	
  desarrollo	
  de	
  so-ware	
  profesional	
  pracBcándolo	
  y	
  ayudando	
  a	
  
     otros	
  a	
  aprenderlo.	
  A	
  través	
  de	
  este	
  trabajo	
  hemos	
  llegado	
  a	
  valorar:	
  

•  No	
  sólo	
  so-ware	
  que	
  funciona,	
  	
        •  sino	
  también	
  el	
  so-ware	
  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,	
                                               producBvas	
  
        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	
  So-ware?	
  
•  Es	
  acerca	
  de	
  crear	
  conciencia	
  de	
  lo	
  que	
  está	
  mal	
  con	
  
   el	
  actual	
  estado	
  de	
  la	
  prácBca.	
  
•  Es	
  acerca	
  de	
  hacer	
  el	
  mejor	
  trabajo	
  posible.	
  
•  Comprometerse	
  con	
  nuestra	
  profesión.	
  
•  SenBr	
  orgullo	
  del	
  trabajo	
  bien	
  hecho.	
  
•  Mejorar	
  conBnuamente	
  nuestras	
  habilidades.	
  
•  SaBsfacer	
  a	
  nuestros	
  usuarios	
  con	
  so-ware	
  de	
  
   calidad.	
  
Lo	
  que	
  la	
  Artesanía	
  de	
  So-ware	
  NO	
  es	
  
                        Ingeniería	
  de	
  So-ware:	
  
           	
  
                  “La	
  promesa	
  implícita	
  de	
  la	
  ingeniería	
  
                         de	
  so-ware	
  es	
  que	
  si	
  Benes	
  un	
  
                    proceso	
  sistemáBco	
  y	
  cuanBficado,	
  
                          cualquiera	
  puede	
  desarrollar	
  
                               so-ware	
  exitosamente.”	
  
                                                                             	
  
                                                   -­‐Pete	
  McBreen	
  
Lo	
  que	
  la	
  Artesanía	
  de	
  So-ware	
  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	
  cerBficaciones	
  arBficiales	
  y	
  un	
  modelo	
  
   de	
  negocio	
  a	
  su	
  alrededor.	
  
DESARROLLO	
  DIRIGIDO	
  POR	
  
     PRUEBAS	
  (TDD)	
  
Qué	
  es	
  TDD	
  


       “Test-­‐first	
  coding	
  is	
  not	
  a	
  tesBng	
  
                       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ácBca	
  
   para	
  dominarse.	
  
•  Es	
  una	
  disciplina.	
  
El	
  valor	
  de	
  TDD	
  
Tres	
  Reglas	
  
(según	
  Robert	
  C.	
  MarBn)	
  
                   •  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á	
  permiBdo	
  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	
  di_ciles	
  de	
  escribir,	
  por	
  lo	
  
   que	
  senBmos	
  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	
  Bempo.	
  
Escribiendo	
  pruebas	
  unitarias	
  efecBvas	
  


   “Las	
  pruebas	
  unitarias	
  deben	
  ser	
  legibles,	
  
       confiables	
  y	
  fáciles	
  de	
  mantener”	
  
                             	
  
                                               -­‐Roy	
  Osherove	
  
                               “The	
  Art	
  of	
  Unit	
  TesBng”	
  
Escribiendo	
  pruebas	
  unitarias	
  efecBvas:	
  
                           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úlBples	
  cosas.	
  
Escribiendo	
  pruebas	
  unitarias	
  efecBvas:	
  
                          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	
  comparBr	
  estado	
  entre	
  pruebas.	
  
•  Usa	
  inyección	
  de	
  dependencias.	
  
Escribiendo	
  pruebas	
  unitarias	
  efecBvas:	
  
                      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	
  parBcularmente	
  
   di_cil	
  de	
  probar,	
  busca	
  problemas	
  en	
  el	
  diseño	
  
   del	
  mismo.	
  
Escribiendo	
  pruebas	
  unitarias	
  efecBvas:	
  
                             Rapidez	
  

•  Una	
  prueba	
  unitaria	
  efecBva	
  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.	
  
Bibliogra_a	
  
•  “The	
  Clean	
  Coder”	
  de	
  Robert	
  C.	
  MarBn.	
  
•  “Test	
  Driven	
  Development:	
  By	
  Example”	
  de	
  Kent	
  Beck.	
  
•  “The	
  Art	
  of	
  Unit	
  Tes@ng”	
  de	
  Roy	
  Osherove.	
  
•  “Growing	
  Object-­‐Oriented	
  SoIware,	
  Guided	
  by	
  Tests”	
  de	
  
   Steve	
  Freeman	
  y	
  Nat	
  Pryce.	
  
•  “Agile	
  Java:	
  CraIing	
  Code	
  with	
  Test-­‐Driven	
  Development”	
  
   de	
  Jeff	
  Langr.	
  
•  “Diseño	
  Ágil	
  con	
  TDD”	
  de	
  Carlos	
  Ble	
  Jurado	
  -­‐>	
  !Es	
  graBs!	
  
   hjp://www.dirigidoportests.com/el-­‐libro	
  
•  Twijer:	
  @alfredochv	
  
•  Blog:	
  hjp://pensamientoobjeBvo.blogspot.mx

Más contenido relacionado

Similar a Artesanía de software y desarrollo dirigido por pruebas (tdd)

¿Te Sientes Orgulloso Del CóDigo Que Escribes?
¿Te Sientes Orgulloso Del CóDigo Que Escribes?¿Te Sientes Orgulloso Del CóDigo Que Escribes?
¿Te Sientes Orgulloso Del CóDigo Que Escribes?
Israel Antezana Rojas
 
.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez
.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez
.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez
.NET UY Meetup
 
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
Jordi 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 - Spanish
Jordi 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 - Spanish
Akamon Engineering
 

Similar a Artesanía de software y desarrollo dirigido por pruebas (tdd) (20)

Introducción a tdd
Introducción a tddIntroducción a tdd
Introducción a 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
 
¿Te Sientes Orgulloso Del CóDigo Que Escribes?
¿Te Sientes Orgulloso Del CóDigo Que Escribes?¿Te Sientes Orgulloso Del CóDigo Que Escribes?
¿Te Sientes Orgulloso Del CóDigo Que Escribes?
 
BDD & Cucumber
BDD & CucumberBDD & Cucumber
BDD & Cucumber
 
.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez
.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez
.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez
 
Desarrollo de Software Guiado por Pruebas
Desarrollo de Software Guiado por PruebasDesarrollo de Software Guiado por Pruebas
Desarrollo de Software Guiado por Pruebas
 
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
 
Módulo 4. Desarrollador ágil
Módulo 4. Desarrollador ágilMódulo 4. Desarrollador ágil
Módulo 4. Desarrollador ágil
 
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...
 
Artalde Tdd intro
Artalde Tdd introArtalde Tdd intro
Artalde Tdd intro
 
Automatización de pruebas con Selenium, Typescript, Protractor & Cucumber
Automatización de pruebas con Selenium, Typescript, Protractor & CucumberAutomatización de pruebas con Selenium, Typescript, Protractor & Cucumber
Automatización de pruebas con Selenium, Typescript, Protractor & Cucumber
 
TDD
TDDTDD
TDD
 
Practicas tecnicas
Practicas tecnicasPracticas tecnicas
Practicas tecnicas
 
ASP.NET MVC Workshop Día 2
ASP.NET MVC Workshop Día 2ASP.NET MVC Workshop Día 2
ASP.NET MVC Workshop Día 2
 
Clean code 9
Clean code 9Clean code 9
Clean code 9
 
Software Performance Testing: Conceptos y metodología
Software Performance Testing: Conceptos y metodologíaSoftware Performance Testing: Conceptos y metodología
Software Performance Testing: Conceptos y metodología
 
Construyendo tu propio laboratorio de pentesting
Construyendo tu propio laboratorio de pentestingConstruyendo tu propio laboratorio de pentesting
Construyendo tu propio laboratorio de pentesting
 
Las Claves del Desarrollo Dirigido por Pruebas (o TDD)
Las Claves del Desarrollo Dirigido por Pruebas (o TDD)Las Claves del Desarrollo Dirigido por Pruebas (o TDD)
Las Claves del Desarrollo Dirigido por Pruebas (o TDD)
 

Más de Software Guru

Más de Software Guru (20)

Hola Mundo del Internet de las Cosas
Hola Mundo del Internet de las CosasHola Mundo del Internet de las Cosas
Hola Mundo del Internet de las Cosas
 
Estructuras de datos avanzadas: Casos de uso reales
Estructuras de datos avanzadas: Casos de uso realesEstructuras de datos avanzadas: Casos de uso reales
Estructuras de datos avanzadas: Casos de uso reales
 
Building bias-aware environments
Building bias-aware environmentsBuilding bias-aware environments
Building bias-aware environments
 
El secreto para ser un desarrollador Senior
El secreto para ser un desarrollador SeniorEl secreto para ser un desarrollador Senior
El secreto para ser un desarrollador Senior
 
Cómo encontrar el trabajo remoto ideal
Cómo encontrar el trabajo remoto idealCómo encontrar el trabajo remoto ideal
Cómo encontrar el trabajo remoto ideal
 
Automatizando ideas con Apache Airflow
Automatizando ideas con Apache AirflowAutomatizando ideas con Apache Airflow
Automatizando ideas con Apache Airflow
 
How thick data can improve big data analysis for business:
How thick data can improve big data analysis for business:How thick data can improve big data analysis for business:
How thick data can improve big data analysis for business:
 
Introducción al machine learning
Introducción al machine learningIntroducción al machine learning
Introducción al machine learning
 
Democratizando el uso de CoDi
Democratizando el uso de CoDiDemocratizando el uso de CoDi
Democratizando el uso de CoDi
 
Gestionando la felicidad de los equipos con Management 3.0
Gestionando la felicidad de los equipos con Management 3.0Gestionando la felicidad de los equipos con Management 3.0
Gestionando la felicidad de los equipos con Management 3.0
 
Taller: Creación de Componentes Web re-usables con StencilJS
Taller: Creación de Componentes Web re-usables con StencilJSTaller: Creación de Componentes Web re-usables con StencilJS
Taller: Creación de Componentes Web re-usables con StencilJS
 
El camino del full stack developer (o como hacemos en SERTI para que no solo ...
El camino del full stack developer (o como hacemos en SERTI para que no solo ...El camino del full stack developer (o como hacemos en SERTI para que no solo ...
El camino del full stack developer (o como hacemos en SERTI para que no solo ...
 
¿Qué significa ser un programador en Bitso?
¿Qué significa ser un programador en Bitso?¿Qué significa ser un programador en Bitso?
¿Qué significa ser un programador en Bitso?
 
Colaboración efectiva entre desarrolladores del cliente y tu equipo.
Colaboración efectiva entre desarrolladores del cliente y tu equipo.Colaboración efectiva entre desarrolladores del cliente y tu equipo.
Colaboración efectiva entre desarrolladores del cliente y tu equipo.
 
Pruebas de integración con Docker en Azure DevOps
Pruebas de integración con Docker en Azure DevOpsPruebas de integración con Docker en Azure DevOps
Pruebas de integración con Docker en Azure DevOps
 
Elixir + Elm: Usando lenguajes funcionales en servicios productivos
Elixir + Elm: Usando lenguajes funcionales en servicios productivosElixir + Elm: Usando lenguajes funcionales en servicios productivos
Elixir + Elm: Usando lenguajes funcionales en servicios productivos
 
Así publicamos las apps de Spotify sin stress
Así publicamos las apps de Spotify sin stressAsí publicamos las apps de Spotify sin stress
Así publicamos las apps de Spotify sin stress
 
Achieving Your Goals: 5 Tips to successfully achieve your goals
Achieving Your Goals: 5 Tips to successfully achieve your goalsAchieving Your Goals: 5 Tips to successfully achieve your goals
Achieving Your Goals: 5 Tips to successfully achieve your goals
 
Acciones de comunidades tech en tiempos del Covid19
Acciones de comunidades tech en tiempos del Covid19Acciones de comunidades tech en tiempos del Covid19
Acciones de comunidades tech en tiempos del Covid19
 
De lo operativo a lo estratégico: un modelo de management de diseño
De lo operativo a lo estratégico: un modelo de management de diseñoDe lo operativo a lo estratégico: un modelo de management de diseño
De lo operativo a lo estratégico: un modelo de management de diseño
 

Último

Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
AnnimoUno1
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
FagnerLisboa3
 

Último (15)

EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdfRefrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
Refrigerador_Inverter_Samsung_Curso_y_Manual_de_Servicio_Español.pdf
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
Desarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdfDesarrollo Web Moderno con Svelte 2024.pdf
Desarrollo Web Moderno con Svelte 2024.pdf
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
Presentación de elementos de afilado con esmeril
Presentación de elementos de afilado con esmerilPresentación de elementos de afilado con esmeril
Presentación de elementos de afilado con esmeril
 
Modulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdfModulo-Mini Cargador.................pdf
Modulo-Mini Cargador.................pdf
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
presentacion de PowerPoint de la fuente de poder.pptx
presentacion de PowerPoint de la fuente de poder.pptxpresentacion de PowerPoint de la fuente de poder.pptx
presentacion de PowerPoint de la fuente de poder.pptx
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 

Artesanía de software y desarrollo dirigido por pruebas (tdd)

  • 1. Artesanía  de  So-ware  y   Desarrollo  Dirigido  por  Pruebas  
  • 2. ¿QUÉ  ES  LA  ARTESANÍA  DE   SOFTWARE  
  • 3. Manifiesto  por  la  Artesanía  de  So-ware   Como  aspirantes  a  artesanos  de  so-ware,  estamos  elevando  el  nivel   de  desarrollo  de  so-ware  profesional  pracBcándolo  y  ayudando  a   otros  a  aprenderlo.  A  través  de  este  trabajo  hemos  llegado  a  valorar:   •  No  sólo  so-ware  que  funciona,     •  sino  también  el  so-ware  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,   producBvas   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  So-ware?   •  Es  acerca  de  crear  conciencia  de  lo  que  está  mal  con   el  actual  estado  de  la  prácBca.   •  Es  acerca  de  hacer  el  mejor  trabajo  posible.   •  Comprometerse  con  nuestra  profesión.   •  SenBr  orgullo  del  trabajo  bien  hecho.   •  Mejorar  conBnuamente  nuestras  habilidades.   •  SaBsfacer  a  nuestros  usuarios  con  so-ware  de   calidad.  
  • 5. Lo  que  la  Artesanía  de  So-ware  NO  es   Ingeniería  de  So-ware:     “La  promesa  implícita  de  la  ingeniería   de  so-ware  es  que  si  Benes  un   proceso  sistemáBco  y  cuanBficado,   cualquiera  puede  desarrollar   so-ware  exitosamente.”     -­‐Pete  McBreen  
  • 6. Lo  que  la  Artesanía  de  So-ware  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  cerBficaciones  arBficiales  y  un  modelo   de  negocio  a  su  alrededor.  
  • 7. DESARROLLO  DIRIGIDO  POR   PRUEBAS  (TDD)  
  • 8. Qué  es  TDD   “Test-­‐first  coding  is  not  a  tesBng   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ácBca   para  dominarse.   •  Es  una  disciplina.  
  • 10. El  valor  de  TDD  
  • 11. Tres  Reglas   (según  Robert  C.  MarBn)   •  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á  permiBdo  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  di_ciles  de  escribir,  por  lo   que  senBmos  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  Bempo.  
  • 21. Escribiendo  pruebas  unitarias  efecBvas   “Las  pruebas  unitarias  deben  ser  legibles,   confiables  y  fáciles  de  mantener”     -­‐Roy  Osherove   “The  Art  of  Unit  TesBng”  
  • 22. Escribiendo  pruebas  unitarias  efecBvas:   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úlBples  cosas.  
  • 23. Escribiendo  pruebas  unitarias  efecBvas:   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  comparBr  estado  entre  pruebas.   •  Usa  inyección  de  dependencias.  
  • 24. Escribiendo  pruebas  unitarias  efecBvas:   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  parBcularmente   di_cil  de  probar,  busca  problemas  en  el  diseño   del  mismo.  
  • 25. Escribiendo  pruebas  unitarias  efecBvas:   Rapidez   •  Una  prueba  unitaria  efecBva  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. Bibliogra_a   •  “The  Clean  Coder”  de  Robert  C.  MarBn.   •  “Test  Driven  Development:  By  Example”  de  Kent  Beck.   •  “The  Art  of  Unit  Tes@ng”  de  Roy  Osherove.   •  “Growing  Object-­‐Oriented  SoIware,  Guided  by  Tests”  de   Steve  Freeman  y  Nat  Pryce.   •  “Agile  Java:  CraIing  Code  with  Test-­‐Driven  Development”   de  Jeff  Langr.   •  “Diseño  Ágil  con  TDD”  de  Carlos  Ble  Jurado  -­‐>  !Es  graBs!   hjp://www.dirigidoportests.com/el-­‐libro  
  • 28. •  Twijer:  @alfredochv   •  Blog:  hjp://pensamientoobjeBvo.blogspot.mx