解決了一個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
skipTests
和maven.test.skip
有一個被設定成了true,則跳過測試用例.
即skipTests||maven.test.skip
決定是否跳過測試用例執行.
7 總結一下這個問題解決思路:
a 檢視正常與異常日誌,對比差異
b 根據差異內容,百度查詢相關資訊
c 問題修復後,最好將修改還原,看是否能復現問題。(有助於分清故障出現的充分條件和必要條件)