Grails test-app classpath

时间:2014-09-30 09:15:55

标签: unit-testing grails integration-testing functional-testing

我试图在我的测试中使用测试支持类。我希望这些类可用于所有不同的测试类型。

我的目录结构如下;

  • /测试/功能
  • /测试/集成
  • /测试/单元
  • /测试/支持

我在/ test / support文件夹中有测试帮助程序类,我希望每个不同的测试类型都可以使用它们。

我正在使用GGTS,并且我已将支持文件夹添加到类路径中。但每当我运行我的集成测试运行' test-app'我得到一个编译器'无法解析类mypackage.support.MyClass

当我在GGTS中运行我的单元测试时,会找到并使用支持类。我认为这是因为集成测试在我自己的JVM中运行我的应用程序。

在运行任何测试时,有没有办法告诉grails包含我的支持包? 我不希望我的测试支持类位于我的应用程序源文件夹中。

1 个答案:

答案 0 :(得分:2)

它适用于IDE内部的单元测试的原因是所有源文件夹都被编译到一个目录中,并且与GGTS从项目依赖项中获取的jar一起添加到类路径中。这很方便但有误导性,因为它没有考虑Grails为run-app和每个测试阶段使用不同的类路径,您在运行集成测试时会看到这些阶段。 GGTS并没有真正进行测试;它运行与命令行相同的grails test-app进程,捕获其输出并侦听构建事件,以便更新其JUnit视图。

可以在类路径中添加额外的jar文件以进行测试,因为您可以在测试开始之前挂钩到Ant事件并将其添加到类路径中。但编译过程涉及的内容更多,看起来让它工作变得相当丑陋/黑客,并且可能很脆弱,并且在Grails实现发生变化时将来会停止工作。

以下是一些关于它为什么不平凡的具体细节。我希望您可以调用GrailsProjectTestCompiler.compileTests()来获取额外的目录,但是需要将其与test/unit目录一起编译以进行单元测试,并将test/integration目录编译为集成测试,以及编译器(GrailsProjectTestCompiler)假设每个测试阶段只需要编译那个目录。该编译器使用Gant,每个测试阶段都有自己的Grailsc子类(org.grails.test.compiler.GrailsTestCompilerorg.grails.test.compiler.GrailsIntegrationTestCompiler)注册为taskdef。所以应该可以对它们进行子类化并添加逻辑来编译标准目录和共享目录,并将它们注册为替换,但这也需要子类化和重写GrailsProjectTestRunner(实例化GrailsProjectTestCompiler),并挂钩进入一个事件,用你的自定义替换projectTestRunner中的_GrailsTest.groovy字段,此时我的大脑受伤了,我不想再考虑这个了:)

所以不是所有这些,我将代码放在src/groovysrc/java中,但是在特定于测试的包中,可以很容易地从WAR文件中排除已编译的类。您可以使用grails.war.resources中的BuildConfig.groovy关闭来执行此操作,例如

grails.war.resources = { stagingDir ->
   println '\nDeleting test classes\n'
   delete(verbose: true) {
      // adjust as needed to only delete test-specific classes
      fileset dir: stagingDir, includes: '**/test/**/*.class'
   }
   println '\nFinished deleting test classes\n'
}