【问题标题】:Executing Specific Geb Tests according to environment根据环境执行特定的 Geb 测试
【发布时间】:2013-09-05 12:31:53
【问题描述】:

我在 Grails 项目中执行了一组 Spec 测试。

当我在本地时,我需要执行一组 Specs,而当我运行 pre-prod 环境时,我需要执行另一组 Specs。 我当前的配置是同时为两个环境执行我的所有规范,这是我想要避免的。

我在 GebConfig 中配置了多个环境:

environments {
    local {
        baseUrl = "http://localhost:8090/myApp/login/auth"
    }

    pre-prod {
        baseUrl = "https://preprod/myApp/login/auth"
    }

}

【问题讨论】:

    标签: testing grails spock geb


    【解决方案1】:

    您可以使用 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 扩展注解。

    首先创建一个闭包类,其中包含何时启用给定规范的逻辑。您可以将逻辑直接作为扩展注释的闭包参数放置,但如果您想注释很多规范,则将那段代码复制到整个地方会很烦人。

    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 { ... }
    

    【讨论】:

    • 感谢erdi 的回复,请问如何创建注释,您有示例吗?发送
    • erdi,我的 Grails 应用程序没有“看到”我的 SockConfig。我将它放在与 gebConfig 相同的包中。在调试时,spockconfig 中的代码永远不会到达
    • 它是否名为 SpockConfig.groovy 并且位于 grails 项目的 test/functional 目录中?您是否使用grails test-app functional: 运行功能测试?
    • 是的,实际上我正在从 IntelliJ 运行我的测试,命令是 :test-app functional:TestSpec
    • SpockConfig.groovy 是否位于 test/functional 的根目录中?
    猜你喜欢
    • 1970-01-01
    • 2012-10-14
    • 2016-08-12
    • 2019-11-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    相关资源
    最近更新 更多