boosting your testing productivity with groovy

Post on 10-Nov-2014

3.964 Views

Category:

Technology

1 Downloads

Preview:

Click to see full reader

DESCRIPTION

 

TRANSCRIPT

Boosting your testing productivity with Groovy

James Williams, Spatial NetworksAndres Almiray, Oracle

BOF-5101

2008 JavaOneSM Conference | java.com.sun/javaone | 2

Have fun while programming tests

2008 JavaOneSM Conference | java.com.sun/javaone | 3

Agenda

What is GroovyGroovy + Testing FrameworksMocking with GroovyGrails TestingTesting DatabasesFunctional TestingResources

2008 JavaOneSM Conference | java.com.sun/javaone | 4

What is Groovy?

Groovy is an agile and dynamic language for the Java Virtual Machine Builds upon the strengths of Java but has additional power features inspired by languages like Python, Ruby & Smalltalk Makes modern programming features available to Java developers with almost-zero learning curveSupports Domain Specific Languages and other compact syntax so your code becomes easy to read and maintain

2008 JavaOneSM Conference | java.com.sun/javaone | 5

What is Groovy?

Increases developer productivity by reducing scaffolding code when developing web, GUI, database or console applications Simplifies testing by supporting unit testing and mocking out-of-the-box Seamlessly integrates with all existing Java objects and libraries Compiles straight to Java byte code so you can use it anywhere you can use Java

2008 JavaOneSM Conference | java.com.sun/javaone | 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() ) }}

2008 JavaOneSM Conference | java.com.sun/javaone | 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() ) }}

2008 JavaOneSM Conference | java.com.sun/javaone | 8

Equivalent HelloWorld 100% Groovy

class HelloWorld { String name def greet() { "Hello $name" }}

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

2008 JavaOneSM Conference | java.com.sun/javaone | 9

Groovy + Testing Frameworks

Any Groovy script may become a testcase• assert keyword enabled by default

Groovy provides a GroovyTestCase base class• Easier to test exception throwing code

Junit 4.x and TestNG ready, Groovy suports JDK5+ features• Annotations• Static imports• Enums

2008 JavaOneSM Conference | java.com.sun/javaone | 10

Testing exceptions in Java

public class JavaExceptionTestCase extends TestCase { public void testExceptionThrowingCode() { try { new MyService().doSomething(); fail("MyService.doSomething has been implemented"); }catch( UnsupportedOperationException expected ){ // everything is ok if we reach this block } }}

2008 JavaOneSM Conference | java.com.sun/javaone | 11

Testing exceptions in Groovy

class GroovyExceptionTestCase extends GroovyTestCase { void testExceptionThrowingCode() { shouldFail( UnsupportedOperationException ){ new MyService().doSomething() } }}

2008 JavaOneSM Conference | java.com.sun/javaone | 12

Alright, but how do I run Groovy tests?

Pick your favorite IDE! • IDEA• Eclipse• NetBeans

Command line tools• Ant• Gant• Maven• Good ol’ Groovy shell/console

2008 JavaOneSM Conference | java.com.sun/javaone | 13

Mocking with Groovy

Known mocking libraries• EasyMock – record/replay• Jmock – write expectations as you go

Use dynamic proxies as stubs

Use StubFor/MockFor• Groovy mocks rely on MetaClasses to do their magic• Caveat: use them only for Groovy classes

2008 JavaOneSM Conference | java.com.sun/javaone | 14

Groovy Mocks

2008 JavaOneSM Conference | java.com.sun/javaone | 15

Grails testing

Fairly similar to testing in core GroovyPlugins a plenty• easyb• Canoo WebTest• Selenium• DBUnit• jsUnit• Cobertura• JUnit is built in

2008 JavaOneSM Conference | java.com.sun/javaone | 16

Testing Taglibs

Can be tested with JunitNeed to extend several metaClasses that are not in testing scope• out• Encoders/Decoders

General format: className.tagName( [ attrs as Map], body)

2008 JavaOneSM Conference | java.com.sun/javaone | 17

Grails Taglibs

2008 JavaOneSM Conference | java.com.sun/javaone | 18

Testing Databases

DbUnit: a Junit extension for testing databases

Several options at your disposal• Old school – extend DatabaseTestCase• Flexible – use an IDataBaseTester implementation• Roll your own Database testcase

2008 JavaOneSM Conference | java.com.sun/javaone | 19

Inline XML dataset

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

class MyDBTestCase { IDatabaseTester db

@BeforeClass void init(){ db = new JdbcDatabaseTester("org.hsqldb.jdbcDriver", "jdbc:hsqldb:sample", "sa", "" ) 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() }}

2008 JavaOneSM Conference | java.com.sun/javaone | 20

Compile-checked dataset

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", "" ) 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() }}

2008 JavaOneSM Conference | java.com.sun/javaone | 21

Functional Testing

These tests usually require more setupNon-developers usually like to drive these testsDevelopers usually don’t like to code these testsNo Functional Testing => unhappy customer => unhappy developer

2008 JavaOneSM Conference | java.com.sun/javaone | 22

Groovy to the rescue!

[Any of the following] + Groovy = success!

Web testing -> Canoo WebTest

Swing testing -> FEST

BDD testing -> Easyb

2008 JavaOneSM Conference | java.com.sun/javaone | 23

FEST + Easyb

2008 JavaOneSM Conference | java.com.sun/javaone | 24

For More Information

http://groovy.codehaus.orghttp://grails.org

http://junit.orghttp://testng.orghttp://www.dbunit.orghttp://webtest.canoo.comhttp://easyb.orghttp://easytesting.org

http://jameswilliams.behttp://jroller.com/aalmiray

2008 JavaOneSM Conference | java.com.sun/javaone | 25

James Williams, Spatial NetworksAndres Almiray, Oracle

BOF-5101

top related