眾所周知,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 問題修復后,最好將修改還原,看是否能復現問題。(有助於分清故障出現的充分條件和必要條件)