SlideShare una empresa de Scribd logo
1 de 33
Realizando Pruebas
en la JVM con Velocidad
y Eficacia
                     Andres Almiray
Incrementar la productividad al
                        realizar pruebas en la JVM
                        ( y por qué no?, también la
                         producción de endorfinas)




SG09 Andres Almiray                                     2
• Qué es Groovy?
    • Groovy y frameworks de pruebas
    • Groovy en la runtina diaria
    • Mocks
    • Procesando XML
    • Información adicional




SG09 Andres Almiray                    3
• Groovy es un lenguaje ágil y dinámico
      para la Máquina Virtual de Java
    • Basado en los conceptos base del lenguaje
      Java, incluye características inspiradas en
      otros lenguajes como Python, Smalltalk y
      Ruby
    • Habilita características de programación
      modernas con una curva de aprendizaje
      plana para desarrolladores Java

SG09 Andres Almiray                            4
• Soporta Lenguajes de Dominio
      Específico y otras características de
      sintaxis corta.
    • Simplifica el ciclo de pruebas dado que
      soporta pruebas unitarias y mocking desde
      el inicio.




SG09 Andres Almiray                           5
HelloWorld.java
    public class HelloWorld {
       String name;
          public void setName(String name)
          { this.name = name; }
          public String getName(){ return name; }
          public String greet()
          { return “Hello “+ name; }
          public static void main(String args[]){
             HelloWorld helloWorld = new HelloWorld();
             helloWorld.setName(“Groovy”);
             System.err.println( helloWorld.greet() );
          }
    }




SG09 Andres Almiray
HelloWorld.groovy
    public class HelloWorld {
       String name;
          public void setName(String name)
          { this.name = name; }
          public String getName(){ return name; }
          public String greet()
          { return “Hello “+ name; }
          public static void main(String args[]){
             HelloWorld helloWorld = new HelloWorld();
             helloWorld.setName(“Groovy”);
             System.err.println( helloWorld.greet() );
          }
    }




SG09 Andres Almiray
Equivalente 100% Groovy
    class HelloWorld {
       String name
       def greet() { "Hello $name" }
    }

    def helloWorld = new HelloWorld(name:"Groovy")
    println helloWorld.greet()




SG09 Andres Almiray
1er Mantra
                  Java es Groovy, Groovy es Java
                          Groovy

    • Toda clase Java es una clase Groovy, la
                                     Groovy
      proposición inversa también es verdadera.
    • Groovy tiene el mismo modelo de memoria
      y seguridad que Java.
    • El 98% de código Java es código Groovy,
                                        Groovy
      en casi todo los casos basta renombrar
      *.java por *.groovy
SG09 Andres Almiray
Cuidado con...
    • La inicialización de arreglos no esta
      soportada, pero se puede convertir una
      Lista en un arreglo.
    • Clases internas no soportadas (excepto en
      Groovy 1.7beta1 donde solo existe soporte
      para clases anónimas).




SG09 Andres Almiray
2ndo Mantra
            Groovy es Java y Groovy NO es Java

    • Curva de aprendizaje prácticamente plana.
    • Empieza con sintaxis Java, emigra a
      sintaxis Groovy conforme pase el tiempo.
    • Groovy provee closures, meta
      programación, nuevos operadores,
      sobrecarga de operadores, sintaxis nativa
      para Mapas y Listas, tipado opcional, etc...
SG09 Andres Almiray
Groovy y los frameworks de Prueba
    • Cualquier script de Groovy puede
      convertirse en un caso de prueba
                • assert habilitado desde el inicio
    • Groovy provee GroovyTestCase como
      clase base
    • Soporte de Junit 3.x/4.x y TestNG.
    • Groovy permite el uso de características de
      JDK5+
                • anotaciones, enums, tipos genéricos

SG09 Andres Almiray
Groovy en la rutina diaria
    • Escribe menos dado que algunas palabras
      reservadas son opcionales
                • public, private, protected, return
    • Azúcar sintáctica para uso de propiedades
    • Sintaxis nativa para Mapas y Listas
    • Closures
    • Transformaciones de AST (Arbol de
      Sintaxis Abstracto) meta programación
      en tiempo de compilación
