簡體   English   中英

如何使用Gradle測試已編譯的JAR文件

[英]How to test compiled JAR file using Gradle

我有一個在標准單元測試期間執行時可以正常工作的代碼,但是在將其編譯到jar中並添加為其他項目的依賴項時卻無法正常工作。

找到根本原因並解決它不是問題,但是我開始考慮如何在將其部署到任何地方之前測試一下剛制作的jar工件,以確保它可以用於最終用戶和其他項目。 我已經在這個主題上搜索了幾個小時,但是甚至沒有找到與其相關的東西。

也許我完全錯了,試圖實現一些奇怪的東西,但是我無法找出另一種方法來驗證已編譯的程序包並確信它會為其他程序工作。

關於項目的一些細節-簡單的Java庫,只有很少的類,使用Gradle 5.5作為構建系統,使用travis-ci作為CI / CD工具,用於測試我正在使用TestNG,但是如果需要的話,我可以輕松地切換到JUnit 。

如果您對代碼感到好奇,當將其編譯到軟件包中時該代碼不起作用,請使用以下簡化版本:

public String readResourceByURI() throws IOException, URISyntaxException
{
  new String(Files.readAllBytes(Paths.get(ClassLoader.getSystemClassLoader().getResource("resource.txt").toURI())));
}

如果打包到jar文件中,則此函數將引發java.nio.file.FileSystemNotFoundException。 但是正如我所說的,問題不在於代碼...

理想情況下,我想創建一個生成管道,該管道將生成jar工件,然后將對其進行測試,如果測試成功,則這些jar將自動部署到存儲庫(maven和/或bintray)。

目前,所有測試都在創建jar之前執行,因此有可能由於打包,jar包中的已編譯代碼將無法正常工作。

因此,為了簡化我的問題,我正在尋找一種Gradle配置,該配置可以對新制作的jar文件執行單元測試。

在Gradle中,您可以嘗試執行一些腳本任務,這些腳本任務從jar中運行代碼。 或復雜但簡單的POC均可。 在主gradle項目中,創建子項目“ child”。 在settings.gradle中添加有關它的信息:

include 'child'

在build.gradle中添加以下內容:

task externalTest {
    copy {
        from 'src/test'
        into './child/src/test'
    }
}
externalTest.dependsOn(':child:build')

jar.doLast {
    externalTest
}

並在依賴項的child / settings.gradle中添加父級jar:

compile files('../build/libs/parent.jar')

現在在構建的主項目中,子項目將在jar創建之后構建。

我認為沒有一種好的方法可以在單元測試中檢測到此類問題。 這是一種通常在集成測試中發現的問題。

如果您的工件/交付物是一個庫,那么集成測試通常沒有多大意義。 但是,您可能需要花費一些時間來創建使用您的庫的示例或測試應用程序,然后可以為其編寫集成測試。

您需要問自己是否存在足夠的此類潛在錯誤,以保證能夠做到這一點:

  • 我不認為您會很快再次犯此特定錯誤。
  • 這種性質的其他問題可能包括您的庫中關於OS平台或(偶爾)Java版本的假設……只有通過在不同平台上運行應用程序才能真正進行測試。

也許務實的答案是認識到您不能(或負擔不起)測試所有內容。


話雖如此,一種可行的方法可能是選擇一個獨立的測試運行程序(打包為非GUI Java應用程序)。 然后,讓Gradle以腳本任務的形式運行測試運行程序,並為您的庫提供JAR,並在類路徑上進行單元測試。

那就是我想出的:

test {

    // Add dependency on jar task, since it will be main target for testing
    dependsOn jar

    // Rearrange test classpath, add compiled JAR instead of main classes
    classpath = project.sourceSets.test.output + configurations.testRuntimeClasspath + files(jar.archiveFile)

    useTestNG()
}

在這里,我通過將文件夾與測試類,運行時依賴項和已編譯的JAR文件結合起來,來更改測試任務的默認類路徑。 不確定這樣做是否正確...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM