Skip to content

Commit 6c009a0

Browse files
authored
Merge pull request #15547 from apache/test-slicing
Add test slicing to the build
2 parents 8523b6c + 64dec87 commit 6c009a0

File tree

53 files changed

+139
-1
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+139
-1
lines changed

DEVELOPMENT.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,5 +44,27 @@ These can be set on the command line like so:
4444
* `skipMongodbTests` - does not run mongo related tests
4545
* `skipTests` - no tests will run
4646

47+
## Test slicing
48+
49+
Test classes tagged with `@spock.lang.Tag('some-tag')` can be run separately.\
50+
Tags are inherited from superclasses, so a test class is also included if any of its ancestors is tagged.
51+
52+
Example:
53+
54+
```bash
55+
./gradlew iT -PincludeTestTags=geb
56+
```
57+
58+
Available project properties:
59+
60+
* `includeTestTags` - comma-separated list of test tags to include
61+
* `excludeTestTags` - comma-separated list of test tags to exclude
62+
63+
Example with multiple tags:
64+
65+
```bash
66+
./gradlew iT -PincludeTestTags=geb,api
67+
```
68+
4769
## Start a mongo docker container (containers will start by default)
4870
`docker run -d --name mongo-on-docker -p 27017:27017 mongo`

gradle/functional-test-config.gradle

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,20 @@ tasks.withType(Test).configureEach { Test task ->
9595
task.outputs.dir rootProject.layout.buildDirectory.dir('mongo-test-serialize')
9696
}
9797

