介紹
由於Idea和Maven class loading的規則不同, 同樣的測試使用Maven運行和使用Idea運行可能會得到不同的結果。 而我們的CI(持續集成)往往是使用maven 命令去運行的。
在此情況下, 將測試使用maven運行起來, 然后結合IDEA強大的debug能力就顯得非常必要。如果熟練掌握此種debug方式, 也可以減少我們依賴idea進行編譯,更新index這些極其耗時的工作。
創建一個測試
假設我們已經創建了一個工程maven_debug, 並且創建了一個測試類MySuperClassTest
啟動mmaven測試並運行在debug模式
mvn -Dtest=MySuperClassTest -Dmaven.surefire.debug test
- JVM參數 -Dmaven.surefire.debug即表示將測試運行在debug模式下
- 這時maven將會首先編譯測試,然后啟動測試,並等待IDE接入debug模式, 此時我們要配置IDEA運行一個remote JVM debug進程, 接入mvn debug.
- 通常情況下, 測試將會監聽在5005端口。
配置remote JVM debug模板
- 打開idea, 從以下路徑 打開remote JVM debug配置界面 run-> edit configurations-> Edit configuration templates -> remote JVM debug
- 修改或檢查command line arguments for remote JVM 中的端口和其他參數正確, 端口即為上一步mven debug監聽的端口, 默認為5005
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
- 確保host參數正確, transport參數正確
- 參數都填寫正確后, 點擊appy按鈕保存修改, 這一步完成,代表我們的 remote JVM debug模板配置完成, 接下來我們需要基於此模版, 創建一個進程去連接maven測試。
啟動remote JVM debug進程
打開run/debug configuration界面, 路徑run-> edit configurations
點左上角+按鈕, 在彈出的選擇框中, 選擇remote JVM debug模板,創建一個run/debug配置,點擊apply保存。
此時在tools bar run/debug下拉列表就可以看到新創建的run/debug 配置, 單擊即可啟動此該remote JVM debug進程
設置斷點
在IDEA中設置斷點, 當程序運行到斷點位置就會停下。
其他
如果你需要debug一個maven插件 那么需要使用另外一個maven命令mvnDebug
mvnDebug -Dtest=MySuperClassTest test
mvnDebug 默認監聽在8000端口, 需要啟動一個remote JVM debug進程連接其8000端口, 這樣即可在IDEA中debug maven插件。
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000
參考文檔
How to Debug a Test Run with Maven
Run Maven tests with -Dmaven.surefire.debug and -DforkMode=never