JUnitLauncher

說明

此任務允許使用 JUnit 5 架構啟動並執行測試。

JUnit 5 引入了一組較新的 API 來撰寫和啟動測試。它也引入了測試引擎的概念。測試引擎決定哪些類別被視為測試案例以及如何執行它們。JUnit 5 支援執行使用 JUnit 4 結構撰寫的測試,以及使用 JUnit 5 結構撰寫的測試。有關 JUnit 5 本身的更多詳細資訊,請參閱 JUnit 5 專案的說明文件,網址為 https://junit.dev.org.tw/junit5/

junitlauncher 任務的目標是允許啟動 JUnit 5 測試啟動器並建構測試要求,以便所選的測試可以由 JUnit 5 支援的測試引擎解析和執行。此任務本身了解什麼是測試案例,也不執行測試本身。

此任務會擷取 暫存目錄 內的測試輸出和組態資料。

注意:此任務依賴於 Apache Ant 發行版中未包含的外部函式庫。請參閱 函式庫相依性 以取得更多資訊。

注意:您必須在測試的類別路徑中擁有必要的 JUnit 5 函式庫。在撰寫此文件時,執行測試所需的一系列 JUnit 5 平台函式庫為

根據您要在測試中使用的測試引擎,您還需要在類別路徑中擁有下列函式庫

對於 junit-vintage 引擎

對於 junit-jupiter 引擎

若要將這些內容放入測試類別路徑中,您可以遵循下列任一方法

測試由巢狀元素定義,例如 testtestclasses 標籤(請參閱 巢狀元素)。

參數

屬性 說明 必要
includeTags 以逗號分隔的 JUnit 5 標籤 清單,描述要包含的測試。

自 Ant 1.10.7

excludeTags 以逗號分隔的 JUnit 5 標籤 清單,描述要排除的測試。

自 Ant 1.10.7

haltOnFailure true 表示如果任何測試發生任何失敗,建置都必須停止。JUnit 4+ 將失敗分類為斷言失敗和測試執行期間引發的例外。因此,此任務也將這兩種情況都視為失敗,並且不區分彼此。 否;預設為 false
failureProperty 在發生失敗時要設定的屬性名稱(測試中的例外也視為失敗)。
printSummary 如果將值設定為 true,則此任務在測試執行完成後,會將執行摘要列印到 System.out。從 Ant 1.10.10 開始,與先前版本不同,此任務本身會產生摘要,而不是使用 JUnit 5 平台產生的摘要。 否;預設為 false

巢狀元素

classpath

巢狀 <classpath> 元素表示 類似 PATH 的結構,可用於將任務設定為使用此類別路徑來尋找和執行測試。此類別路徑將用於

如果未為任務設定 classpath 元素,則會使用 Ant 本身的類別路徑來尋找測試類別和 JUnit 函式庫。

以下是設定類別路徑的範例,以在執行測試期間包含 Jupiter 測試引擎和 JUnit 平台函式庫。

<project>

    <property name="output.dir" value="${basedir}/build"/>
    <property name="src.test.dir" value="${basedir}/src/test"/>
    <property name="build.classes.dir" value="${output.dir}/classes"/>

    <target name="init">
        <mkdir dir="${output.dir}"/>
    </target>

    <path id="junit.platform.libs.classpath">
        <fileset dir="${basedir}/src/lib/junit-platform/"/>
    </path>

    <path id="junit.engine.jupiter.classpath">
        <fileset dir="${basedir}/src/lib/jupiter/"/>
    </path>

    <target name="compile-test" depends="init">
        <mkdir dir="${build.classes.dir}"/>
        <javac srcdir="${src.test.dir}"
           destdir="${build.classes.dir}">
           <!-- our tests only need JUnit Jupiter engine
           libraries in our compile classpath for the tests -->
           <classpath refid="junit.engine.jupiter.classpath"/>
        </javac>
    </target>

    <target name="test" depends="compile-test">
        <junitlauncher>
            <!-- include the JUnit platform related libraries
            required to run the tests -->
            <classpath refid="junit.platform.libs.classpath"/>

            <!-- include the JUnit Jupiter engine libraries -->
            <classpath refid="junit.engine.jupiter.classpath"/>

            <classpath>
                <!-- the test classes themselves -->
                <pathelement location="${build.classes.dir}"/>
            </classpath>
            <testclasses outputdir="${output.dir}">
                <fileset dir="${build.classes.dir}"/>
                <listener type="legacy-brief" sendSysOut="true"/>
                <listener type="legacy-xml" sendSysErr="true" sendSysOut="true"/>

            </testclasses>
        </junitlauncher>
    </target>
