【问题标题】:Grails test-app classpathGrails 测试应用类路径
【发布时间】:2014-09-30 09:15:55
【问题描述】:

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

我的目录结构如下;

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    它适用于 IDE 中的单元测试的原因是所有源文件夹都被编译到一个目录中,并与 GGTS 从项目依赖项中提取的 jars 一起添加到您的类路径中。这很方便但具有误导性,因为它没有考虑到 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)注册为 taskdefs。所以应该可以对它们进行子类化并添加逻辑来编译标准目录和共享目录,并将它们注册为替换,但这也需要子类化和重新处理GrailsProjectTestRunner(它实例化GrailsProjectTestCompiler),并挂钩到事件将_GrailsTest.groovy 中的projectTestRunner 字段替换为您的自定义字段,此时我的大脑很痛,我不想再考虑这个了:)

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

    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'
    }
    

    【讨论】:

    • 感谢您的详细回复。我讨厌在我的源代码中包含测试类的想法。所以这不适合我。我很惊讶 grails 不支持这个开箱即用。最初我的支持测试类是围绕测试数据的。所以我要看看 test-data-plugin 来解决这个问题。
    猜你喜欢
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多