SlideShare una empresa de Scribd logo
Desarrollo y Pruebas de
Proyectos Java en un Entorno
            Ágil
Acerca de Mi
●   Amante del Software
●   Expatriado y Retornado
●   10 años peleando con líneas de código
●   Blogger aficionado: http://brigomp.blogspot.com
●   Co-fundador de Jobsket
●   http://www.jobsket.es/cv/martin
El índice
●   Historietas de Guerra
●   Nociones básicas sobre Desarrollo Ágil
●   Buenas Prácticas
●   Testing y QA
●   Integración Continua
Historias de Guerra
Desarrollo con Java y metodologías agiles
Historietas de Guerra
●   Iteraciones frecuentes

●   Desplegar software rápidamente

●   Hacer que el cliente participe en el diseño

●   No hace falta rodearse de los mejores.

●   Rodearse de gente trabajadora suele ser
    suficiente.
TVODD: TV Oriented Based Development

ESTAS RETRASANDO EL PROYECTO
Historias de Guerra
●   Las televisiones no motivan (a no ser que te
    gusten apostar a las carreras de caballos)
●   Determinadas acciones son golpes a la moral
●   Los proyectos retrasados no van a remontar el
    vuelo por poner más presión a los empleados.
●   Demuestran que son necesarios cambios en la
    forma de trabajar de la empresa.
¡¡¡ A TESTEAR !!!
Historias de Guerra
●   No por tener más testers tu software va a estar
    mejor testeado.
●   Es necesaria una estrategia de automatización.
●   El equipo de desarrollo debe ayudar al equipo
    de testers.
●   Pero El equipo de testers debe dejarse ayudar.
●   Tener testers no informáticos es bueno.
Nociones básicas (y muy breves) sobre
           Desarrollo Ágil
Manifiesto Ágil

   Nuevos Valores                Antiguos Valores

Individuos e integracción     Procesos y herramientas
Software que funciona         Documentación exhaustiva
Colaboración con el cliente   Negociación contractual
Respuesta al cambio           Seguimiento de un plan
Desarrollo ágil
●   Pragmatismo
●   Iteraciones cortas
●   Software funcional disponible frecuentemente
●   Reuniones frecuentes
●   Reparto de conocimiento y responsabilidades
●   Documentación ágil
●   Demostración continua
●   Retrospectivas
●   Personas y relaciones frente a herramientas
Buenas Prácticas
Programación en Parejas
●   Juntar dos desarrolladores frente a una pantalla.
●   A la larga, mayor productividad.
●   Incrementa la propiedad colectiva del código.
●   Combinación perfecta: desarrollardor experto +
    desarrollador normal/junior.
●   Juntar a 2 juniors, 2 expertos no aporta demasiado
●   El programador inexperto aprende mucho más.
●   Quizás no una práctica para el día a día pero sí para
    hacer de cuando en cuando.
Revisiones de Código
●   Muy útil para detectar errores.
●   Muy importante con nuevas incorporaciones en
    los equipos.
●   Es necesario alternar la responsabilidad. Si no,
    “el revisor” será un cuello de botella.
●   Aumenta la responsabilidad colectiva del
    código.
●   Centrarse en errores de alto nivel. El resto se
    puede detectar fácilmente con análisis estático.
Análisis estático
●   Las herramientas de análisis estático detectan
    errores sin tener que ejecutar código.
●   Se integran fácilmente en el proceso de build
    ●   Si se detectan X errores críticos la build falla.
●   Algunas veces hay que mitigar el ruido
●   Findbugs, PMD, Sonar.
●   Alternativas comerciales
Análisis estático: Errores Imprevisibles
●   Visto en Eclipse 3.5RC2
        if (adapters == null && adapters.length == 0) return;
●   Error desde Eclipse 3.2
    ●   Probablemente nunca se cumplió la condición
    ●   Si se cumpliese habría saltado una NPE
Análisis estático: Seguridad
●   Ejemplo típico. SQL Injection

    HttpServletRequest request = …
    String usuario = request.getParameter(“user”)
    String query = “select * from account_numbers where nombre='
    ” + usuario + “ ' ”;
    con.execute(query)


●   ¿Y si user es “ ' OR 1==1-- ” ?
Análisis estático: Escalabilidad
●   Resource leaking
    try {
       Connection c = …
       String query = ...;
       c.execute(query);
       c.close()
    } catch (Exception e) { e.printStackTrace() }
●   ¿ Qué pasa si falla la consulta ?
Análisis estático: Concurrencia
●   Ejemplo, uso de estructuras de datos no
    Thread-safe en código multihilo
●   ¿Inocente? Esto es un gráfico de un servidor
    real. 4 CPUs 8Gb RAM.
Desarrollo con Java y metodologías agiles
Análisis estático: Concurrencia

●   Parece grave, ¿no? ¿Cuál fue la
    causa?

●   Dos llamadas a HashMap.put() y
    mala suerte
Desarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agiles
Testing y QA
Testing
●   Todos somos humanos. El software
    inevitablemente tiene muchos herrores.
●   Bienvenidos sean los fallos.
●   Por eso mismo debemos hacer pruebas.
    ●   Unitarias
    ●   Integración
    ●   Funcionales
    ●   Stress
Tests Unitarios
●   Los hacen los desarrolladores
●   Prueban la funcionalidad de tu código
●   Introducidos ya en todos los lenguajes
●   Junit, Nunit, PhpUnit,Test::Unit,...
●   Prueban partes de código que no interactuen
    con recursos externos
    ●   No acceden a bases de datos, no acceden a la red,
        etc.
Tests Unitarios
public class LanguageDetectorTests extends TestCase {


@Test
public void testLanguageDetection() throws Exception {


    LanguageIdentifier identifier = new LanguageIdentifier();
    assertEquals(identifier.identify("This is a test"),"en");
    assertEquals(identifier.identify("Esto es un test"),"es");
}
Tests Unitarios
public void testExtractExperience() {


  List<ExperienceEntry> entries =
extractor.extractExperience("Julio 2006 - Septiembre 2006 Vuelvo a
Sertec Soluciones informáticas Trabajando como Operador de
Sistemas dentro del Proyecto CRONOS de la Editorial
Planeta.nSeptiembre 2007 - Julio 2008 Becario en el departamento
de Matemàtica Aplicada I de la Universitat Politècnica de
Catalunya dentro de los servicios informáticos dando soporte a los
profesores del departamento.","es");
    assertEquals(entries.size(),2);
    assertEquals(entries.get(0).getExperience(),2);
    assertEquals(entries.get(1).getExperience(),10);
}
Desarrollo con Java y metodologías agiles
Tests Unitarios
●   Típico: Tengo prisa. No tengo tiempo para
    hacer tests unitarios
●   Los tests unitarios se hacen para ahorrar
    tiempo
    ●   Software más sólido y probado.
    ●   Menos cosas que probar manualmente.
    ●   Menos bugs. Los bugs se encuentran antes.
    ●   Menos presión.
●   No hacer tests unitarios es no ser un buen
    programador
Cobertura de Código
●   Es importante saber cuanto código estamos
    realmente probando.
    ●   Ideal 70%-80%
    ●   100% es perder el tiempo. Demasiado caro.
●   Muy útil para contrastar que nuestros tests
    están realmente haciendo lo que queremos.
●   Muchísimas herramientas
    ●   Lo bueno es que no hay que configurar nada.
    ●   Se pueden integrar en el proceso de build.
    ●   Cobertura,EclEmma,Sonar, etc.
Cobertura de Código
Desarrollo con Java y metodologías agiles
Tests de Integración
●   Los hacen los desarrolladores
●   Prueban la funcionalidad de tu código que
    depende de recursos externos
    ●   Pruebas de bases de datos, recursos en red,
        servicios web, EJBs, disco,etc.
●   Requieren un setup. Inicialización de recursos,
    ficheros de configuración diferentes a
    producción, etc.
●   Herramientas como Spring te lo hacen más
    sencillo
Tests de Integración
●   Existen frameworks para todos los gustos
    ●   XMLUnit: Xmls, XSLTs, XSDs, ...
    ●   DBUnit: Acceso a bases de datos
    ●   HtmlUnit: Páginas web
    ●   SoapUI: Servicios web
    ●   Cactus: JSPs, Servlets, EJBs,...
HTMLUnit



  DBUnit




 XMLUnit
Tests de Integración
●   Hacer tests de integración requieres más
    esfuerzo que el hacer tests unitarios.
●   Sin embargo, es muy necesario.
●   Este esfuerzo es sólo de configuración.
    ●   ¿Cómo inicializo mi base de datos?
    ●   ¿Cómo inicializo mi servidor web?
●   Muchos servidores pueden ser embebidos:
    Jetty, Tomcat, HSQLDB, …
Tests de Integración
●   Proceso típico:
    1) Inicializar base de datos, servidor web, …
    2) Inicializar nuestros servicios.
    3) Ejecutar el test
●   Si nos encontramos haciendo nuestro propio
    framework de integración: Mal camino.
    ●   Spring hace todo más fácil
●   En Grails por ejemplo es ridículamente simple.
●   Una vez está todo configurado. Vale la pena.
    Los tests son mucho más significativos.
Tests de Integración
     void testFindAllByUsername() {{
      void testFindAllByUsername()
          CV cv1 == buildCV()
           CV cv1    buildCV()
          cvService.save(cv1)
           cvService.save(cv1)
          CV cv2 == buildCV()
           CV cv2    buildCV()
          cvService.save(cv2)
           cvService.save(cv2)
          def cvs == cvService.findAllByUsername("test")
           def cvs    cvService.findAllByUsername("test")
          assertEquals cvs.size(),2
           assertEquals cvs.size(),2
     }}

