在我的 grails 应用程序中,我有不同的插件,可用于所有应用程序。这些插件在“测试/功能”中有 cucumber 规范和geb页面。我想做的是在每个使用插件的应用程序中,插件的测试应该在应用程序的上下文中执行。
为了实现这一点,我想知道,应用程序的 CucumberConfig.groovy 中的配置必须是什么样的。
我想出了这样的事情:
cucumber {
tags = ["~@ignore"]
features = ["plugins/plugin-name/test/functional"]
glue = features
}
但它并没有按照它应该的方式工作。也许这甚至是实现我目标的错误方法。如果是,请不要犹豫告诉我。
如果有人有想法,那就太好了。
最佳答案
这对我有用:
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
告诉 cucumber-grails 这样做。配置。这会将给定的源文件夹(包括任何步骤代码)编译成 target/test-classes/functional
(我们处于功能测试阶段)。接下来我们必须使用
glue
扩展 cucumber 的类路径。通过添加配置“类路径:”条目。
问题:
因为插件测试代码被编译到与项目测试代码相同的文件夹中,所以我们必须注意插件代码不会使用相同的包或类名覆盖项目中的类。
我们还必须照顾 cucumber 钩。我们不想运行多次设置 geb 的 @Before/@After 钩子(Hook)(即从当前项目及其插件中)。解决方案应该是在项目和插件中以不同的方式标记 Hook ,并将适当的标签添加到标签配置中,以便 geb 设置 Hook 仅针对给定标签运行。
然后配置将如下所示:
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>"
]
}
关于grails - 从 grails 插件执行 Cucumber Specs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24161462/