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