2

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

我的目录结构如下;

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

我有/测试/支持文件夹内测试辅助类我希望能够适用于每种不同的测试类型。

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

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

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

回答

2

它适用于IDE内的单元测试的原因是,所有的源文件夹都被编译到一个目录中,并且随着从项目依赖项中提取的罐子GGTS一起添加到你的类路径中。这很方便但容易引起误解,因为它没有考虑到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),并且挂接到事件以替换projectTestRunner_GrailsTest.groovy与您的自定义之一,而在这一点上我的脑袋疼,我不想再想想这个:)

所以不是所有这一切,我把代码中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' 
} 
+0

感谢您的详细回复。我讨厌在我的源文件中进行测试课程的想法。所以这对我来说。我很惊讶,Grails不支持这个框。最初我的支持测试课是围绕测试数据。所以我会看看测试数据插件来解决这个问题。 – tommyk 2014-10-03 08:09:41