為什麼 Maven 找不到要運行的 JUnit 測試
一、概述
在使用 Maven 項目時,開發人員經常會犯錯誤,導致 JUnit 測試在構建期間無法運行。 Maven 可能找不到要運行的 JUnit 測試有多種原因。在本教程中,我們將研究這些特定情況並了解如何解決它們。
2. 命名約定
Maven Surefire 插件在 Maven 構建生命週期的test
階段執行單元測試。重要的是,每當執行test
目標時,Maven 生命週期都會隱式調用 Surefire 插件——例如,在運行“ mvn test
”或“ mvn install
”時。
默認情況下,Surefire 插件會自動包含所有具有以下通配符模式的測試類:
- “**/Test*.java”——包括其所有子目錄和所有以“Test”開頭的 Java 文件名
- “**/*Test.java”——包括其所有子目錄和所有以“Test”結尾的 Java 文件名
- “**/*Tests.java”——包括其所有子目錄和所有以“Tests”結尾的 Java 文件名
- “**/*TestCase.java”——包括其所有子目錄和所有以“TestCase”結尾的Java文件名
因此,如果我們的測試不遵循上述通配符模式,Maven 將不會選擇這些測試來運行。但是,在某些情況下,可能需要遵循特定於項目的命名模式,而不是這些標準約定。在這些情況下,我們可以通過明確指定我們想要包含(或排除)的測試和其他模式來覆蓋 Surefire 插件。
例如,讓我們考慮以下pom.xml
:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M7</version>
<configuration>
<includes>
<include>**/*_UT.java</include>
</includes>
<excludes>
<exclude>**/BaseTest.java</exclude>
<exclude>**/TestsUtil.java</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
在這裡,我們可以看到除了標準命名約定之外,我們還包含了要運行的特定測試。此外,我們還排除了某些指示插件在測試階段不考慮這些測試的命名模式。
3. 不正確的依賴
在使用 JUnit 5 平台時,我們至少需要添加一個TestEngine
實現。例如,如果我們想用 JUnit Jupiter 編寫測試,我們需要將測試工件junit-jupiter-engine
添加到pom.xml
中的依賴項中:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M7</version>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.4.0</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
如果我們想通過 JUnit 平台編寫和執行 JUnit 3 或 4 測試,我們需要將 Vintage Engine 添加到依賴項部分:
<dependencies>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>5.4.0</version>
<scope>test</scope>
</dependency>
</dependencies>
4. 測試文件夾不正確
將測試放在錯誤的文件夾中是不考慮執行測試的另一個原因。這主要是由於某些 IDE(如 Eclipse)中的默認類創建路徑設置造成的。
為了提供一些背景知識,Maven 定義了一個標準的目錄結構:
- src
- main
- java
- resources
- webapp
- test
- java
- resources
- target
main
目錄是與應用程序本身相關的源代碼的根目錄,而不是測試代碼。 test
目錄包含測試源代碼。放置在src/main/java
目錄下的任何測試都將被跳過。相反,所有的測試和測試資源都應該分別放在src/test /java
和src/test/resources
文件夾下。
例如,源類文件應該放在這裡:
src/main/java/Calculator.java
並且,對應的測試類文件應該放在這裡:
src/test/java/CalculatorTest.java
5. 測試方法未public
Java 中的默認訪問修飾符是package-private
。這意味著在沒有附加訪問修飾符的情況下創建的所有類僅對同一包中的類可見。一些 IDE 具有標準配置,因此在創建測試時,它們將被標記為包私有。此外,測試方法可能被錯誤地標記為private
。
在 JUnit 4 之前,Maven 只會運行標記為public
的測試類。不過,我們應該注意,這不會成為 JUnit 5+ 的問題。但是,實際的測試方法應始終標記為public
。
讓我們看一個例子:
public class MySampleTest {
@Test
private void givenTestCase1_thenPrintTest1() {
...
}
}
在這裡,我們可以注意到測試方法被標記為private
。因此,Maven 不會考慮將此方法用於測試執行。將測試方法標記為public
將使測試能夠運行。
6. 包裝類型
Maven 提供了多個選項來打包應用程序。流行的包裝類型是jar
、 war
、 ear
和pom
。如果我們不指定包裝值,則默認為jar
包裝。每個包裝都包含一個綁定到特定階段的目標列表。
將包裝類型標記為pom
只會將目標綁定到deploy
和install
階段。在這種情況下將跳過test
階段。這可能是測試未按預期運行的情況之一。
有時,由於復制粘貼錯誤,Maven 包裝類型可能被標記為pom
:
<packaging>pom</packaging>
為了解決這個問題,我們需要指定正確的包裝類型。例如:
<packaging>jar</packaging>
7. 結論
在本文中,我們檢查了 Maven 找不到要運行的 JUnit 測試的特定情況。
首先,我們看到了命名約定如何影響測試執行。接下來,我們討論了為在 JUnit 5 平台上執行的測試添加的依賴項。此外,我們還注意到在不同文件夾中錯誤放置測試或使用私有測試方法可能會阻止測試運行。最後,我們看到了包裝類型是如何與每個階段的特定目標綁定的。