SG09 Andres Almiray
Acceso de propieades
    // Java
    public class Bean {
      private String name;
      public void setName(String n) { name = n; }
      public String getName() { return name; }
    }

    // Groovy
    Bean bean = new Bean(name: “Duke”)
    assert bean.name == “Duke”
    bean.name = “Tux”
    assert bean.name == “Tux”
    assert bean.name == bean.getName()




SG09 Andres Almiray
Mapas y Listas

    Map map = [:]
    assert map instanceof java.util.Map
    map["key1"] = "value1"
    map.key2 = "value2"
    assert map.size() == 2
    assert map.key1 == "value1"
    assert map["key2"] == "value2"

    List list = []
    assert list instanceof java.util.List
    list.add("One")
    list << "Two"
    assert list.size() == 2
    assert ["One","Two"] == list


SG09 Andres Almiray
Closures (1)
    int count = 0
    def closure = {->
      0.upto(10) { count += it }
    }
    closure()
    assert count == (10*11)/2

    def runnable = closure as Runnable
    assert runnable instanceof java.lang.Runnable
    count = 0
    runnable.run()
    assert count == (10*11)/2




SG09 Andres Almiray
Closures (2)
    // un closure con 3 parámetros, el tercero es
    // opcional dado que define un valor por omisión
    def getSlope = { x, y, b = 0 ->
       println "x:${x} y:${y} b:${b}"
       (y - b) / x
    }

    assert 1 == getSlope( 2, 2 )
    def getSlopeX = getSlope.curry(5)
    assert 1 == getSlopeX(5)
    assert 0 == getSlopeX(2.5,2.5)
    // prints
    // x:2 y:2 b:0
    // x:5 y:5 b:0
    // x:5 y:2.5 b:2.5




SG09 Andres Almiray
Transformaciones de AST

    import java.text.SimpleDateFormat
    class Event {
        @Delegate Date when
        String title, url
    }
    def df = new SimpleDateFormat("dd/MM/yyyy")
    def sg09 = new Event(title: "SG 09",
       url: "http://www.sg.com.mx/sg09/",
       when: df.parse("28/09/2009"))
    def so2gx = new Event(title: "SpringOne2GX",
       url: "http://www.springone2gx.com/",
       when: df.parse("19/10/2009"))

    assert sg09.before(so2gx.when)


SG09 Andres Almiray
Transformaciones de AST
    •@Singleton
    •@Lazy
    •@Delegate
    •@Immutable
    •@Bindable
    •@Newify
    •@Category/@Mixin
    •@PackageScope


SG09 Andres Almiray
Pero... cómo ejecuto las pruebas?
    • Usa to IDE favorito
                • IDEA
                • Eclipse
                • NetBeans
    • Herramientas de línea de comando
                • Ant
                • Gant
                • Maven
                • Gradle
                • GroovyShell y GroovyConsole

SG09 Andres Almiray
Probando excepciones en Java
    public class JavaExceptionTestCase extends TestCase {
       public void testExceptionThrowingCode() {
             try {
                new MyService().doSomething();
                fail("MyService.doSomething has been implemented");
             }catch( UnsupportedOperationException expected ){
                // todo esta BIEN si llegamos a este punto!
             }
         }
    }




SG09 Andres Almiray
Probando excepciones en Groovy
    class GroovyExceptionTestCase extends GroovyTestCase {
       void testExceptionThrowingCode() {
          shouldFail( UnsupportedOperationException ){
             new MyService().doSomething()
          }
       }
    }




SG09 Andres Almiray
Mocking
    • Groovy no tiene problemas con librerías
      Java
                • EasyMock – record/replay
                • JMock – define expectativas en el camino
                • Mockito – el recién llegado a la fiesta
    • Proxis dinámicos
    • StubFor/MockFor




SG09 Andres Almiray
Proxies Dinámicos




SG09 Andres Almiray
SG09 Andres Almiray
StubFor/MockFor

    • ejecutor – colaborador
    • mocks/stubs definen expectativas en los
      colaboradores
    • mocks son estrictos, las expectativas deben ser
      ejecutadas en orden y cardinalidad exacta
    • stubs son mas laxos, las expectativas pueden ser
      ejecutadas en cualquier orden pero la
      cardinalidad debe ser respetada.
    • ALERTA: usar solo cuando el ejecutor es código
      Groovy


SG09 Andres Almiray
Groovy Mocks




