我有一组规范测试,我正在Grails项目中执行。
当我在本地时,我需要执行一组特定的规范,当我运行预生产环境时,我需要执行另一组规范。我当前的配置是同时为两个环境执行所有规范,这是我想避免的。
我有多个环境,我已经在我的 GebConfig 中配置了这些环境:
environments {
local {
baseUrl = "http://localhost:8090/myApp/login/auth"
}
pre-prod {
baseUrl = "https://preprod/myApp/login/auth"
}
}
你可以使用 spock 配置文件。
为两种类型的测试 - @Local
和 @PreProd
创建注释,例如在 Groovy 中:
import java.lang.annotation
@Retention(RetentionPolicy.RUNTIME)
@Target([ElementType.TYPE, ElementType.METHOD])
@Inherited
public @interface Local {}
下一步是相应地注释您的规格,例如:
@Local
class SpecificationThatRunsLocally extends GebSpec { ... }
然后在GebConfig.groovy
文件旁边创建一个包含以下内容的SpockConfig.groovy
文件:
def gebEnv = System.getProperty("geb.env")
if (gebEnv) {
switch(gebEnv) {
case 'local':
runner { include Local }
break
case 'pre-prod':
runner { include PreProd }
break
}
}
编辑:看起来Grails正在使用自己的测试运行器,这意味着在运行Grails规范时不考虑SpockConfig.groovy。如果你需要它在Grails下工作,那么你应该使用@IgnoreIf/@Require内置的Spock扩展注释。
首先创建一个 Closure 类,其中包含何时应启用给定规范的逻辑。您可以将逻辑直接作为扩展注释的闭包参数放置,但是如果您想注释大量规范,那么到处复制该代码可能会很烦人。
class Local extends Closure<Boolean> {
public Local() { super(null) }
Boolean doCall() {
System.properties['geb.env'] == 'local'
}
}
class PreProd extends Closure<Boolean> {
public PreProd() { super(null) }
Boolean doCall() {
System.properties['geb.env'] == 'pre-prod'
}
}
然后注释您的规格:
@Requires(Local)
class SpecificationThatRunsLocally extends GebSpec { ... }
@Requires(PreProd)
class SpecificationThatRunsInPreProd extends GebSpec { ... }