void testDeleteInvoice() {{
 void testDeleteInvoice()
     def invoiceData == new InvoiceData()
      def invoiceData    new InvoiceData()
     invoiceData.user == recruiter
      invoiceData.user    recruiter
     def invoice == billingService.generateInvoice(invoiceData)
      def invoice    billingService.generateInvoice(invoiceData)
     assertEquals billingService.findAllInvoicesByUser(recruiter).size,1
      assertEquals billingService.findAllInvoicesByUser(recruiter).size,1

     billingService.deleteInvoice(recruiter,invoice)
      billingService.deleteInvoice(recruiter,invoice)
     assertEquals billingService.findAllInvoicesByUser(recruiter).size,0
      assertEquals billingService.findAllInvoicesByUser(recruiter).size,0
}}
Tests de Integración
●   Ojo con el solapamiento entre tests de
    integración y tests funcionales
●   Si:
    ●   No usamos un framework que nos haga las cosas
        más fáciles
    ●   Nos está costando bastante el configurar el sistema
        (base de datos embebida, gestión de
        transacciones, limpieza entre tests, etc.)
●   Entones quizás sea mejor saltar directamente a
    hacer tests funcionales
Tests Funcionales
●   No los deberían hacer los desarrolladores.
●   Se comportan como si fueran usuarios reales.
●   No conocen el sistema.
●   Simplemente acceden a las páginas web,
    aplicación.
●   Son con diferencia el mejor tipo de pruebas
    ●   ¡¡ El software funciona de verdad !!
QA
●   Rara avis en España. Muy común en Europa.
●   No informáticos que se dedican a probar las
    aplicaciones.
●   Son personas muy útiles, pero es necesario
    guiarles. Es importante que se dejen guiar. Es
    gente que no tiene experiencia en desarrollo
    de software.
●   ¿Deberían hacer tests funcionales los
    programadores?
    ●   Idealmente, no. QA mira el software de un modo
        completamente diferente.
Tests Funcionales
●   Hoy por hoy hay muchas herramientas
    ●   Selenium
    ●   Canoo WebTest
    ●   HTMLUnit
●   ¿Y si mi aplicación es Swing?
    ●   Abbot, Frankenstein,...
●   Muchas herramientas comerciales
    ●   En una empresa usabamos HP QuickTest
        –   QA grababa los tests desde un applet y se generaban
            scripts en Excel. ¡Les encantaba!
Tests Funcionales
●   Selenium es enormemente sencillo
●   Tiene un IDE para grabar
    tests.
●   Los tests se pueden
    reproducir.
●   Incluso genera código en
    diferentes lenguajes.
●   Cualquiera puede grabar
    estos tests. Ideal para no
    desarrolladores.
Tests Funcionales
●   Pero, lanza una instancia del navegador con
    cada tests, es decir, consume bastantes
    recursos.
●   Los tests pueden ser complicados de mantener.
●   Canoo WebTest
Tests Funcionales
●   Ojo, a veces lo simple puede ser lo más potente
●   HtmlUnit es realmente sencillo, pero no es nada
    amigable para no desarrolladores.
Tests Funcionales
●   Ojo, a veces lo simple puede ser lo más potente
●   HtmlUnit es realmente sencillo y no requiere
    navegadores abiertos.
●   Pero sólo lo entendemos los programadores.
Tests Funcionales
●   Pero con un buen DSL cualquiera puede hacer
    tests.
●   En uno de mis trabajos lo probé en una de mis
    empresas y se comenzaron a hacer tests como
    churros. 36 Qas por fin productivos.
      Module: signin
       Module: signin
      Goto '/home'
       Goto '/home'                  run signin
      ClickByText 'Sign In'           run signin
       ClickByText 'Sign In'
      Type 'Login','martin'
       Type 'Login','martin'         Goto '/invoices'
      Type 'Password','test'          Goto '/invoices'
       Type 'Password','test'        ClickButton 'New Invoice'
                                      ClickButton 'New Invoice'
      ClickButton 'Sign In'
       ClickButton 'Sign In'         VeryfyText 'Create...
      VerifyText 'Welcome Martin'     VeryfyText 'Create...
       VerifyText 'Welcome Martin'
Test Driven Development
●   Crear primero el test y después el código.
●   Difícil de comenzar, cambio completo de
    mentalidad.
●   Tras acostumbrarse, muy productivo. Ya que:
    ●   Te obliga a enfrentarte al problema desde un punto
        de vista diferente.
    ●   Tras acabar la funcionalidad, ya tienes los tests.
●   Fácil acostumbrarse al empezar con bugs
    ●   ¿Te pasan un bug? Test que lo reproduzca.
Lo que ningún libro te contará sobre los tests
Integración Continua
¡Sálvame!
●   Iteraciones cada dos semanas.
●   Demos a final de cada iteración.
●   Despliegue en producción cada mes.
●   Un departamento de QA que necesita software
    que funcione.
●   Un departamento Comercial que quiere hacer
    demos a clientes.


                     ¿Imposible?
Integración Continua
                                    1. Compilar
                                    2. Ejecutar tests
                                    3. Analizar código
                                    4. Métricas
Commits
                                              7. Release


    SVN,
    CVS,..                     CI
                5. Desplegar

                     6. Tests Funcionales




               Servidor
Integración Continua
●   Cruise Control, Hudson, Apache Continuum,
    Bamboo, Team Foundation Server,...
●   Para mi, el mejor es Hudson
    ●   Instalación trivial
    ●   Enormemente sencillo de utilizar
    ●   Multitud de plug-ins
Integración Continua
Desarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agiles
Desarrollo con Java y metodologías agiles
Respetar la build
Integración Continua
●   Algunas buenas prácticas:
    ●   La build debe ser muy rápida. Intentar siempre
        acortar el tiempo de build.
    ●   No tener una única build. Separarlas para hacer el
        proceso más rápido.
    ●   Si la build se rompe, hay que parar y arreglarla.
    ●   Si hay QAs creando tests quizás convenga que
        tengan otra máquina.
    ●   Los tests funcionales suelen tomar bastante
        tiempo. Build propia o idealmente otra máquina.
Referencias
●   http://www.agile-spain.com
●   http://groups.google.es/group/agile-spain/files?pli=1
●   http://sites.google.com/site/axilmente/Home/recursos
●   http://pragprog.com
●   http://blog.objectmentor.com
●   http://www.crisp.se/henrik.kniberg/ScrumAndXpFromTheTrenches.pdf
●   http://www.infoq.com
●   http://www.presionblogosferica.com
●   http://www.javahispano.org
Gracias

Más contenido relacionado

PPTX
Diseño y construcción de un puente de tallarines
DOCX
Ciclo de vida de los materiales
PPTX
Arquitectura y diseño de aplicaciones Java EE
DOCX
Entorno power point
PPTX
White t shirt party at Cafe des Arts, Nairobi, Kenya
PPTX
Estefanía guzmán diapositivas
PPTX
Generacion de computadoras
Diseño y construcción de un puente de tallarines
Ciclo de vida de los materiales
Arquitectura y diseño de aplicaciones Java EE
Entorno power point
White t shirt party at Cafe des Arts, Nairobi, Kenya
Estefanía guzmán diapositivas
Generacion de computadoras

Destacado (19)

PDF
Cross concept 2
PPTX
Steal This Data - Email Security and DLP
PPTX
InnovArte en KunArte
PPT
Literacias via dispositivos & info basica cedep-paranoá-df30ago2014-v4
PPS
Frases del papa francisco
PDF
20131030 OECD - Competition and value distribution along the food chain. Span...
PPTX
Interacción o looping scratch
PPT
Construyendo la Propuesta de Investigación
DOCX
Instituto superior tecnologico privado
PPTX
Lead to-Revenue Best Practices - Driving Pipeline Growth Across the Enterprise
PDF
Curso Electromagnetismo II
DOCX
Phyllosphere agricultura moderna
PPTX
MDI - Mandevian Knights
DOCX
Informe visita al IGAC
PDF
Elaboración de mapas para publicaciones científicas y documentos de divulgación
PDF
NEW MEDIA IN SPORT (Mobile World Congress 2011)
PPTX
El mentoring y la responsabilidad social universitaria
PPT
Ch. 4 Skin And Body Membranes
PPTX
Neumonía
Cross concept 2
Steal This Data - Email Security and DLP
InnovArte en KunArte
Literacias via dispositivos & info basica cedep-paranoá-df30ago2014-v4
Frases del papa francisco
20131030 OECD - Competition and value distribution along the food chain. Span...
Interacción o looping scratch
Construyendo la Propuesta de Investigación
Instituto superior tecnologico privado
Lead to-Revenue Best Practices - Driving Pipeline Growth Across the Enterprise
Curso Electromagnetismo II
Phyllosphere agricultura moderna
MDI - Mandevian Knights
Informe visita al IGAC
Elaboración de mapas para publicaciones científicas y documentos de divulgación
NEW MEDIA IN SPORT (Mobile World Congress 2011)
El mentoring y la responsabilidad social universitaria
Ch. 4 Skin And Body Membranes
Neumonía
Publicidad

Similar a Desarrollo con Java y metodologías agiles (20)