SG09 Andres Almiray
SG09 Andres Almiray
Procesando XML
    • DbUnit: extensión de Junit para verificar
      bases de datos
    • Existen varias opciones
          – Típica: extender de DatabaseTestCase
          – Flexible: usar un IDatabaseTester compuesto
          – BYOT: (Build Your Own Testcase)




SG09 Andres Almiray
XML en linea

    import org.dbunit.*
    import org.junit.*

    class MyDBTestCase {
       IDatabaseTester db

        @BeforeClass void init(){
           db = new JdbcDatabaseTester("org.hsqldb.jdbcDriver",
                 "jdbc:hsqldb:sample", "sa", "" )
           // insert table schema
           def dataset = """
           <dataset>
              <company name="Acme"/>
              <employee name="Duke" company_id="1">
           </dataset>
           """
           db.dataset = new FlatXmlDataSet( new StringReader(dataset) )
           db.onSetUp()
        }

        @AfterClass void exit() { db.onTearDown() }
    }


SG09 Andres Almiray
XML verificado por el compilador

    import org.dbunit.*
    import org.junit.*
    Import groovy.xml.MarkupBuilder

    class MyDBTestCase {
       IDatabaseTester db

        @BeforeClass void init(){
           db = new JdbcDatabaseTester("org.hsqldb.jdbcDriver",
                 "jdbc:hsqldb:sample", "sa", "" )
           // insert table schema
           def dataset = new MarkupBuilder().dataset {
              company( name: Acme )
              employee( name: "Duke", company_id: 1 )
           }
           db.dataset = new FlatXmlDataSet( new StringReader(dataset) )
           db.onSetUp()
        }

        @AfterClass void exit() { db.onTearDown() }
    }



SG09 Andres Almiray
Información Adicional
    http://groovy.codehaus.org


    http://junit.org
    http://testng.org
    http://dbunit.org


    http://groovy.dzone.com
    http://gr8forums.org

SG09 Andres Almiray
twitter: @aalmiray
blog: http://jroller.com/aalmiray

Más contenido relacionado

La actualidad más candente

Creación de aplicaciones web con Node.js y Express
Creación de aplicaciones web con Node.js y ExpressCreación de aplicaciones web con Node.js y Express
Creación de aplicaciones web con Node.js y Express
betabeers
 
Linux basico-8.PDF
Linux basico-8.PDFLinux basico-8.PDF
Linux basico-8.PDF
ULEAM
 

La actualidad más candente (16)

Creación de aplicaciones web con Node.js y Express
Creación de aplicaciones web con Node.js y ExpressCreación de aplicaciones web con Node.js y Express
Creación de aplicaciones web con Node.js y Express
 
PCJ Sesión 9: Threads
PCJ Sesión 9: ThreadsPCJ Sesión 9: Threads
PCJ Sesión 9: Threads
 
Introducción a Kotlin para desarrolladores Java
Introducción a Kotlin para desarrolladores JavaIntroducción a Kotlin para desarrolladores Java
Introducción a Kotlin para desarrolladores Java
 
Componentes del E-studio
Componentes del E-studioComponentes del E-studio
Componentes del E-studio
 
Mongo db course administration
Mongo db course   administrationMongo db course   administration
Mongo db course administration
 
Multitarea e hilos en java con ejemplos
Multitarea e hilos en java con ejemplosMultitarea e hilos en java con ejemplos
Multitarea e hilos en java con ejemplos
 
Linux basico-8.PDF
Linux basico-8.PDFLinux basico-8.PDF
Linux basico-8.PDF
 
Introduccion lenguaje java
Introduccion lenguaje javaIntroduccion lenguaje java
Introduccion lenguaje java
 
Programa Java que gestiona los productos que comercializan varios viveros
Programa Java que gestiona los productos que comercializan varios viverosPrograma Java que gestiona los productos que comercializan varios viveros
Programa Java que gestiona los productos que comercializan varios viveros
 
Hilos – threads en java
Hilos – threads   en javaHilos – threads   en java
Hilos – threads en java
 
Seguridad en PDF - Adobe ¬¬
Seguridad en PDF - Adobe ¬¬Seguridad en PDF - Adobe ¬¬
Seguridad en PDF - Adobe ¬¬
 
