1. 程式人生 > 實用技巧 >解決了一個IDA編譯程式碼時maven總是自動執行單元測試的問題

解決了一個IDA編譯程式碼時maven總是自動執行單元測試的問題

​ 眾所周知,idea的maven外掛上方,有一個“閃電”樣式的按鈕。網上介紹是:該按鈕保持按下狀態時,編譯程式碼時就不會自動執行單元測試。

​ 不過不知道為什麼,我們專案編譯時,即使選中這個按鈕,還是會執行單元測試,導致編譯時間非常久。所以之前每次編譯時,需要在終端裡面手工執行maven,加上-Dmaven.test.skip=true引數才行。

​ 之前由於專案緊張,就沒仔細思考原因,直到最近專案進度相對理想,有了一些空閒時間,於是開始研究這個問題。

1 首先我在idea設定裡面,把maven日誌級別改成debug,這樣編譯時就能輸出更多資訊

2 通過debug日誌分析,我發現選中“閃電”按鈕,idea編譯時,是給程式碼增加一個-DskipTests=true的引數。

網上查了一下maven.test.skip跟skipTests兩個引數區別,是這樣說的:

-DskipTests,不執行測試用例,但編譯測試用例類生成相應的class檔案至target/test-classes下。

-Dmaven.test.skip=true,不執行測試用例,也不編譯測試用例類。

3 從網上文章上看,加了這兩個引數maven都不會執行單元測試,但實際上在我們專案裡面skipTests引數是無效的。

4 於是我猜測,是不是有其它地方配置了skipTests引數,覆蓋了命令列的引數值。

於是全域性搜尋專案,發現在pom裡面有這樣的配置:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
                <encoding>${project.build.sourceEncoding}</encoding>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <skipTests>true</skipTests>
                <testFailureIgnore>true</testFailureIgnore>
            </configuration>
        </plugin>
    </plugins>
</build>

5 猜測是由於這個引數引導起的異常。嘗試把引數刪除,發現“閃電”按鈕現在可以生效了。猜測配置檔案裡面引數優先順序高於命令列的(這優先順序跟sptring-boot的不一樣,spring-boot是命令列引數最大)

6 後來又再網上找了一下,找到一篇完整介紹maven單元測試功能的文章,裡面有一行說明文字,也映證了我的猜測: “配置skipTests, configuration的配置優先順序最高,命令中得配置次之, properties的配置最低”

我這裡引用一下原文:

https://www.cnblogs.com/qyf404/p/5013694.html

3.1.3.在執行命令中宣告

在執行maven命令時可以宣告跳過測試用例

qyfmac$ mvn test -Dmaven.test.skip=true

qyfmac$ mvn test -DskipTests=true

3.1.4.跳過測試用例優先順序排序

首先分兩種情況,一種是配置skipTests,一種是配置maven.test.skip(真要命,宣告位置就三處了,還搞出兩個變數名,一共就是5種情況).

  • 如果是配置skipTests, configuration的配置優先順序最高,命令中得配置次之, properties的配置最低.
  • configuration > 命令 > properties
  • 如果是配置maven.test.skip,命令中得配置優先順序最高, properties的配置最低.
    命令 > properties
  • skipTestsmaven.test.skip有一個被設定成了true,則跳過測試用例.
    skipTests||maven.test.skip決定是否跳過測試用例執行.

7 總結一下這個問題解決思路:
a 檢視正常與異常日誌,對比差異
b 根據差異內容,百度查詢相關資訊
c 問題修復後,最好將修改還原,看是否能復現問題。(有助於分清故障出現的充分條件和必要條件)