Gradle/Spock 土地上有测试套件的概念吗?

Is there a concept of test suites in Gradle/Spock land?

Groovy/Gradle 这里的项目使用 Spock 进行单元测试。

Spock and/or Gradle 支持测试套件或命名测试集吗?由于超出此问题范围的原因,CI 服务器无法 运行.

进行某些 Spock 测试(Specifications

所以最好将我所有应用程序的 Spock 测试分成两组:

  1. "ci-tests";和
  2. "local-only-tests"

然后也许我们可以通过以下方式调用它们:

./gradlew test --suite ci-tests

等这可能吗?如果是这样,setup/config 是什么样子的?

我会设置一个子模块 my-app-ci-test,在 build.gradle 中包含以下内容:

test {
    enabled = false
}
task functionalTest(type: Test) {
}

然后将测试放在 src/test/groovy 和 运行 ./gradlew functionalTest 中。

或者,您可以将它们包含在同一个模块中,并使用 includes / excludes

配置 testfunctionalTest 任务
test {
    exclude '**/*FunctionalTest.groovy'
}
task functionalTest(type: Test) {
    include '**/*FunctionalTest.groovy'
}

您可以使用 Spock 注释 @IgnoreIf( ) 在您的 CI 服务器中注释不应 运行 的测试。

在此处查看文档:https://spockframework.github.io/spock/docs/1.0/extensions.html#_ignoreif

您需要做的就是让 CI 服务器设置一个环境变量,如果设置了该变量,则排除测试 class。

Spock 甚至在闭包内有属性以使其变得简单:

@IgnoreIf({ sys.isCiServer })

如果您使用 Junit test-runner 进行 Spock 测试,您可以使用 @Category 注释。例子 by article and official documentation:

 public interface FastTests {
 }

 public interface SlowTests {
 }

 public interface SmokeTests
 }

 public static class A {
     @Test
     public void a() {
         fail();
     }

     @Category(SlowTests.class)
     @Test
     public void b() {
     }

     @Category({FastTests.class, SmokeTests.class})
     @Test
     public void c() {
     }
 }

 @Category({SlowTests.class, FastTests.class})
 public static class B {
     @Test
     public void d() {
     }
 }
test {
    useJUnit {
        includeCategories 'package.FastTests'
    }
    testLogging {
        showStandardStreams = true
    }
}

您可以使用以下 SpockConfiguration.groovy 允许通过系统属性传递 include/exclude

    runner {
        exclude {
            System.properties['spock.exclude.annotations']
                ?.split(',')
                *.trim()
                ?.each {
                    try {
                        annotation Class.forName(it)
                        println "Excluding ${it}"
                    } catch (ClassNotFoundException e) {
                        println "Can't load ${it}: ${e.message}"
                    }
                }
        }
        include {
            System.properties['spock.include.annotations']
                ?.split(',')
                *.trim()
                ?.each {
                    try {
                        annotation Class.forName(it)
                        println "Including ${it}"
                    } catch (ClassNotFoundException e) {
                        println "Can't load ${it}: ${e.message}"
                    }
                }
        }
    }