Boosting Your Testing Productivity with Groovy
-
Upload
james-williams -
Category
Technology
-
view
3.963 -
download
1
description
Transcript of Boosting Your Testing Productivity with Groovy
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