2017-02-19 64 views
2

是否值得嘗試單元測試控制檯應用程序的主要方法?我應該單元測試一種主要方法嗎?

主要方法是不具有測試覆蓋率,現在唯一的代碼。

public static void main(String[] args) { 
    if (args.length != 2) { 
     System.out.println("Pass the root directory and the directory to scan."); 
     System.exit(1); 
    } 
    Path root = Paths.get(args[0]); 
    Path scan = Paths.get(args[1]); 
    Demo demo = new Demo(); 
    String output = demo.scan(root, scan); 
    System.out.println(output); 
} 
+2

沒有任何模擬依賴的能力(特別是'Demo#scan(Path,Path)'的結果,這段代碼並不是那種可測試的,這裏最有意義的單元測試就是以驗證不愉快的行爲(錯誤的參數,可能是不可靠的路徑)否則,你只是測試你的整個應用程序 – CollinD

+0

@CollinD OP可以使用[PowerMockito](https://github.com/powermock/powermock/wiki/) mockitousage#how-to-mock-construction-of-new-objects)來模擬Demo類。 –

回答

0

main方法仍然是代碼可以包含錯誤和引起不希望的應用程序行爲。因此,測試main方法可以像測試其他方法一樣進行。

不幸的是,main方法是static方法,這使得單元測試,而不不可能額外的框架。最好你的主要方法應該包含一個方法調用,那麼你不必擔心,如果你應該測試它。

總之,在我看來,以下測試可以用您main方法的。

  • 如果未提供路徑和/或掃描目錄,程序是否終止?
  • 結果是否打印到控制檯?

當然,這是可以理解的說,測試結果是很明顯的,我需要一個眼神的代碼要說它的工作原理或程序將失敗。另一方面,如果其他開發者不擅長改變你的代碼或需求改變,你將會有額外的參數來處理。它會那麼簡單嗎?

最後,在純粹的TDD過程中,您已經定義了相似的測試用例,在您完全編寫main方法之前必須對其進行覆蓋。

2

你在測試什麼,真的嗎?這是您在決定測試某些代碼段時必須自問的問題。

在一個理想的世界中,有100%的代碼和分支覆蓋是好的,並且必須確保代碼的能力時,重寫是一個巨大的好處是功能性的。然而,人們應該永不使用代碼覆蓋率單獨作爲測試覆蓋合適的「幸福」指標。

在這種情況下,你要看看漫長而艱難的,在你真的想在這裏檢查。考慮到你正在開發很多東西,並且你必須在這裏嘲笑幾乎所有東西,你現在可以做的事情是測試機械過程,「這個對象是否用這些參數調用這個方法?」坦率地說,這並不是一個好的測試。

我建議你專門測試Demo#scan代替main全部,因爲:

  • scan是需要的Demo一個新的實例,這是不容易注入到main的方法。是的,我知道你可以使用PowerMockito來完成這個任務,但是嘲弄出新的東西對我來說是一種考驗。
  • 您的應用程序將無法運行如果其中任何一個爲真:
    • args不接受的PARAMS
    • 通過args傳遞的路徑是無效或格式錯誤權數
  • 如果你確實走上了測試的道路,你會開始意識到你真的在測試很多庫代碼並確保庫代碼正常工作。這有一些優勢,但在這種情況下,果汁是不值得擠。
相關問題