Can I run a single unit test from the command line for a Grails project?
Solution 1
Possibilities of things that might be wrong with your setup:
Your command order is incorrect. What works for me is:
grails test-app -unit Foo
(where my test class isFooTests.groovy
)You aren't explicitly importing
grails.test.GrailsUnitTestCase
.I had some problems with it recognizing my tests when I didn't import this. When I was extending
GroovyTestCase
, things seemed to work normally.
Working Example
Here's a sample set of tests that work for me. Perhaps you can spot some differences between them and your tests?
Note: These are all run with the testing
plugin installed
test/unit/FooTests.groovy
import grails.test.GrailsUnitTestCase
class FooTest extends GrailsUnitTestCase {
void testFoo() {
assert true
}
void testBar() {
assert true
}
}
test/unit/BarTests.groovy
import grails.test.GrailsUnitTestCase
class BarTest extends GrailsUnitTestCase {
void testFoo() {
assert true
}
void testBar() {
assert true
}
}
test/unit/my/pkg/BazTests.groovy
package my.pkg
import grails.test.GrailsUnitTestCase
class BazTest extends GrailsUnitTestCase {
void testFoo() {
assert true
}
void testBar() {
assert true
}
}
command: all unit tests
$ grails test-app -unit
...
Starting unit test phase ...
-------------------------------------------------------
Running 6 unit tests...
Running test my.pkg.BazTest...PASSED
Running test FooTest...PASSED
Running test BarTest...PASSED
Tests Completed in 847ms ...
-------------------------------------------------------
Tests passed: 6
Tests failed: 0
-------------------------------------------------------
...
Tests PASSED - view reports in target/test-reports
command: Foo unit tests
$ grails test-app -unit Foo
...
Starting unit test phase ...
-------------------------------------------------------
Running 1 unit test...
Running test FooTest...PASSED
Tests Completed in 815ms ...
-------------------------------------------------------
Tests passed: 2
Tests failed: 0
-------------------------------------------------------
...
Tests PASSED - view reports in target/test-reports
command: my.pkg.Baz unit tests
$ grails test-app -unit my.pkg.Baz
...
Starting unit test phase ...
-------------------------------------------------------
Running 2 unit tests...
Running test my.pkg.BazTest...PASSED
Tests Completed in 842ms ...
-------------------------------------------------------
Tests passed: 2
Tests failed: 0
-------------------------------------------------------
...
Tests PASSED - view reports in target/test-reports
I tried these in Grails 1.2.3 and Grails 1.3.4, both behaved the same.
Solution 2
yes there is
grails test-app -unit YourController.testSomething
where YourController is your controller and testSomething is the test method.
You should see something like
Tests PASSED - view reports in
Solution 3
Given a test class foo.BarTests you can run just the tests in that class using the following command:
grails test-app :unit foo.Bar
Or run a single test method within that class using:
grails test-app :unit foo.Bar.testMethod
Note that you do not include the word "Tests" when specifying the name of test class.
Solution 4
grails test-app -unit com.package.YourController.testSomething
you need to include the package name when you run the test
Solution 5
This would work for sure, I use it every day
Following will run a single test
grails test-app :unit ExampleControllerTests.testName
Following will run all ExampleControllerTests
grails test-app :unit ExampleControllerTests
Eric Wilson
Software developer, experienced in Java and Python in Linux environments, formerly a professor of mathematics. I'm a father of five children, and a husband of one wife.
Updated on February 27, 2020Comments
-
Eric Wilson about 4 years
I've been running my Grails unit tests by typing
grails test-app :unit
, which runs all unit tests. Is there a way to specify a single test?Edit: So far, everyone is basically saying the same thing, but when I do that, no tests are run. Any more thoughts?
Conclusion: OK, I was using the name of the test class, rather than the name of the class being tested. Once I tried
Foo
instead ofFooTests
it worked perfectly. -
Eric Wilson over 13 yearsHmm . . . not working for me. It tries to run the tests, but says passed, not finding it.
-
Eric Wilson over 13 yearsI guessed that, still didn't work. Does it make a difference if it is a service class, and not generated, like a controller?
-
ErikE over 12 yearsThe OP specifically said that using the name of the test class was his error, but here your examples show doing exactly that. Plus your syntax looks suspect, with a trailing colon instead of a leading dash, though I don't really know...
-
Sudhir N over 12 yearsDon't comment and vote negative if you don't really know, this works exact. Using the name of test class is no problem at all, I use it every day and i know it works. (I use grails 1.3.7)
-
ErikE over 12 yearsI don't know how to reconcile what you said with what the OP said was the definitive answer. The downvote was not for the syntax which by itself I would have ignored.
-
Eric Wilson over 12 yearsHmm, that works for me in Grails 2.0. I'm curious what version I was using 17 months ago when I was having this difficulty. @ErikE, I'd suggest that you reverse your vote, as this answer is correct, despite my previous assertions.
-
ErikE over 12 years@Eric Thank you for the info! I commented in addition to downvoting to give a chance to fix the problem--if it existed. Now this has generated the chance for someone to update an answer or a question with the new information. I will never downvote unfairly if I can help it. Give some trust to the process, folks. :)
-
Ian Durkan about 10 yearsThis syntax works for running integration tests also, like..
grails test-app integration: TestSpec
etc. -
Ibrahim.H over 5 yearsThis is the only way which worked for me to test a single method with Grails 3.3.6.