Csi: siempre quisiste ser forense
Csi: siempre quisiste ser forenseCsi: siempre quisiste ser forense
Csi: siempre quisiste ser forense
 
Administración de memoria en java
Administración de memoria en javaAdministración de memoria en java
Administración de memoria en java
 
JRuby Al Rescate J2EE
JRuby Al Rescate J2EEJRuby Al Rescate J2EE
JRuby Al Rescate J2EE
 
S6-POO-3.2 Contenedores Especiales
S6-POO-3.2 Contenedores EspecialesS6-POO-3.2 Contenedores Especiales
S6-POO-3.2 Contenedores Especiales
 
Hilos En Java
Hilos En JavaHilos En Java
Hilos En Java
 

Destacado

Denis Lebedev, Swift
Denis  Lebedev, SwiftDenis  Lebedev, Swift
Denis Lebedev, Swift
Yandex
 

Destacado (20)

A Journey From Objective C to Swift - Chromeinfotech
A Journey From Objective C to Swift - ChromeinfotechA Journey From Objective C to Swift - Chromeinfotech
A Journey From Objective C to Swift - Chromeinfotech
 
Bringing Swift into your Objective-C Projects
Bringing Swift into your Objective-C ProjectsBringing Swift into your Objective-C Projects
Bringing Swift into your Objective-C Projects
 
Mobile Day - Swift y Objective-C
Mobile Day - Swift y Objective-CMobile Day - Swift y Objective-C
Mobile Day - Swift y Objective-C
 
Introducción a Swift
Introducción a SwiftIntroducción a Swift
Introducción a Swift
 
Swift
SwiftSwift
Swift
 
Swift vs Objective-C
Swift vs Objective-CSwift vs Objective-C
Swift vs Objective-C
 
Hola Swift
Hola SwiftHola Swift
Hola Swift
 
iOS NSAgora #3: Objective-C vs. Swift
iOS NSAgora #3: Objective-C vs. SwiftiOS NSAgora #3: Objective-C vs. Swift
iOS NSAgora #3: Objective-C vs. Swift
 
Tutorial de Lenguaje de Programación Swift
Tutorial de Lenguaje de Programación SwiftTutorial de Lenguaje de Programación Swift
Tutorial de Lenguaje de Programación Swift
 
Swift sin hype y su importancia en el 2017
 Swift sin hype y su importancia en el 2017  Swift sin hype y su importancia en el 2017
Swift sin hype y su importancia en el 2017
 
Apple ios
Apple iosApple ios
Apple ios
 
NSCoder Swift - ¿Debo Aprender Swift?
NSCoder Swift - ¿Debo Aprender Swift?NSCoder Swift - ¿Debo Aprender Swift?
NSCoder Swift - ¿Debo Aprender Swift?
 
Swift
SwiftSwift
Swift
 
Stanfy MadCode Meetup #11: Why do you need to switch from Obj-C to Swift, or ...
Stanfy MadCode Meetup #11: Why do you need to switch from Obj-C to Swift, or ...Stanfy MadCode Meetup #11: Why do you need to switch from Obj-C to Swift, or ...
Stanfy MadCode Meetup #11: Why do you need to switch from Obj-C to Swift, or ...
 
Denis Lebedev, Swift
Denis  Lebedev, SwiftDenis  Lebedev, Swift
Denis Lebedev, Swift
 
Introducción a swift
Introducción a swiftIntroducción a swift
Introducción a swift
 
Lenguaje objective c
Lenguaje objective cLenguaje objective c
Lenguaje objective c
 
Introduction to Swift programming language.
Introduction to Swift programming language.Introduction to Swift programming language.
Introduction to Swift programming language.
 
A swift introduction to Swift
A swift introduction to SwiftA swift introduction to Swift
A swift introduction to Swift
 
Presentacion Xcode
Presentacion XcodePresentacion Xcode
Presentacion Xcode
 

Similar a Realizando pruebas en la JVM con velocidad y eficacia

Cambia la forma de desarrollar tus aplicaciones web con groovy y grails
Cambia la forma de desarrollar tus aplicaciones web con groovy y grailsCambia la forma de desarrollar tus aplicaciones web con groovy y grails
Cambia la forma de desarrollar tus aplicaciones web con groovy y grails
Fátima Casaú Pérez
 

Similar a Realizando pruebas en la JVM con velocidad y eficacia (20)