</project>
    

在上述範例中,

test 目標中,我們使用 classpath 巢狀元素指向包含這些 jar 檔案的 junit.engine.jupiter.classpathjunit.platform.libs.classpath。在此 test 目標中,我們還使用另一個 classpath 元素指向包含我們測試類別的位置。如有需要,所有這些類別路徑都可以合併成一個。

監聽器

junitlauncher 任務可以使用 listener(s) 來監聽測試執行事件(例如測試執行開始、完成等)。預期監聽器是一個實作 org.junit.platform.launcher.TestExecutionListener 的類別。此 TestExecutionListener 介面是 JUnit 5 平台 API 公開的 API,不特定於 Ant。因此,您可以在此任務中使用任何現有的 TestExecutionListener 實作。

測試結果格式化程式

junitlauncher 提供一種方式,可以自訂格式化和呈現測試執行結果。此任務允許透過使用 listener 元素來設定測試結果格式化程式。如前所述,listener 元素預期監聽器實作 org.junit.platform.launcher.TestExecutionListener 介面。通常,結果格式化程式需要在測試執行期間提供一些額外的設定詳細資料,例如格式化結果的寫入位置。任何此類監聽器都可以選擇實作 org.apache.tools.ant.taskdefs.optional.junitlauncher.TestResultFormatter 介面。此介面特定於 Ant junitlauncher 任務,且延伸 org.junit.platform.launcher.TestExecutionListener 介面

junitlauncher 任務內建下列預先定義的測試結果格式化程式類型

注意:每個命名為 legacy 的格式化程式都會嘗試以類似 junit 任務的格式化程式格式化結果。此外,legacy-xml 格式化程式會產生 XML 以符合 junit 任務的 XML 格式化程式所遵循的相同架構。因此,此格式化程式產生的 XML 可以原樣供 junitreport 任務使用。

listener 元素支援下列屬性

屬性 說明 必要
類型 使用預先定義的格式化程式(legacy-xmllegacy-plainlegacy-brief)。 這些選項只能擇一
classname 實作 org.junit.platform.launcher.TestExecutionListenerorg.apache.tools.ant.taskdefs.optional.junitlauncher.TestResultFormatter 介面的監聽器類別名稱
resultFile 格式化結果寫入的檔案名稱。此屬性僅在監聽器類別實作 org.apache.tools.ant.taskdefs.optional.junitlauncher.TestResultFormatter 介面時才相關。

