Gradle/Spock 土地上有测试套件的概念吗?
Is there a concept of test suites in Gradle/Spock land?
Groovy/Gradle 这里的项目使用 Spock 进行单元测试。
Spock and/or Gradle 支持测试套件或命名测试集吗?由于超出此问题范围的原因,CI 服务器无法 运行.
进行某些 Spock 测试(Specifications
)
所以最好将我所有应用程序的 Spock 测试分成两组:
- "
ci-tests
";和
- "
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
配置 test
和 functionalTest
任务
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}"
}
}
}
}
Groovy/Gradle 这里的项目使用 Spock 进行单元测试。
Spock and/or Gradle 支持测试套件或命名测试集吗?由于超出此问题范围的原因,CI 服务器无法 运行.
进行某些 Spock 测试(Specifications
)
所以最好将我所有应用程序的 Spock 测试分成两组:
- "
ci-tests
";和 - "
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
test
和 functionalTest
任务
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}"
}
}
}
}