98-
task.useJUnitPlatform()
98+
task.useJUnitPlatform {
99+
if (project.hasProperty('includeTestTags')) {
100+
// Will only run tests that are tagged with specific tags
101+
// e.g. @spock.lang.Tag('geb')
102+
// Run with: ./gradlew iT -PincludeTestTags=geb (comma-separated list)
103+
includeTags((project.property('includeTestTags') as String).split(',')*.trim() as String[])
104+
}
105+
if (project.hasProperty('excludeTestTags')) {
106+
// Will not run tests that are tagged with specific tags
107+
// e.g. @spock.lang.Tag('geb')
108+
// Run with: ./gradlew iT -PincludeTestTags=geb
109+
excludeTags((project.property('excludeTestTags') as String).split(',')*.trim() as String[])
110+
}
111+
}
99112
task.testLogging {
100113
events('passed', 'skipped', 'failed', 'standardOut', 'standardError')
101114
showExceptions = true

grails-geb/src/testFixtures/groovy/grails/plugin/geb/ContainerGebSpec.groovy

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import geb.Page
2424
import geb.test.GebTestManager
2525
import spock.lang.Shared
2626
import spock.lang.Specification
27+
import spock.lang.Tag
2728

2829
import grails.plugin.geb.support.ContainerSupport
2930
import grails.plugin.geb.support.ReportingSupport
@@ -55,6 +56,8 @@ import grails.plugin.geb.support.delegate.PageDelegate
5556
* @author James Daugherty
5657
* @since 4.1
5758
*/
59+
@Tag('geb')
60+
@Tag('container-geb')
5861
@CompileStatic
5962
abstract class ContainerGebSpec extends Specification implements ContainerSupport, ReportingSupport, BrowserDelegate, PageDelegate, DriverDelegate, DownloadSupportDelegate {
6063

grails-test-examples/app1/src/integration-test/groovy/functionaltests/AtResourceSpec.groovy

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@
1919
package functionaltests
2020

2121
import spock.lang.Specification
22+
import spock.lang.Tag
2223

2324
import grails.testing.mixin.integration.Integration
2425
import org.apache.grails.testing.http.client.HttpClientSupport
2526

2627
@Integration
28+
@Tag('http-client')
2729
class AtResourceSpec extends Specification implements HttpClientSupport {
2830

2931
def "A domain class annotated with @Resources exposes an endpoint"() {

grails-test-examples/app1/src/integration-test/groovy/functionaltests/BookRestfulControllerSpec.groovy

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@
1919
package functionaltests
2020

2121
import spock.lang.Specification
22+
import spock.lang.Tag
2223

2324
import grails.testing.mixin.integration.Integration
2425
import org.apache.grails.testing.http.client.HttpClientSupport
2526

2627
@Integration
28+
@Tag('http-client')
2729
class BookRestfulControllerSpec extends Specification implements HttpClientSupport {
2830

2931
def "A RestfulController exposes an index endpoint for a domain class"() {

grails-test-examples/app1/src/integration-test/groovy/functionaltests/GspInWebappDirSpec.groovy

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@
1919
package functionaltests
2020

2121
import spock.lang.Specification
22+
import spock.lang.Tag
2223

2324
import grails.testing.mixin.integration.Integration
2425
import org.apache.grails.testing.http.client.HttpClientSupport
2526

2627
@Integration
28+
@Tag('http-client')
2729
class GspInWebappDirSpec extends Specification implements HttpClientSupport {
2830

2931
def 'GSP in src/main/webapp renders'() {

grails-test-examples/app1/src/integration-test/groovy/functionaltests/async/AsyncPromiseSpec.groovy

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import java.util.concurrent.TimeUnit
2222

2323
import functionaltests.services.AsyncProcessingService
2424
import spock.lang.Specification
25+
import spock.lang.Tag
2526
import spock.lang.Unroll
2627

2728
import org.springframework.beans.factory.annotation.Autowired
@@ -34,6 +35,7 @@ import org.apache.grails.testing.http.client.HttpClientSupport
3435
* Tests various async patterns including tasks, promises, chaining, and error handling.
3536
*/
3637
@Integration
38+
@Tag('http-client')
3739
class AsyncPromiseSpec extends Specification implements HttpClientSupport {
3840

3941
@Autowired AsyncProcessingService asyncProcessingService

grails-test-examples/app1/src/integration-test/groovy/functionaltests/binding/AdvancedDataBindingSpec.groovy

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
package functionaltests.binding
2020

2121
import spock.lang.Specification
22+
import spock.lang.Tag
2223

2324
import grails.testing.mixin.integration.Integration
2425
import org.apache.grails.testing.http.client.HttpClientSupport
@@ -42,6 +43,7 @@ import org.apache.grails.testing.http.client.HttpClientSupport
4243
* - String trimming
4344
*/
4445
@Integration
46+
@Tag('http-client')
4547
class AdvancedDataBindingSpec extends Specification implements HttpClientSupport {
4648

4749
// ========== Map-Based Binding Tests ==========

grails-test-examples/app1/src/integration-test/groovy/functionaltests/caching/CachingSpec.groovy

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ package functionaltests.caching
2020

2121
import spock.lang.Narrative
2222
import spock.lang.Specification
23+
import spock.lang.Tag
2324

2425
import org.springframework.beans.factory.annotation.Autowired
2526

@@ -42,6 +43,7 @@ Grails caching provides method-level caching via annotations @Cacheable,
4243
@CacheEvict, and @CachePut. This allows expensive operations to be cached
4344
and only recomputed when necessary.
4445
''')
46+
@Tag('http-client')
4547
class CachingSpec extends Specification implements HttpClientSupport {
4648

4749
@Autowired CacheTestService cacheTestService

grails-test-examples/app1/src/integration-test/groovy/functionaltests/codecs/SecurityCodecsSpec.groovy

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
package functionaltests.codecs
2020

2121
import spock.lang.Specification
22+
import spock.lang.Tag
2223

2324
import grails.testing.mixin.integration.Integration
2425
import org.apache.grails.testing.http.client.HttpClientSupport
@@ -38,6 +39,7 @@ import org.apache.grails.testing.http.client.HttpClientSupport
3839
* - Hash consistency verification
3940
*/
4041
@Integration
42+
@Tag('http-client')
4143
class SecurityCodecsSpec extends Specification implements HttpClientSupport {
4244

4345
// ========== HTML Encoding Tests (XSS Prevention) ==========

0 commit comments

Comments
 (0)