反覆運行單個測試用例是日常開發中很常見的行為。例如,項目代碼中有一個失敗的測試用例,開發人員就會想要再次運行這個測試以獲得詳細的錯誤報告,在修復該測試的過程中,開發人員也會反覆運行它,以確認修復代碼是正確的。如果僅僅為了一個失敗的測試用例而反覆運行所有測試,未免太浪費時間了,當項目中測試的數目比較大的時候,這種浪費尤為明顯。
maven-surefire-plugin提供了一個test參數讓Maven用戶能夠在命令行指定要運行的測試用例。例如,如果只想運行account-captcha的RandomGeneratorTest,就可以使用如下命令:
這裡test參數的值是測試用例的類名,這行命令的效果就是只有RandomGeneratorTest這一個測試類得到運行。
maven-surefire-plugin的test參數還支持高級一些的賦值方式,能讓用戶更靈活地指定需要運行的測試用例。例如:
星號可以匹配零個或多個字符,上述命令會運行項目中所有類名以Random開頭、Test結尾的測試類。
除了星號匹配,還可以使用逗號指定多個測試用例:
該命令的test參數值是兩個測試類名,它們之間用逗號隔開,其效果就是告訴Maven只運行這兩個測試類。
當然,也可以結合使用星號和逗號。例如:
需要注意的是,上述幾種從命令行動態指定測試類的方法都應該只是臨時使用,如果長時間只運行項目的某幾個測試,那麼測試就會慢慢失去其本來的意義。
test參數的值必須匹配一個或者多個測試類,如果maven-surefire-plugin找不到任何匹配的測試類,就會報錯並導致構建失敗。例如下面的命令沒有匹配任何測試類:
這樣的命令會導致構建失敗,輸出如下:
根據錯誤提示可以加上-DfailIfNoTests=false,告訴maven-surefire-plugin即使沒有任何測試也不要報錯:
這樣構建就能順利執行完畢了。可以發現,實際上使用命令行參數-Dtest-DfailIfNoTests=false是另外一種跳過測試的方法。
我們看到,使用test參數用戶可以從命令行靈活地指定要運行的測試類。可惜的是,maven-surefire-plugin並沒有提供任何參數支持用戶從命令行跳過指定的測試類,好在用戶可以通過在POM中配置maven-surefire-plugin排除特定的測試類。