此任務允許使用 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
引擎
若要將這些內容放入測試類別路徑中,您可以遵循下列任一方法
<classpath>
元素指定其餘 JUnit 特定 JAR 檔案的位置(如上所述)。請閱讀 使用類別路徑元素 部分以取得更多詳細資訊。
測試由巢狀元素定義,例如 test
、testclasses
標籤(請參閱 巢狀元素)。
屬性 | 說明 | 必要 |
---|---|---|
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>
元素表示 類似 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>
在上述範例中,
src/lib/jupiter
目錄包含 Jupiter 測試引擎相關的 jar 檔案(已 列於本文檔的先前部分)。src/lib/junit-platform
目錄包含 JUnit 平台 jar 檔案(已 列於本文檔的先前部分)。
在 test
目標中,我們使用 classpath
巢狀元素指向包含這些 jar 檔案的 junit.engine.jupiter.classpath
和 junit.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-plain:此格式化程式會為所有測試案例列印簡短的統計資料行。
legacy-brief:此格式化程式會列印失敗或略過的測試資訊。
legacy-xml:此格式化程式會以 XML 格式列印測試統計資料。
注意:每個命名為 legacy
的格式化程式都會嘗試以類似 junit
任務的格式化程式格式化結果。此外,legacy-xml
格式化程式會產生 XML 以符合 junit
任務的 XML 格式化程式所遵循的相同架構。因此,此格式化程式產生的 XML 可以原樣供 junitreport
任務使用。
listener
元素支援下列屬性
屬性 | 說明 | 必要 |
---|---|---|
類型 | 使用預先定義的格式化程式(legacy-xml、 legacy-plain或 legacy-brief)。 |
這些選項只能擇一 |
classname | 實作 org.junit.platform.launcher.TestExecutionListener 或 org.apache.tools.ant.taskdefs.optional.junitlauncher.TestResultFormatter 介面的監聽器類別名稱
|
|
resultFile |
格式化結果寫入的檔案名稱。此屬性僅在監聽器類別實作 org.apache.tools.ant.taskdefs.optional.junitlauncher.TestResultFormatter 介面時才相關。
如果未指定此屬性的值,且監聽器實作
此檔案視為相對於監聽器上設定的 |
否 |
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 |
定義單一測試類別。
屬性 | 說明 | 必要 |
---|---|---|
名稱 | 測試類別的完整限定名稱。 | 是 |
方法 | 要執行的測試案例方法名稱的逗號分隔清單。如果指定此選項,則只會執行測試類別中的這些測試方法。 | 否 |
haltOnFailure | 如果在測試執行期間發生失敗,則停止建置程序(例外狀況也會視為失敗)。覆寫在 junitlauncher 元素上設定的值。 |
否 |
failureProperty | 在發生失敗時設定的屬性名稱(例外狀況也會視為失敗)。覆寫在 junitlauncher 元素上設定的值。 |
否 |
outputDir | 撰寫報告的目錄。 | 否;預設值是專案的基本目錄。 |
if | 僅在設定指定屬性時執行此測試。 | 否 |
unless | 僅在未設定指定屬性時執行此測試。 | 否 |
includeEngines | 測試引擎 ID 的逗號分隔集合。如果指定此選項,則只會使用這些測試引擎來執行測試。
例如: includeEngines="junit-jupiter" 將只使用 Jupiter 測試引擎來執行測試,並會忽略在類別路徑中找到的任何其他引擎。
|
否 |
excludeEngines | 測試引擎 ID 的逗號分隔集合。如果指定此選項,則在執行測試時會排除這些測試引擎。
例如: excludeEngines="junit-vintage" 將在執行測試期間排除 Vintage 測試引擎,並會使用在類別路徑中找到的任何其他引擎。
|
否 |
測試可以透過巢狀 listener
元素定義自己的監聽器。
可以透過 fork 巢狀元素在新的分岔 JVM 中執行測試。
根據模式比對定義多個測試。
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 的單一執行個體中執行。
自 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 數量。允許的值為
自 Ant 1.10.14 起 |
否;預設會在單一分岔 JVM 中啟動所有測試類別。 |
fork
元素允許以下巢狀元素
可透過 jvmarg
元素將其他 JVM 引數傳遞至分岔 JVM。例如
<fork ...> <jvmarg value="-Dfoo=bar"/> ... </fork>
jvmarg
允許 命令列引數 中說明的所有屬性
sysproperty
元素允許將 Java 系統屬性傳遞給分岔的 JVM
<fork> <sysproperty key="greeting" value="hello world"/> ... </fork>
此元素的屬性與 環境變數 的屬性相同
您可以使用 syspropertyset(s) 指定一組屬性,作為系統屬性使用
可以透過嵌套的 env
元素來指定要傳遞給分岔 JVM 的環境變數。有關 env
元素屬性的說明,請參閱 exec 任務中的說明。
可以使用 modulepath
元素來指定 Java 模組的位置,它是一個 類似路徑的結構。
<fork> <modulepath> <pathelement location="lib"/> <pathelement location="dist/test.jar"/> </modulepath> ... </fork>
可以使用 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.SimpleTest 和 org.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 測試類別的 testFoo 和 testBar 方法。
<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-xml
和 legacy-plain
格式化程式寫入 ${output.dir},在個別的檔案中。此外,上述 legacy-xml
和 legacy-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>