import grails.util.WebTest class TestSuite extends WebTest { static void main(args) { new TestSuite().runTests(args) } void suite() { def scanner = ant.fileScanner { fileset(dir: WEBTEST_DIR, includes:'**/*Tests.groovy') } for (file in scanner) { def test = getClass().classLoader.parseClass(file).newInstance() test.ant = ant test.suite() } } } import org.codehaus.groovy.grails.commons.ConfigurationHolder class @{name}Tests extends org.grails.plugins.webtest.WebTestCase { void setUp(){ config(easyajax:true) } void tearDown(){ invoke('/') } void test@{name}Thing() { invoke('/') alwaysPass() if(ConfigurationHolder.config == null){ throw new RuntimeException('Config was not loaded!') } groovy """ import junit.framework.Assert import org.mysite.* Book.executeUpdate('Delete from Book'); Assert.assertNotNull new Book().save() Assert.assertEquals 1, Book.count() """ } } package steps import com.canoo.webtest.steps.Step import org.apache.log4j.Logger public class AlwaysPassStep extends Step { private static final Logger LOG = Logger.getLogger(AlwaysPassStep.class); public void doExecute() { LOG.info('Test custom step called!') } } import org.codehaus.groovy.grails.commons.ConfigurationHolder class @{name}Tests extends grails.util.WebTest { void setUp(){ config(easyajax:true) } void tearDown(){ invoke('/') } void testOldWebtestMethod(){ webtest('some test name'){ invoke('/') } } void test@{name}Thing() { invoke('/') if(ConfigurationHolder.config == null){ throw new RuntimeException('Config was not loaded!') } } } All webtests should have passsed.