Introduccion A Groovy
Introduccion A GroovyIntroduccion A Groovy
Introduccion A Groovy
 
grails.org.mx Primera Reunion
grails.org.mx Primera Reuniongrails.org.mx Primera Reunion
grails.org.mx Primera Reunion
 
Introducción a Groovy
Introducción a GroovyIntroducción a Groovy
Introducción a Groovy
 
Ruby para Java Developers
Ruby para Java DevelopersRuby para Java Developers
Ruby para Java Developers
 
Gwt III - Avanzado
Gwt III - AvanzadoGwt III - Avanzado
Gwt III - Avanzado
 
Groovy&Grails: Cambia la forma de desarrollar tus aplicaciones web
Groovy&Grails: Cambia la forma de desarrollar tus aplicaciones webGroovy&Grails: Cambia la forma de desarrollar tus aplicaciones web
Groovy&Grails: Cambia la forma de desarrollar tus aplicaciones web
 
Cambia la forma de desarrollar tus aplicaciones web con groovy y grails
Cambia la forma de desarrollar tus aplicaciones web con groovy y grailsCambia la forma de desarrollar tus aplicaciones web con groovy y grails
Cambia la forma de desarrollar tus aplicaciones web con groovy y grails
 
Presentación Java Evolution - GlobalLogic Club
Presentación Java Evolution - GlobalLogic ClubPresentación Java Evolution - GlobalLogic Club
Presentación Java Evolution - GlobalLogic Club
 
Introducción a groovy & grails
Introducción a groovy & grailsIntroducción a groovy & grails
Introducción a groovy & grails
 
Jano Gonzalez - jruby
Jano Gonzalez - jrubyJano Gonzalez - jruby
Jano Gonzalez - jruby
 
JRuby: Ruby en un mundo enterprise
JRuby: Ruby en un mundo enterpriseJRuby: Ruby en un mundo enterprise
JRuby: Ruby en un mundo enterprise
 
JRuby al Rescate de J2EE
JRuby al Rescate de J2EEJRuby al Rescate de J2EE
JRuby al Rescate de J2EE
 
JRuby: Ruby en un mundo enterprise RubyConf Uruguay 2011
JRuby: Ruby en un mundo enterprise RubyConf Uruguay 2011JRuby: Ruby en un mundo enterprise RubyConf Uruguay 2011
JRuby: Ruby en un mundo enterprise RubyConf Uruguay 2011
 
Grails
GrailsGrails
Grails
 
Taller Groovy
Taller GroovyTaller Groovy
Taller Groovy
 
HackDay Java 9 Spanish version
HackDay Java 9 Spanish versionHackDay Java 9 Spanish version
HackDay Java 9 Spanish version
 
Desarrollo web en Nodejs con Pillars por Chelo Quilón
Desarrollo web en Nodejs con Pillars por Chelo QuilónDesarrollo web en Nodejs con Pillars por Chelo Quilón
Desarrollo web en Nodejs con Pillars por Chelo Quilón
 
Java 7- Java Day Guatemala
Java 7- Java Day GuatemalaJava 7- Java Day Guatemala
Java 7- Java Day Guatemala
 
Introduccion a grails en Campusparty
Introduccion a grails en CampuspartyIntroduccion a grails en Campusparty
Introduccion a grails en Campusparty
 
Java argumentos variables
Java argumentos variablesJava argumentos variables
Java argumentos variables
 

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

redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
nicho110
 

Último (12)

Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
 
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
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXI
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
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
 
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
 
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
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptx
 
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
 

