从grails插件执行Cucumber Specs

时间:2014-06-11 11:11:31

标签: grails cucumber-jvm

在我的grails应用程序中,我有不同的插件,可以在所有应用程序中使用。这些插件在" test / functional"中有黄瓜规格和geb页面。我想做的是,在每个使用插件的应用程序中,插件的测试应该在应用程序的上下文中执行。

为实现这一点,我想知道,如何在应用程序的CucumberConfig.groovy中进行配置看起来像。

我想出了类似的东西:

cucumber {
  tags = ["~@ignore"]
  features = ["plugins/plugin-name/test/functional"]
  glue = features
}

但它没有按照应有的方式解决问题。也许这甚至是实现我的目标的错误方法。如果是的话,请不要犹豫告诉我。

如果有人有想法,那就太好了。

1 个答案:

答案 0 :(得分:1)

这对我有用:

import org.codehaus.groovy.grails.plugins.GrailsPluginUtils

String pluginDir     = GrailsPluginUtils.pluginInfos.find { it.name == '<nameOfPlugin>' }.pluginDir
String pluginCukeDir = [pluginDir, 'test', 'cucumber'].join (File.separator)

println "($pluginDir) ($pluginCukeDir)"

cucumber {
    tags = ["~@ignore"]

    features = [
        "test/cucumber", pluginCukeDir
    ]
    glue = features
}

我使用了grails-cucumber的geb示例,将示例中的一个要素复制到插件测试目录中,并重命名步骤以避免使用DuplicateStepDefinitionException

使用test/cucumber代替test/functional应该没有任何区别。

<强>更新

仔细看看,这会有效,但有一些并发症。你必须自己决定是否有回报。

如果我们在插件测试代码中有geb代码(页面对象/模块),则必须编译它。我们可以使用sources配置告诉黄瓜 - grails。这会将给定的源文件夹(包括任何步骤代码)编译成target/test-classes/functional(我们处于功能测试阶段)。

接下来,我们必须通过添加glue配置来扩展黄瓜的类路径 “classpath:”条目。

的问题:

因为插件测试代码被编译到与项目测试代码相同的文件夹中,所以我们必须注意插件代码不会使用相同的包或类名来覆盖项目中的类。

我们还必须照顾黄瓜钩。我们不想运行多次设置geb的@ Before / @ After钩子(即来自当前项目及其插件)。解决方案应该是在项目和插件中以不同方式标记挂钩,并将正确的标记添加到标记配置中,以便geb设置挂钩仅针对给定标记运行。

配置将如下所示:

import org.codehaus.groovy.grails.plugins.GrailsPluginUtils

String pluginDir     = GrailsPluginUtils.pluginInfos.find { it.name == '<nameOfPlugin>' }.pluginDir
String pluginCukeDir = [pluginDir, 'test', 'functional'].join (File.separator)

cucumber {
    sources = [
        //"test/functional", // automatically compiled by grails
        pluginCukeDir        // cucumber plugin tells grails to compile this
    ]

    features = [
        "test/functional",
        pluginCukeDir
    ]

    glue = [
        "classpath:<inside target/test-classes/test/functional>"
    ]
}