标记 Geb classes/tests 以排除
Tag Geb classes/tests for exclusion
我正在尝试创建一种简单的方法来从 运行ning 中排除 Geb 测试,因为没有可选的 "tag"。
在我的 grails 项目中,我为我的 geb 文件创建了一个 "test/functional" 目录。在这个目录中,我有 GebConfig.groovy 和 SpockConfig.groovy 文件。我知道 SpockConfig.groovy 当前存在无法解析项目中的 classes 的问题,并且只能识别 BuildConfig 依赖项中提供的 classes。因此,我创建并压缩了一个注释 class "Tags" 并将其包含在依赖项中。我现在可以通过以下方式在我的 Geb 测试中使用此注释:
@Tags("regression")
@Tags(["smoke", "regression"])
@Tags(["in-progress", "whatever-makes-sense"])
我现在想要的是让 SpockConfig 在 "test/functional" 目录中找到所有带有 @Tags 注释的 classes,以及每个没有 [=标签数组中的 38=]("functional.tag"),将 class 添加到 runner.exclude 基础 classes 集合中,这样它就不会执行。
我对注解及其处理还很陌生,到目前为止还没有找到一种简单的方法来执行这个过程的查找逻辑。是否存在促进此类过程的现有结构,或者可以实施哪些逻辑来完成此任务?
编辑:
我能够通过以下 classes...
实现此功能
public class IgnoreUnlessExtension extends AbstractAnnotationDrivenExtension<IgnoreUnless> {
private static final Pattern JAVA_VERSION = Pattern.compile("(\d+\.\d+).*");
private static final Object DELEGATE = new Object() {
public Map<String, String> getEnv() {
return System.getenv();
}
public Properties getProperties() {
return System.getProperties();
}
public BigDecimal getJavaVersion() {
String versionString = System.getProperty("java.version");
Matcher matcher = JAVA_VERSION.matcher(versionString);
if (matcher.matches()) return new BigDecimal(matcher.group(1));
throw new InternalSpockError(versionString);
}
};
@Override
public void visitSpecAnnotation(IgnoreUnless annotation, SpecInfo spec) {
doVisit(annotation, spec);
}
@Override
public void visitFeatureAnnotation(IgnoreUnless annotation, FeatureInfo feature) {
doVisit(annotation, feature);
}
private void doVisit(IgnoreUnless annotation, ISkippable skippable) {
String[] tags = annotation.value();
String targetTag = System.getenv("functional.tag");
if (GroovyRuntimeUtil.isTruthy(targetTag)) {
skippable.setSkipped(!tags.contains(targetTag));
}
}
}
@Retention(RetentionPolicy.RUNTIME)
@Target([ElementType.TYPE, ElementType.METHOD])
@ExtensionAnnotation(IgnoreUnlessExtension.class)
public @interface IgnoreUnless {
String[] value() default [];
}
使用@IgnoreUnless 注释我现在可以将classes 或方法标记为@IgnoreUnless("tag1") 或@IgnoreUnless(["tag1", "tag2"])并且,如果在 运行 命令上提供了标记,则将跳过已注释且列表中没有提供的标记的测试。
要跳过具有注释的规范,您可以创建一个实现 Spock 的 IAnnotationDrivenExtension 的扩展。有关示例,请参阅 IgnoreExtension 和 IgnoreIfExtension。您的扩展可以获得 "functional.tag" env var 并在 Tags 注释的值中搜索它。
如果您不介意使用多个注释,而不是参数化单个注释,那么您可以使用现有的扩展和配置来做您想做的事情,而不是创建您自己的扩展。
但是,如果您想跳过 没有 单个参数化注释的规范,则需要实施 IGlobalExtension。有关示例,请参见 IncludeExcludeExtension。您可以在 jar 中将全局扩展作为服务发布,例如,使用像这样的 Grails 脚本:
includeTargets << grailsScript('Init')
includeTargets << grailsScript('Compile')
target(buildAll: 'build the foo-spock-extensions.jar') {
depends(compile, buildJar)
}
target(buildJar: 'build the foo-spock-extensions.jar') {
def libDir = new File((File)grailsSettings.baseDir, 'lib')
def jarFile = new File(libDir, 'foo-spock-extensions.jar')
def serviceType = 'org.spockframework.runtime.extension.IGlobalExtension'
ant.delete(quiet: true, file: jarFile)
ant.jar( destfile: jarFile ) {
fileset(dir: classesDirPath) {
include(name: '**/*ExecuteWhenPropertySet*.class') // 3 top classes + a couple closures
include(name: '**/ReportConnectionLeaksExtension*.class') // top class & nested Listener
}
// Generate the serviceType file in META-INF/services, to plugin to Spock's ExtensionClassesLoader.
service(type: serviceType) {
provider(classname: 'com.example.foo.testing.OnlyExecuteWhenPropertySetExtension')
provider(classname: 'com.example.foo.testing.ReportConnectionLeaksExtension')
}
}
}
setDefaultTarget( buildAll )
我正在尝试创建一种简单的方法来从 运行ning 中排除 Geb 测试,因为没有可选的 "tag"。
在我的 grails 项目中,我为我的 geb 文件创建了一个 "test/functional" 目录。在这个目录中,我有 GebConfig.groovy 和 SpockConfig.groovy 文件。我知道 SpockConfig.groovy 当前存在无法解析项目中的 classes 的问题,并且只能识别 BuildConfig 依赖项中提供的 classes。因此,我创建并压缩了一个注释 class "Tags" 并将其包含在依赖项中。我现在可以通过以下方式在我的 Geb 测试中使用此注释:
@Tags("regression")
@Tags(["smoke", "regression"])
@Tags(["in-progress", "whatever-makes-sense"])
我现在想要的是让 SpockConfig 在 "test/functional" 目录中找到所有带有 @Tags 注释的 classes,以及每个没有 [=标签数组中的 38=]("functional.tag"),将 class 添加到 runner.exclude 基础 classes 集合中,这样它就不会执行。
我对注解及其处理还很陌生,到目前为止还没有找到一种简单的方法来执行这个过程的查找逻辑。是否存在促进此类过程的现有结构,或者可以实施哪些逻辑来完成此任务?
编辑:
我能够通过以下 classes...
实现此功能public class IgnoreUnlessExtension extends AbstractAnnotationDrivenExtension<IgnoreUnless> {
private static final Pattern JAVA_VERSION = Pattern.compile("(\d+\.\d+).*");
private static final Object DELEGATE = new Object() {
public Map<String, String> getEnv() {
return System.getenv();
}
public Properties getProperties() {
return System.getProperties();
}
public BigDecimal getJavaVersion() {
String versionString = System.getProperty("java.version");
Matcher matcher = JAVA_VERSION.matcher(versionString);
if (matcher.matches()) return new BigDecimal(matcher.group(1));
throw new InternalSpockError(versionString);
}
};
@Override
public void visitSpecAnnotation(IgnoreUnless annotation, SpecInfo spec) {
doVisit(annotation, spec);
}
@Override
public void visitFeatureAnnotation(IgnoreUnless annotation, FeatureInfo feature) {
doVisit(annotation, feature);
}
private void doVisit(IgnoreUnless annotation, ISkippable skippable) {
String[] tags = annotation.value();
String targetTag = System.getenv("functional.tag");
if (GroovyRuntimeUtil.isTruthy(targetTag)) {
skippable.setSkipped(!tags.contains(targetTag));
}
}
}
@Retention(RetentionPolicy.RUNTIME)
@Target([ElementType.TYPE, ElementType.METHOD])
@ExtensionAnnotation(IgnoreUnlessExtension.class)
public @interface IgnoreUnless {
String[] value() default [];
}
使用@IgnoreUnless 注释我现在可以将classes 或方法标记为@IgnoreUnless("tag1") 或@IgnoreUnless(["tag1", "tag2"])并且,如果在 运行 命令上提供了标记,则将跳过已注释且列表中没有提供的标记的测试。
要跳过具有注释的规范,您可以创建一个实现 Spock 的 IAnnotationDrivenExtension 的扩展。有关示例,请参阅 IgnoreExtension 和 IgnoreIfExtension。您的扩展可以获得 "functional.tag" env var 并在 Tags 注释的值中搜索它。
如果您不介意使用多个注释,而不是参数化单个注释,那么您可以使用现有的扩展和配置来做您想做的事情,而不是创建您自己的扩展。
但是,如果您想跳过 没有 单个参数化注释的规范,则需要实施 IGlobalExtension。有关示例,请参见 IncludeExcludeExtension。您可以在 jar 中将全局扩展作为服务发布,例如,使用像这样的 Grails 脚本:
includeTargets << grailsScript('Init')
includeTargets << grailsScript('Compile')
target(buildAll: 'build the foo-spock-extensions.jar') {
depends(compile, buildJar)
}
target(buildJar: 'build the foo-spock-extensions.jar') {
def libDir = new File((File)grailsSettings.baseDir, 'lib')
def jarFile = new File(libDir, 'foo-spock-extensions.jar')
def serviceType = 'org.spockframework.runtime.extension.IGlobalExtension'
ant.delete(quiet: true, file: jarFile)
ant.jar( destfile: jarFile ) {
fileset(dir: classesDirPath) {
include(name: '**/*ExecuteWhenPropertySet*.class') // 3 top classes + a couple closures
include(name: '**/ReportConnectionLeaksExtension*.class') // top class & nested Listener
}
// Generate the serviceType file in META-INF/services, to plugin to Spock's ExtensionClassesLoader.
service(type: serviceType) {
provider(classname: 'com.example.foo.testing.OnlyExecuteWhenPropertySetExtension')
provider(classname: 'com.example.foo.testing.ReportConnectionLeaksExtension')
}
}
}
setDefaultTarget( buildAll )