PPTX
Software Quality Assurance
PDF
Conceptos básicos de Unit Test
PDF
Artesania de Software y TDD
PDF
¿Cómo poner software de calidad en manos del usuario de forma rápida?
PPTX
Desarrollo de Software Guiado por Pruebas
PDF
Automatización de pruebas con Selenium, Typescript, Protractor & Cucumber
PDF
Ponele el TURBO al Dev Team de tu Startup
ODP
Grails 2013 - PUCMM - Santiago - Sistemas
PPTX
Testing & Pizza by Lito & nitsnets
PPTX
Cobertura de pruebas unitarias - NetBaires
PPTX
Cobertura de pruebas unitarias en C#
PPTX
Artesania de Software y TDD
PDF
Integracion Continua
PDF
Ecuador jug 2017 -incrementando la productividad de proyectos java ee con c...
PDF
Conferencia Rails: Integracion Continua Y Rails
PDF
Probando aplicaciones AngularJS
PDF
Pucela testingdays testing_en_php
PPTX
Introducción a tdd
PPTX
Pruebas de software
Software Quality Assurance
Conceptos básicos de Unit Test
Artesania de Software y TDD
¿Cómo poner software de calidad en manos del usuario de forma rápida?
Desarrollo de Software Guiado por Pruebas
Automatización de pruebas con Selenium, Typescript, Protractor & Cucumber
Ponele el TURBO al Dev Team de tu Startup
Grails 2013 - PUCMM - Santiago - Sistemas
Testing & Pizza by Lito & nitsnets
Cobertura de pruebas unitarias - NetBaires
Cobertura de pruebas unitarias en C#
Artesania de Software y TDD
Integracion Continua
Ecuador jug 2017 -incrementando la productividad de proyectos java ee con c...
Conferencia Rails: Integracion Continua Y Rails
Probando aplicaciones AngularJS
Pucela testingdays testing_en_php
Introducción a tdd
Pruebas de software
Publicidad

Último (20)

