0
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)‏
  <ul><li>Qué es  Groovy ? </li></ul><ul><li>Groovy  y frameworks de pruebas </li></ul><ul><li>Groovy  en la runtina diari...
  <ul><li>Groovy  es un lenguaje  ágil  y  dinámico  para la Máquina Virtual de Java </li></ul><ul><li>Basado en los conce...
  <ul><li>Soporta  Lenguajes de Dominio Específico  y otras características de sintaxis corta. </li></ul><ul><li>Simplific...
HelloWorld.java <ul><li>public class  HelloWorld { </li></ul><ul><li>String name; </li></ul><ul><li>public   void  setName...
HelloWorld.groovy <ul><li>public class  HelloWorld { </li></ul><ul><li>String name; </li></ul><ul><li>public   void  setNa...
Equivalente 100% Groovy <ul><li>class  HelloWorld { </li></ul><ul><li>String name </li></ul><ul><li>def  greet() {  &quot;...
1er Mantra <ul><li>Java es  Groovy ,  Groovy  es Java </li></ul><ul><li>Toda clase Java es una clase  Groovy , la proposic...
Cuidado con... <ul><li>La inicialización de arreglos no esta soportada, pero se puede convertir una Lista en un arreglo. <...
2ndo Mantra <ul><li>Groovy  es Java y  Groovy  NO es Java </li></ul><ul><li>Curva de aprendizaje prácticamente plana. </li...
Groovy  y los frameworks de Prueba <ul><li>Cualquier script de  Groovy  puede convertirse en un caso de prueba </li></ul><...
Groovy  en la rutina diaria <ul><li>Escribe menos dado que algunas palabras reservadas son opcionales </li></ul><ul><ul><u...
Acceso de propieades <ul><li>// Java </li></ul><ul><li>public   class  Bean { </li></ul><ul><li>private  String name; </li...
Mapas y Listas <ul><li>Map map = [:] </li></ul><ul><li>assert  map  instanceof  java.util.Map </li></ul><ul><li>map[ &quot...
Closures (1)‏ <ul><li>int  count = 0 </li></ul><ul><li>def  closure = {-> </li></ul><ul><li>0.upto(10) { count += it } </l...
Closures (2)‏ <ul><li>// un closure con 3 parámetros, el tercero es </li></ul><ul><li>// opcional dado que define un valor...
Transformaciones de AST <ul><li>import  java.text.SimpleDateFormat </li></ul><ul><li>class  Event { </li></ul><ul><li>@Del...
Transformaciones de AST <ul><li>@Singleton </li></ul><ul><li>@Lazy </li></ul><ul><li>@Delegate </li></ul><ul><li>@Immutabl...
Pero... cómo ejecuto las pruebas? <ul><li>Usa to IDE favorito </li></ul><ul><ul><ul><li>IDEA </li></ul></ul></ul><ul><ul><...
Probando excepciones en Java <ul><li>public class JavaExceptionTestCase  extends TestCase  { </li></ul><ul><li>public void...
Probando excepciones en  Groovy <ul><li>class   GroovyExceptionTestCase  extends GroovyTestCase  { </li></ul><ul><li>void ...
Mocking <ul><li>Groovy  no tiene problemas con librerías Java </li></ul><ul><ul><ul><li>EasyMock – record/replay </li></ul...
Proxies Dinámicos
 
StubFor/MockFor <ul><li>ejecutor – colaborador </li></ul><ul><li>mocks/stubs definen expectativas en los colaboradores </l...
Groovy Mocks
 
Procesando XML <ul><li>DbUnit: extensión de Junit para verificar bases de datos </li></ul><ul><li>Existen varias opciones ...
XML en linea <ul><li>import org.dbunit.* </li></ul><ul><li>import org.junit.* </li></ul><ul><li>class MyDBTestCase { </li>...
XML verificado por el compilador <ul><li>import org.dbunit.* </li></ul><ul><li>import org.junit.* </li></ul><ul><li>Import...
Información Adicional <ul><li>http://groovy.codehaus.org </li></ul><ul><li>http://junit.org </li></ul><ul><li>http://testn...
twitter: @aalmiray blog: http://jroller.com/aalmiray
Upcoming SlideShare
Loading in...5
×

Realizando Pruebas en la JVM con Velocidad y Eficacia

1,066

Published on

Realizando Pruebas en la JVM con Velocidad y Eficacia - SG09

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,066
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
11
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Transcript of "Realizando Pruebas en la JVM con Velocidad y Eficacia"

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

    Clipping is a handy way to collect important slides you want to go back to later.

×