grails-profiles/base/commands/test-app.groovy (82 lines of code) (raw):

import org.grails.io.watch.* description("Runs the applications tests") { usage "grails test-app [TEST NAME]" completer TestsCompleter synonyms 'test' argument name:"Test Name", description:"The name of the test to run (optional)", required:false flag name:'debug-jvm', description:"Starts the JVM in debug mode allowing attachment of a remote debugger" flag name:'unit', description:"Run unit tests (test target)" flag name:'integration', description:"Run integration tests (integrationTest target)" flag name:'clean', description:"Re-run all tests (cleanTest cleanIntegrationTest target)" flag name:'continuous', description:"Monitor the project for changes and reruns tests automatically on each change" } // configure environment to test is not specified if(!commandLine.isEnvironmentSet()) { System.setProperty('grails.env', 'test') } else { System.setProperty('grails.env', commandLine.environment) } // add test.single argument if specified def testsFilter = commandLine.remainingArgs.collect { "--tests $it".toString() }.join(' ')?.trim() boolean debugJvm = flag('debug-jvm') def handleTestPhase = { targetName -> def args = [] if(flag('clean')) { args << "clean${targetName.capitalize()}" } args << targetName if(testsFilter) { args << testsFilter } // add debug flag if present if(debugJvm) { args << "--debug-jvm" } args } def gradleArgs = [] boolean executeUnitTests = flag('unit') || !flag('integration') if(executeUnitTests) { gradleArgs.addAll handleTestPhase('test') } boolean hasIntegrationTests = file("src/integration-test").isDirectory() boolean executeIntegrationTests = hasIntegrationTests && (flag('integration') || !flag('unit')) if(executeIntegrationTests) { gradleArgs.addAll handleTestPhase('integrationTest') } runTests = { List args -> def additionalArguments = [] commandLine.systemProperties.each { key, value -> additionalArguments << "-D${key}=$value".toString() } additionalArguments << "-Dgrails.run.active=true" try { gradle."${args.join(' ')}"(*additionalArguments) addStatus "Tests PASSED" return true } catch(e) { console.error "Tests FAILED", "Test execution failed" return false } } if(flag('continuous')) { def watcher = new DirectoryWatcher() def ext = ['groovy', 'java'] watcher.addWatchDirectory( file("grails-app"), ext) watcher.addWatchDirectory( file("src/main/groovy"), ext) watcher.addWatchDirectory( file("src/test/groovy"), ext) watcher.addWatchDirectory( file("src/integration-test/groovy"), ext) watcher.addListener( new FileExtensionFileChangeListener(ext) { void onChange(File file, List<String> extensions) { console.addStatus "File ${projectPath(file)} changed. Running tests..." runTests(gradleArgs) } void onNew(File file, List<String> extensions) { console.addStatus "File ${projectPath(file)} changed. Running tests..." runTests(gradleArgs) } }) watcher.sleepTime = 0 watcher.start() console.addStatus "Started continuous test runner. Monitoring files for changes..." } else { runTests(gradleArgs) }