Your SlideShare is downloading. ×
0
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
Realizando Pruebas en la JVM con Velocidad y Eficacia
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Realizando Pruebas en la JVM con Velocidad y Eficacia

1,058

Published on

Realizando Pruebas en la JVM con Velocidad y Eficacia - SG09

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,058
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
11
Comments
0
Likes
2
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 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)‏
  • 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. <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. <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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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>
  • 27. Groovy Mocks
  • 28.  
  • 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>
  • 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>
  • 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>
  • 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>
  • 33. twitter: @aalmiray blog: http://jroller.com/aalmiray

×