PDF
taller de informática - LEY DE OHM
PDF
Diapositiva proyecto de vida, materia catedra
PDF
Estrategia de apoyo tecnología grado 9-3
PDF
CyberOps Associate - Cisco Networking Academy
PPT
introduccion a las_web en el 2025_mejoras.ppt
PDF
Instrucciones simples, respuestas poderosas. La fórmula del prompt perfecto.
PDF
5.1 Pinch y Bijker en libro Actos, actores y artefactos de Bunch Thomas (coor...
PDF
Calidad desde el Docente y la mejora continua .pdf
DOCX
Zarate Quispe Alex aldayir aplicaciones de internet .docx
PPTX
sa-cs-82-powerpoint-hardware-y-software_ver_4.pptx
PPTX
Acronis Cyber Protect Cloud para Ciber Proteccion y Ciber Seguridad LATAM - A...
PDF
programa-de-estudios-2011-guc3ada-para-el-maestro-secundarias-tecnicas-tecnol...
PPTX
Presentación PASANTIAS AuditorioOO..pptx
PPTX
ANCASH-CRITERIOS DE EVALUACIÓN-FORMA-10-10 (2).pptx
PDF
MÓDULO DE CALOR DE GRADO DE MEDIO DE FORMACIÓN PROFESIONAL
PPTX
IA de Cine - Como MuleSoft y los Agentes estan redefiniendo la realidad
PPTX
Power Point Nicolás Carrasco (disertación Roblox).pptx
PDF
clase auditoria informatica 2025.........
PPTX
COMO AYUDAN LAS TIC EN LA EDUCACION SUPERIOR.pptx
PDF
Maste clas de estructura metálica y arquitectura
taller de informática - LEY DE OHM
Diapositiva proyecto de vida, materia catedra
Estrategia de apoyo tecnología grado 9-3
CyberOps Associate - Cisco Networking Academy
introduccion a las_web en el 2025_mejoras.ppt
Instrucciones simples, respuestas poderosas. La fórmula del prompt perfecto.
5.1 Pinch y Bijker en libro Actos, actores y artefactos de Bunch Thomas (coor...
Calidad desde el Docente y la mejora continua .pdf
Zarate Quispe Alex aldayir aplicaciones de internet .docx
sa-cs-82-powerpoint-hardware-y-software_ver_4.pptx
Acronis Cyber Protect Cloud para Ciber Proteccion y Ciber Seguridad LATAM - A...
programa-de-estudios-2011-guc3ada-para-el-maestro-secundarias-tecnicas-tecnol...
Presentación PASANTIAS AuditorioOO..pptx
ANCASH-CRITERIOS DE EVALUACIÓN-FORMA-10-10 (2).pptx
MÓDULO DE CALOR DE GRADO DE MEDIO DE FORMACIÓN PROFESIONAL
IA de Cine - Como MuleSoft y los Agentes estan redefiniendo la realidad
Power Point Nicolás Carrasco (disertación Roblox).pptx
clase auditoria informatica 2025.........
COMO AYUDAN LAS TIC EN LA EDUCACION SUPERIOR.pptx
Maste clas de estructura metálica y arquitectura

Desarrollo con Java y metodologías agiles

  • 1. Desarrollo y Pruebas de Proyectos Java en un Entorno Ágil
  • 2. Acerca de Mi ● Amante del Software ● Expatriado y Retornado ● 10 años peleando con líneas de código ● Blogger aficionado: http://brigomp.blogspot.com ● Co-fundador de Jobsket ● http://www.jobsket.es/cv/martin
  • 3. El índice ● Historietas de Guerra ● Nociones básicas sobre Desarrollo Ágil ● Buenas Prácticas ● Testing y QA ● Integración Continua
  • 6. Historietas de Guerra ● Iteraciones frecuentes ● Desplegar software rápidamente ● Hacer que el cliente participe en el diseño ● No hace falta rodearse de los mejores. ● Rodearse de gente trabajadora suele ser suficiente.
  • 7. TVODD: TV Oriented Based Development ESTAS RETRASANDO EL PROYECTO
  • 8. Historias de Guerra ● Las televisiones no motivan (a no ser que te gusten apostar a las carreras de caballos) ● Determinadas acciones son golpes a la moral ● Los proyectos retrasados no van a remontar el vuelo por poner más presión a los empleados. ● Demuestran que son necesarios cambios en la forma de trabajar de la empresa.
  • 10. Historias de Guerra ● No por tener más testers tu software va a estar mejor testeado. ● Es necesaria una estrategia de automatización. ● El equipo de desarrollo debe ayudar al equipo de testers. ● Pero El equipo de testers debe dejarse ayudar. ● Tener testers no informáticos es bueno.
  • 11. Nociones básicas (y muy breves) sobre Desarrollo Ágil
  • 12. Manifiesto Ágil Nuevos Valores Antiguos Valores Individuos e integracción Procesos y herramientas Software que funciona Documentación exhaustiva Colaboración con el cliente Negociación contractual Respuesta al cambio Seguimiento de un plan
  • 13. Desarrollo ágil ● Pragmatismo ● Iteraciones cortas ● Software funcional disponible frecuentemente ● Reuniones frecuentes ● Reparto de conocimiento y responsabilidades ● Documentación ágil ● Demostración continua ● Retrospectivas ● Personas y relaciones frente a herramientas
  • 15. Programación en Parejas ● Juntar dos desarrolladores frente a una pantalla. ● A la larga, mayor productividad. ● Incrementa la propiedad colectiva del código. ● Combinación perfecta: desarrollardor experto + desarrollador normal/junior. ● Juntar a 2 juniors, 2 expertos no aporta demasiado ● El programador inexperto aprende mucho más. ● Quizás no una práctica para el día a día pero sí para hacer de cuando en cuando.
  • 16. Revisiones de Código ● Muy útil para detectar errores. ● Muy importante con nuevas incorporaciones en los equipos. ● Es necesario alternar la responsabilidad. Si no, “el revisor” será un cuello de botella. ● Aumenta la responsabilidad colectiva del código. ● Centrarse en errores de alto nivel. El resto se puede detectar fácilmente con análisis estático.
  • 17. Análisis estático ● Las herramientas de análisis estático detectan errores sin tener que ejecutar código. ● Se integran fácilmente en el proceso de build ● Si se detectan X errores críticos la build falla. ● Algunas veces hay que mitigar el ruido ● Findbugs, PMD, Sonar. ● Alternativas comerciales
  • 18. Análisis estático: Errores Imprevisibles ● Visto en Eclipse 3.5RC2 if (adapters == null && adapters.length == 0) return; ● Error desde Eclipse 3.2 ● Probablemente nunca se cumplió la condición ● Si se cumpliese habría saltado una NPE
  • 19. Análisis estático: Seguridad ● Ejemplo típico. SQL Injection HttpServletRequest request = … String usuario = request.getParameter(“user”) String query = “select * from account_numbers where nombre=' ” + usuario + “ ' ”; con.execute(query) ● ¿Y si user es “ ' OR 1==1-- ” ?
  • 20. Análisis estático: Escalabilidad ● Resource leaking try { Connection c = … String query = ...; c.execute(query); c.close() } catch (Exception e) { e.printStackTrace() } ● ¿ Qué pasa si falla la consulta ?
  • 21. Análisis estático: Concurrencia ● Ejemplo, uso de estructuras de datos no Thread-safe en código multihilo ● ¿Inocente? Esto es un gráfico de un servidor real. 4 CPUs 8Gb RAM.
  • 23. Análisis estático: Concurrencia ● Parece grave, ¿no? ¿Cuál fue la causa? ● Dos llamadas a HashMap.put() y mala suerte
  • 29. Testing ● Todos somos humanos. El software inevitablemente tiene muchos herrores. ● Bienvenidos sean los fallos. ● Por eso mismo debemos hacer pruebas. ● Unitarias ● Integración ● Funcionales ● Stress
  • 30. Tests Unitarios ● Los hacen los desarrolladores ● Prueban la funcionalidad de tu código ● Introducidos ya en todos los lenguajes ● Junit, Nunit, PhpUnit,Test::Unit,... ● Prueban partes de código que no interactuen con recursos externos ● No acceden a bases de datos, no acceden a la red, etc.
  • 31. Tests Unitarios public class LanguageDetectorTests extends TestCase { @Test public void testLanguageDetection() throws Exception { LanguageIdentifier identifier = new LanguageIdentifier(); assertEquals(identifier.identify("This is a test"),"en"); assertEquals(identifier.identify("Esto es un test"),"es"); }
  • 32. Tests Unitarios public void testExtractExperience() { List<ExperienceEntry> entries = extractor.extractExperience("Julio 2006 - Septiembre 2006 Vuelvo a Sertec Soluciones informáticas Trabajando como Operador de Sistemas dentro del Proyecto CRONOS de la Editorial Planeta.nSeptiembre 2007 - Julio 2008 Becario en el departamento de Matemàtica Aplicada I de la Universitat Politècnica de Catalunya dentro de los servicios informáticos dando soporte a los profesores del departamento.","es"); assertEquals(entries.size(),2); assertEquals(entries.get(0).getExperience(),2); assertEquals(entries.get(1).getExperience(),10); }
  • 34. Tests Unitarios ● Típico: Tengo prisa. No tengo tiempo para hacer tests unitarios ● Los tests unitarios se hacen para ahorrar tiempo ● Software más sólido y probado. ● Menos cosas que probar manualmente. ● Menos bugs. Los bugs se encuentran antes. ● Menos presión. ● No hacer tests unitarios es no ser un buen programador
  • 35. Cobertura de Código ● Es importante saber cuanto código estamos realmente probando. ● Ideal 70%-80% ● 100% es perder el tiempo. Demasiado caro. ● Muy útil para contrastar que nuestros tests están realmente haciendo lo que queremos. ● Muchísimas herramientas ● Lo bueno es que no hay que configurar nada. ● Se pueden integrar en el proceso de build. ● Cobertura,EclEmma,Sonar, etc.
  • 38. Tests de Integración ● Los hacen los desarrolladores ● Prueban la funcionalidad de tu código que depende de recursos externos ● Pruebas de bases de datos, recursos en red, servicios web, EJBs, disco,etc. ● Requieren un setup. Inicialización de recursos, ficheros de configuración diferentes a producción, etc. ● Herramientas como Spring te lo hacen más sencillo
  • 39. Tests de Integración ● Existen frameworks para todos los gustos ● XMLUnit: Xmls, XSLTs, XSDs, ... ● DBUnit: Acceso a bases de datos ● HtmlUnit: Páginas web ● SoapUI: Servicios web ● Cactus: JSPs, Servlets, EJBs,...
  • 40. HTMLUnit DBUnit XMLUnit
  • 41. Tests de Integración ● Hacer tests de integración requieres más esfuerzo que el hacer tests unitarios. ● Sin embargo, es muy necesario. ● Este esfuerzo es sólo de configuración. ● ¿Cómo inicializo mi base de datos? ● ¿Cómo inicializo mi servidor web? ● Muchos servidores pueden ser embebidos: Jetty, Tomcat, HSQLDB, …
  • 42. Tests de Integración ● Proceso típico: 1) Inicializar base de datos, servidor web, … 2) Inicializar nuestros servicios. 3) Ejecutar el test ● Si nos encontramos haciendo nuestro propio framework de integración: Mal camino. ● Spring hace todo más fácil ● En Grails por ejemplo es ridículamente simple. ● Una vez está todo configurado. Vale la pena. Los tests son mucho más significativos.
  • 43. Tests de Integración void testFindAllByUsername() {{ void testFindAllByUsername() CV cv1 == buildCV() CV cv1 buildCV() cvService.save(cv1) cvService.save(cv1) CV cv2 == buildCV() CV cv2 buildCV() cvService.save(cv2) cvService.save(cv2) def cvs == cvService.findAllByUsername("test") def cvs cvService.findAllByUsername("test") assertEquals cvs.size(),2 assertEquals cvs.size(),2 }} void testDeleteInvoice() {{ void testDeleteInvoice() def invoiceData == new InvoiceData() def invoiceData new InvoiceData() invoiceData.user == recruiter invoiceData.user recruiter def invoice == billingService.generateInvoice(invoiceData) def invoice billingService.generateInvoice(invoiceData) assertEquals billingService.findAllInvoicesByUser(recruiter).size,1 assertEquals billingService.findAllInvoicesByUser(recruiter).size,1 billingService.deleteInvoice(recruiter,invoice) billingService.deleteInvoice(recruiter,invoice) assertEquals billingService.findAllInvoicesByUser(recruiter).size,0 assertEquals billingService.findAllInvoicesByUser(recruiter).size,0 }}
  • 44. Tests de Integración ● Ojo con el solapamiento entre tests de integración y tests funcionales ● Si: ● No usamos un framework que nos haga las cosas más fáciles ● Nos está costando bastante el configurar el sistema (base de datos embebida, gestión de transacciones, limpieza entre tests, etc.) ● Entones quizás sea mejor saltar directamente a hacer tests funcionales
  • 45. Tests Funcionales ● No los deberían hacer los desarrolladores. ● Se comportan como si fueran usuarios reales. ● No conocen el sistema. ● Simplemente acceden a las páginas web, aplicación. ● Son con diferencia el mejor tipo de pruebas ● ¡¡ El software funciona de verdad !!
  • 46. QA ● Rara avis en España. Muy común en Europa. ● No informáticos que se dedican a probar las aplicaciones. ● Son personas muy útiles, pero es necesario guiarles. Es importante que se dejen guiar. Es gente que no tiene experiencia en desarrollo de software. ● ¿Deberían hacer tests funcionales los programadores? ● Idealmente, no. QA mira el software de un modo completamente diferente.
  • 47. Tests Funcionales ● Hoy por hoy hay muchas herramientas ● Selenium ● Canoo WebTest ● HTMLUnit ● ¿Y si mi aplicación es Swing? ● Abbot, Frankenstein,... ● Muchas herramientas comerciales ● En una empresa usabamos HP QuickTest – QA grababa los tests desde un applet y se generaban scripts en Excel. ¡Les encantaba!
  • 48. Tests Funcionales ● Selenium es enormemente sencillo ● Tiene un IDE para grabar tests. ● Los tests se pueden reproducir. ● Incluso genera código en diferentes lenguajes. ● Cualquiera puede grabar estos tests. Ideal para no desarrolladores.
  • 49. Tests Funcionales ● Pero, lanza una instancia del navegador con cada tests, es decir, consume bastantes recursos. ● Los tests pueden ser complicados de mantener. ● Canoo WebTest
  • 50. Tests Funcionales ● Ojo, a veces lo simple puede ser lo más potente ● HtmlUnit es realmente sencillo, pero no es nada amigable para no desarrolladores.
  • 51. Tests Funcionales ● Ojo, a veces lo simple puede ser lo más potente ● HtmlUnit es realmente sencillo y no requiere navegadores abiertos. ● Pero sólo lo entendemos los programadores.
  • 52. Tests Funcionales ● Pero con un buen DSL cualquiera puede hacer tests. ● En uno de mis trabajos lo probé en una de mis empresas y se comenzaron a hacer tests como churros. 36 Qas por fin productivos. Module: signin Module: signin Goto '/home' Goto '/home' run signin ClickByText 'Sign In' run signin ClickByText 'Sign In' Type 'Login','martin' Type 'Login','martin' Goto '/invoices' Type 'Password','test' Goto '/invoices' Type 'Password','test' ClickButton 'New Invoice' ClickButton 'New Invoice' ClickButton 'Sign In' ClickButton 'Sign In' VeryfyText 'Create... VerifyText 'Welcome Martin' VeryfyText 'Create... VerifyText 'Welcome Martin'
  • 53. Test Driven Development ● Crear primero el test y después el código. ● Difícil de comenzar, cambio completo de mentalidad. ● Tras acostumbrarse, muy productivo. Ya que: ● Te obliga a enfrentarte al problema desde un punto de vista diferente. ● Tras acabar la funcionalidad, ya tienes los tests. ● Fácil acostumbrarse al empezar con bugs ● ¿Te pasan un bug? Test que lo reproduzca.
  • 54. Lo que ningún libro te contará sobre los tests
  • 56. ¡Sálvame! ● Iteraciones cada dos semanas. ● Demos a final de cada iteración. ● Despliegue en producción cada mes. ● Un departamento de QA que necesita software que funcione. ● Un departamento Comercial que quiere hacer demos a clientes. ¿Imposible?
  • 57. Integración Continua 1. Compilar 2. Ejecutar tests 3. Analizar código 4. Métricas Commits 7. Release SVN, CVS,.. CI 5. Desplegar 6. Tests Funcionales Servidor
  • 58. Integración Continua ● Cruise Control, Hudson, Apache Continuum, Bamboo, Team Foundation Server,... ● Para mi, el mejor es Hudson ● Instalación trivial ● Enormemente sencillo de utilizar ● Multitud de plug-ins
  • 65. Integración Continua ● Algunas buenas prácticas: ● La build debe ser muy rápida. Intentar siempre acortar el tiempo de build. ● No tener una única build. Separarlas para hacer el proceso más rápido. ● Si la build se rompe, hay que parar y arreglarla. ● Si hay QAs creando tests quizás convenga que tengan otra máquina. ● Los tests funcionales suelen tomar bastante tiempo. Build propia o idealmente otra máquina.
  • 66. Referencias ● http://www.agile-spain.com ● http://groups.google.es/group/agile-spain/files?pli=1 ● http://sites.google.com/site/axilmente/Home/recursos ● http://pragprog.com ● http://blog.objectmentor.com ● http://www.crisp.se/henrik.kniberg/ScrumAndXpFromTheTrenches.pdf ● http://www.infoq.com ● http://www.presionblogosferica.com ● http://www.javahispano.org