Realizando pruebas en la JVM con velocidad y eficacia

  • 1. Realizando Pruebas en la JVM con Velocidad y Eficacia Andres Almiray
  • 2. Incrementar la productividad al realizar pruebas en la JVM ( y por qué no?, también la producción de endorfinas) SG09 Andres Almiray 2
  • 3. • Qué es Groovy? • Groovy y frameworks de pruebas • Groovy en la runtina diaria • Mocks • Procesando XML • Información adicional SG09 Andres Almiray 3
  • 4. • Groovy es un lenguaje ágil y dinámico para la Máquina Virtual de Java • Basado en los conceptos base del lenguaje Java, incluye características inspiradas en otros lenguajes como Python, Smalltalk y Ruby • Habilita características de programación modernas con una curva de aprendizaje plana para desarrolladores Java SG09 Andres Almiray 4
  • 5. • Soporta Lenguajes de Dominio Específico y otras características de sintaxis corta. • Simplifica el ciclo de pruebas dado que soporta pruebas unitarias y mocking desde el inicio. SG09 Andres Almiray 5
  • 6. HelloWorld.java public class HelloWorld { String name; public void setName(String name) { this.name = name; } public String getName(){ return name; } public String greet() { return “Hello “+ name; } public static void main(String args[]){ HelloWorld helloWorld = new HelloWorld(); helloWorld.setName(“Groovy”); System.err.println( helloWorld.greet() ); } } SG09 Andres Almiray
  • 7. HelloWorld.groovy public class HelloWorld { String name; public void setName(String name) { this.name = name; } public String getName(){ return name; } public String greet() { return “Hello “+ name; } public static void main(String args[]){ HelloWorld helloWorld = new HelloWorld(); helloWorld.setName(“Groovy”); System.err.println( helloWorld.greet() ); } } SG09 Andres Almiray
  • 8. Equivalente 100% Groovy class HelloWorld { String name def greet() { "Hello $name" } } def helloWorld = new HelloWorld(name:"Groovy") println helloWorld.greet() SG09 Andres Almiray
  • 9. 1er Mantra Java es Groovy, Groovy es Java Groovy • Toda clase Java es una clase Groovy, la Groovy proposición inversa también es verdadera. • Groovy tiene el mismo modelo de memoria y seguridad que Java. • El 98% de código Java es código Groovy, Groovy en casi todo los casos basta renombrar *.java por *.groovy SG09 Andres Almiray
  • 10. Cuidado con... • La inicialización de arreglos no esta soportada, pero se puede convertir una Lista en un arreglo. • Clases internas no soportadas (excepto en Groovy 1.7beta1 donde solo existe soporte para clases anónimas). SG09 Andres Almiray
  • 11. 2ndo Mantra Groovy es Java y Groovy NO es Java • Curva de aprendizaje prácticamente plana. • Empieza con sintaxis Java, emigra a sintaxis Groovy conforme pase el tiempo. • Groovy provee closures, meta programación, nuevos operadores, sobrecarga de operadores, sintaxis nativa para Mapas y Listas, tipado opcional, etc... SG09 Andres Almiray
  • 12. Groovy y los frameworks de Prueba • Cualquier script de Groovy puede convertirse en un caso de prueba • assert habilitado desde el inicio • Groovy provee GroovyTestCase como clase base • Soporte de Junit 3.x/4.x y TestNG. • Groovy permite el uso de características de JDK5+ • anotaciones, enums, tipos genéricos SG09 Andres Almiray
  • 13. Groovy en la rutina diaria • Escribe menos dado que algunas palabras reservadas son opcionales • public, private, protected, return • Azúcar sintáctica para uso de propiedades • Sintaxis nativa para Mapas y Listas • Closures • Transformaciones de AST (Arbol de Sintaxis Abstracto) meta programación en tiempo de compilación SG09 Andres Almiray
  • 14. Acceso de propieades // Java public class Bean { private String name; public void setName(String n) { name = n; } public String getName() { return name; } } // Groovy Bean bean = new Bean(name: “Duke”) assert bean.name == “Duke” bean.name = “Tux” assert bean.name == “Tux” assert bean.name == bean.getName() SG09 Andres Almiray
  • 15. Mapas y Listas Map map = [:] assert map instanceof java.util.Map map["key1"] = "value1" map.key2 = "value2" assert map.size() == 2 assert map.key1 == "value1" assert map["key2"] == "value2" List list = [] assert list instanceof java.util.List list.add("One") list << "Two" assert list.size() == 2 assert ["One","Two"] == list SG09 Andres Almiray
  • 16. Closures (1) int count = 0 def closure = {-> 0.upto(10) { count += it } } closure() assert count == (10*11)/2 def runnable = closure as Runnable assert runnable instanceof java.lang.Runnable count = 0 runnable.run() assert count == (10*11)/2 SG09 Andres Almiray
  • 17. Closures (2) // un closure con 3 parámetros, el tercero es // opcional dado que define un valor por omisión def getSlope = { x, y, b = 0 -> println "x:${x} y:${y} b:${b}" (y - b) / x } assert 1 == getSlope( 2, 2 ) def getSlopeX = getSlope.curry(5) assert 1 == getSlopeX(5) assert 0 == getSlopeX(2.5,2.5) // prints // x:2 y:2 b:0 // x:5 y:5 b:0 // x:5 y:2.5 b:2.5 SG09 Andres Almiray
  • 18. Transformaciones de AST import java.text.SimpleDateFormat class Event { @Delegate Date when String title, url } def df = new SimpleDateFormat("dd/MM/yyyy") def sg09 = new Event(title: "SG 09", url: "http://www.sg.com.mx/sg09/", when: df.parse("28/09/2009")) def so2gx = new Event(title: "SpringOne2GX", url: "http://www.springone2gx.com/", when: df.parse("19/10/2009")) assert sg09.before(so2gx.when) SG09 Andres Almiray
  • 19. Transformaciones de AST •@Singleton •@Lazy •@Delegate •@Immutable •@Bindable •@Newify •@Category/@Mixin •@PackageScope SG09 Andres Almiray
  • 20. Pero... cómo ejecuto las pruebas? • Usa to IDE favorito • IDEA • Eclipse • NetBeans • Herramientas de línea de comando • Ant • Gant • Maven • Gradle • GroovyShell y GroovyConsole SG09 Andres Almiray
  • 21. Probando excepciones en Java public class JavaExceptionTestCase extends TestCase { public void testExceptionThrowingCode() { try { new MyService().doSomething(); fail("MyService.doSomething has been implemented"); }catch( UnsupportedOperationException expected ){ // todo esta BIEN si llegamos a este punto! } } } SG09 Andres Almiray
  • 22. Probando excepciones en Groovy class GroovyExceptionTestCase extends GroovyTestCase { void testExceptionThrowingCode() { shouldFail( UnsupportedOperationException ){ new MyService().doSomething() } } } SG09 Andres Almiray
  • 23. Mocking • Groovy no tiene problemas con librerías Java • EasyMock – record/replay • JMock – define expectativas en el camino • Mockito – el recién llegado a la fiesta • Proxis dinámicos • StubFor/MockFor SG09 Andres Almiray
  • 26. StubFor/MockFor • ejecutor – colaborador • mocks/stubs definen expectativas en los colaboradores • mocks son estrictos, las expectativas deben ser ejecutadas en orden y cardinalidad exacta • stubs son mas laxos, las expectativas pueden ser ejecutadas en cualquier orden pero la cardinalidad debe ser respetada. • ALERTA: usar solo cuando el ejecutor es código Groovy SG09 Andres Almiray
  • 29. Procesando XML • DbUnit: extensión de Junit para verificar bases de datos • Existen varias opciones – Típica: extender de DatabaseTestCase – Flexible: usar un IDatabaseTester compuesto – BYOT: (Build Your Own Testcase) SG09 Andres Almiray
  • 30. XML en linea import org.dbunit.* import org.junit.* class MyDBTestCase { IDatabaseTester db @BeforeClass void init(){ db = new JdbcDatabaseTester("org.hsqldb.jdbcDriver", "jdbc:hsqldb:sample", "sa", "" ) // insert table schema def dataset = """ <dataset> <company name="Acme"/> <employee name="Duke" company_id="1"> </dataset> """ db.dataset = new FlatXmlDataSet( new StringReader(dataset) ) db.onSetUp() } @AfterClass void exit() { db.onTearDown() } } SG09 Andres Almiray
  • 31. XML verificado por el compilador import org.dbunit.* import org.junit.* Import groovy.xml.MarkupBuilder class MyDBTestCase { IDatabaseTester db @BeforeClass void init(){ db = new JdbcDatabaseTester("org.hsqldb.jdbcDriver", "jdbc:hsqldb:sample", "sa", "" ) // insert table schema def dataset = new MarkupBuilder().dataset { company( name: Acme ) employee( name: "Duke", company_id: 1 ) } db.dataset = new FlatXmlDataSet( new StringReader(dataset) ) db.onSetUp() } @AfterClass void exit() { db.onTearDown() } } SG09 Andres Almiray
  • 32. Información Adicional http://groovy.codehaus.org http://junit.org http://testng.org http://dbunit.org http://groovy.dzone.com http://gr8forums.org SG09 Andres Almiray