如果未指定此屬性的值,且監聽器實作 org.apache.tools.ant.taskdefs.optional.junitlauncher.TestResultFormatter,則檔案名稱會設為預設值,且格式為 TEST-testname.extension(例如:legacy-xml 類型格式化程式的 TEST-org.myapp.SomeTest.xml

此檔案視為相對於監聽器上設定的 outputDir。如果監聽器上未設定 outputDir,則檔案視為相對於在其中執行此監聽器的測試的 outputDir

extension 附加到輸出檔名的副檔名。

自 Ant 1.10.13 起

否;legacy-xml 格式化程式預設為 xml,其餘則預設為 txt
outputDir 建立監聽器輸出的目錄。

自 Ant 1.10.6 起

sendSysOut 如果設為 true,則監聽器會傳遞測試產生的 stdout 內容。此屬性僅在監聽器類別實作 org.apache.tools.ant.taskdefs.optional.junitlauncher.TestResultFormatter 介面時才相關。 否;預設為 false
sendSysErr 如果設為 true,則監聽器會傳遞測試產生的 stderr 內容。此屬性僅在監聽器類別實作 org.apache.tools.ant.taskdefs.optional.junitlauncher.TestResultFormatter 介面時才相關。 否;預設為 false
if 僅在設定指定屬性的情況下使用此監聽器 if the named property is set
unless 僅在未設定指定屬性的情況下使用此監聽器 if the named property is not set
useLegacyReportingName 設為 true,如果此監聽器回報的測試識別碼應使用舊版(JUnit4 風格)名稱。否則設為 false。

自 Ant 1.10.10 起

否;預設為 true

test

定義單一測試類別。

屬性 說明 必要
名稱 測試類別的完整限定名稱。
方法 要執行的測試案例方法名稱的逗號分隔清單。如果指定此選項,則只會執行測試類別中的這些測試方法。
haltOnFailure 如果在測試執行期間發生失敗,則停止建置程序(例外狀況也會視為失敗)。覆寫在 junitlauncher 元素上設定的值。
failureProperty 在發生失敗時設定的屬性名稱(例外狀況也會視為失敗)。覆寫在 junitlauncher 元素上設定的值。
outputDir 撰寫報告的目錄。 否;預設值是專案的基本目錄。
if 僅在設定指定屬性時執行此測試。
unless 僅在未設定指定屬性時執行此測試。
includeEngines 測試引擎 ID 的逗號分隔集合。如果指定此選項,則只會使用這些測試引擎來執行測試。
例如:includeEngines="junit-jupiter" 將只使用 Jupiter 測試引擎來執行測試,並會忽略在類別路徑中找到的任何其他引擎。
excludeEngines 測試引擎 ID 的逗號分隔集合。如果指定此選項,則在執行測試時會排除這些測試引擎。
例如:excludeEngines="junit-vintage" 將在執行測試期間排除 Vintage 測試引擎,並會使用在類別路徑中找到的任何其他引擎。

測試可以透過巢狀 listener 元素定義自己的監聽器。

可以透過 fork 巢狀元素在新的分岔 JVM 中執行測試。

testclasses

根據模式比對定義多個測試。

testclasses 從任何數量的巢狀 資源 中收集包含的 資源集合。然後選擇名稱以 .class 結尾的每個資源。這些類別會傳遞給 JUnit 5 平台,讓平台決定並執行它們作為測試。

屬性 說明 必要
haltOnFailure 如果在測試執行期間發生失敗,則停止建置程序(例外狀況也會視為失敗)。覆寫在 junitlauncher 元素上設定的值。
failureProperty 在發生失敗時設定的屬性名稱(例外狀況也會視為失敗)。覆寫在 junitlauncher 元素上設定的值。
outputDir 撰寫報告的目錄。 否;預設值是專案的基本目錄。
if 僅在設定指定屬性時執行測試。
unless 僅在未設定指定屬性的情況下執行測試 否則
includeEngines 測試引擎 ID 的逗號分隔集合。如果指定此選項,則只會使用這些測試引擎來執行測試。
例如:includeEngines="junit-jupiter" 將只使用 Jupiter 測試引擎來執行測試,並會忽略在類別路徑中找到的任何其他引擎。
excludeEngines 測試引擎 ID 的逗號分隔集合。如果指定此選項,則在執行測試時會排除這些測試引擎。
例如:excludeEngines="junit-vintage" 將在執行測試期間排除 Vintage 測試引擎,並會使用在類別路徑中找到的任何其他引擎。

testclasses 可透過巢狀 listener 元素定義自己的監聽器。

可使用 fork 巢狀元素在新的分岔 JVM 中執行測試。此 testclasses 元素中包含的所有測試都將在新的分岔 JVM 的單一執行個體中執行。

fork

自 Ant 1.10.6 起

預設情況下,使用 junitlauncher 任務啟動的測試會在啟動任務的相同 JVM 中執行。可使用 fork 元素變更此行為。fork 元素及其屬性定義用於啟動測試的新 JVM 執行個體的特徵。
屬性 說明 必要
dir 將用於分岔 JVM 的使用者工作目錄
timeout 以毫秒為單位的數值,指定在此分岔 JVM 中執行的測試允許執行的最長持續時間。如果測試執行時間超過此設定值,則會終止 JVM
includeJUnitPlatformLibraries 如果設為 true,則組成 JUnit 平台的 jar 檔案將包含在分岔 JVM 的執行時期類別路徑中。如果設為 false,則此任務的 設定類別路徑(將提供給分岔 JVM 的執行時期類別路徑)預期會包含 JUnit 平台程式庫 jar 否。值預設為 true
includeAntRuntimeLibraries 如果設為 true,則組成 Ant 執行時期的 jar 檔案將包含在分岔 JVM 的執行時期類別路徑中。如果設為 false,則此任務的 設定類別路徑(將提供給分岔 JVM 的執行時期類別路徑)預期會包含 Ant 執行時期 jar 否。值預設為 true
java 用於啟動分岔 java 程序的指令。可將此屬性設為指向與目前用於執行 Ant 建置的不同 Java 安裝

自 Ant 1.10.14 起

forkMode 控制為分岔測試啟動的 JVM 數量。允許的值為
  • perTestClass - 此模式會在個別分岔的 JVM 中啟動每個測試類別。這些 JVM 會在每個測試類別執行完成時,依序逐一啟動。如果指定任何 timeout 值,則該逾時時間會套用至所有測試共同使用的時間,而非個別測試。

自 Ant 1.10.14 起

否;預設會在單一分岔 JVM 中啟動所有測試類別。
fork 元素允許以下巢狀元素
jvmarg

可透過 jvmarg 元素將其他 JVM 引數傳遞至分岔 JVM。例如

    <fork ...>
      <jvmarg value="-Dfoo=bar"/>
      ...
    </fork>
    

jvmarg 允許 命令列引數 中說明的所有屬性

sysproperty

sysproperty 元素允許將 Java 系統屬性傳遞給分岔的 JVM

    <fork>
        <sysproperty key="greeting" value="hello world"/>
    ...
    </fork>
    

此元素的屬性與 環境變數 的屬性相同

syspropertyset

您可以使用 syspropertyset(s) 指定一組屬性,作為系統屬性使用

env

可以透過嵌套的 env 元素來指定要傳遞給分岔 JVM 的環境變數。有關 env 元素屬性的說明,請參閱 exec 任務中的說明。

modulepath

可以使用 modulepath 元素來指定 Java 模組的位置,它是一個 類似路徑的結構

例如
<fork>
  <modulepath>
    <pathelement location="lib"/>
    <pathelement location="dist/test.jar"/>
  </modulepath>
  ...
</fork>
upgrademodulepath

可以使用 upgrademodulepath 元素來指定 Java 模組的位置,它會取代執行階段中可升級的模組,它是一個 類似路徑的結構

範例

啟動 JUnit 5 平台來執行 org.myapp.SimpleTest 測試

<path id="test.classpath">
    ...
</path>

<junitlauncher>
    <classpath refid="test.classpath"/>
    <test name="org.myapp.SimpleTest"/>
</junitlauncher>

啟動 JUnit 5 平台來執行 org.myapp.SimpleTestorg.myapp.AnotherTest 測試。如果 org.myapp.SimpleTest 中的任何測試失敗,則會停止建置程序。

<junitlauncher>
    <classpath refid="test.classpath"/>
    <test name="org.myapp.SimpleTest" haltOnFailure="true"/>
    <test name="org.myapp.AnotherTest"/>
</junitlauncher>

啟動 JUnit 5 平台來執行 org.myapp.SimpleTest 測試類別的 testFootestBar 方法。

<junitlauncher>
    <classpath refid="test.classpath"/>
    <test name="org.myapp.SimpleTest" methods="testFoo, testBar"/>
</junitlauncher>

選取任何符合 org/example/**/tests/**/ fileset 篩選器的 .class 檔案,在 ${build.classes.dir} 下,並將這些類別傳遞給 JUnit 5 平台,作為測試執行。

<junitlauncher>
    <classpath refid="test.classpath"/>

    <testclasses outputdir="${output.dir}">
        <fileset dir="${build.classes.dir}">
            <include name="org/example/**/tests/**/"/>
        </fileset>
    </testclasses>
</junitlauncher>

選取任何符合 org/example/**/tests/**/ fileset 篩選器的 .class 檔案,在 ${build.classes.dir} 下,並將這些類別傳遞給 JUnit 5 平台,作為測試執行。測試結果會由 legacy-xmllegacy-plain 格式化程式寫入 ${output.dir},在個別的檔案中。此外,上述 legacy-xmllegacy-plain 監聽器都設定為接收測試產生的標準輸出內容。legacy-xml 監聽器設定為接收標準錯誤內容。

<junitlauncher>
    <classpath refid="test.classpath"/>

    <testclasses outputdir="${output.dir}">
        <fileset dir="${build.classes.dir}">
            <include name="org/example/**/tests/**/"/>
        </fileset>
        <listener type="legacy-xml" sendSysOut="true" sendSysErr="true"/>
        <listener type="legacy-plain" sendSysOut="true" />
    </testclasses>
</junitlauncher>