由單元測試引發的打包慘案

大唐冠軍侯發表於2020-12-26

情景再現

自己寫了一個聚合專案,想把子模組打包出來java -jar執行一下,結果發現,專案在IDEA中可以正常執行,但是一打包就報錯,而且maven控制檯列印的日誌比平時多出好多,比較重要的日誌如下:

[INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ platform ---
[INFO] 
[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------

注意,這代表maven對你的單元測試部分的程式碼進行了檢驗,但是我的單元測試部分的程式碼是有問題的,單獨執行是可以的,但是maventest檢查的時候一直報錯,說什麼無法正確地選擇資料庫引擎什麼的(應該是我的測試類的配置有問題),結果就是我無法正常地打包。
總結一下,這個場景是:

  1. 專案中存在測試類;
  2. 專案無法打包;
  3. maven控制檯上的日誌比平時多出了好多(有啟動spring的標誌);
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.3.2.RELEASE)

解決方案

發現是測試類的問題,我們只需要讓maven跳過test環節即可,通常情況下使用maven package命令打包時,會自動執行test包下的各個單元測試。這是因為spring-boot-maven-plugin外掛已經整合了maven-surefire-plugin外掛,會自動執行junit test。但有一般情況我們是不需要自動執行這些測試的,不僅延長的打包所需要的時間。而且有些測試時連線了資料庫的,可能不經意間就對資料庫造成了影響。
我們有以下幾種方式來配置跳過test:

1. IDEA的配置

如果使用的IDE工具是IDEA,那麼可以直接在設定裡面配置:
File》Settings》
在這裡插入圖片描述
Apply之後點開maven可以看到test已經被劃掉了。
在這裡插入圖片描述

2. 修改pom檔案

2.1 非springboot專案
  <build>
        <plugins>                    
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>
        </plugins>
    </build>
2.1 springboot專案

spring-boot-maven-plugin外掛已經整合了maven-surefire-plugin外掛
只需要在pom.xml裡增加
true
即可。

<properties>
    <skipTests>true</skipTests>
</properties>

參考文章:

  1. 《maven專案打包跳過test》-- 良人與我
  2. 《MAVEN打包時跳過Junit測試》-- 少說點話

相關文章