2013-03-02 80 views
5

我正在使用一些遺留代碼,它本身有一些System.out.print命令。 我的eCobertura插件顯示這行紅色,所以我想單元測試它們。我們應該單元測試控制檯輸出嗎?

Here在stackoverflow我發現了一種方法來單元測試控制檯輸出,我很有趣。

這是我要做的事:

 private final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); 

     @Before 
     public void setUpStreams() { 
      System.setOut(new PrintStream(outContent)); 
     } 

     @After 
     public void cleanUpStreams() { 
      System.setOut(null); 
     } 

     @Test 
     public void out() { 
      System.out.print("Some message from the system"); 
      assertEquals("Some message from the system", outContent.toString()); 
     } 

到目前爲止好,測試變爲綠色,但是當我運行的代碼覆蓋率再次插件,我得到這個消息:

異常的線程「Thread-0」java.lang.NullPointerException在 net.sourceforge.cobertura.coveragedata.TouchCollector.applyTouchesOnProjectData(TouchCollector.java:186) at net.sourceforge.cobertura.coveragedata.ProjectData.saveGlobalProjectData(ProjectData.java: 267 )在 net.sourceforge.cobertura.coveragedata.SaveTimer.run(SaveTimer.java:31(Thread.java:662) ) 在java.lang.Thread.run

我有些疑惑:

  • 是否正確嘗試單元測試System.out.print()'s
  • eCoberturain是否與此類型的測試兼容?
  • 如果eCobertura與此類型的測試不兼容,爲什麼它會顯示紅色線?
  • 我的測試有什麼問題嗎?
  • 我使用jUnit 4.11你認爲這與它有關嗎?
  • 爲什麼eCobertura給我這個錯誤?

回答

6

它是正確的,試圖單元測試是System.out.print()的?

這很大程度上取決於您試圖測試的內容。我不認爲有必要測試System.out.print()本身,我希望Sun/Oracle已經做到了這一點。但是,如果您的應用程序向控制檯輸出重要信息,並且這是驗證輸出的唯一方法,則是的,您需要對其進行測試。 如果您可以通過測試相應的類來測試您的代碼,那麼您可能不需要測試輸出流本身。例如:我不會自己測試JDBC驅動程序,但我會測試所有代碼/功能,這些代碼/功能是從數據庫加載/保存數據的一部分。

紅線只表示代碼行從未執行過。這可以是好的,也可能意味着你的測試不會碰到他們應該的代碼的一部分。獲得測試覆蓋率高是很重要的,但目標是100%的可能並不總是必要的(認爲帕累託原則)

至於你的空指針異常

您對System.setOut(null);呼叫設置的System.out爲null, eCobertura可能會嘗試將某些內容寫入標準輸出,現在爲空。您可能需要在@Before方法中保存重要的外流,並將其恢復到我們的@After方法中,以允許使用以下代碼來使用StdOut

eCobertura是否與此類型的測試不兼容?

如果eCobertura與此類型的測試不兼容,爲什麼它會顯示紅色線?

爲什麼eCobertura會給我這個錯誤?

這可能是eclipse和eCobertura之間的通信是通過Standard Out發生的,但我不確定。如果是這種情況,比如果你重定向標準輸出不僅你的輸出,而且從Cobertura的輸出得到重定向和GUI不再看到什麼得到執行,什麼不是,因此着色它紅色

有東西在我的測試中錯誤?

可能需要確保StdOut被正確恢復。

我使用的是jUnit 4.11,你認爲這與它有什麼關係嗎?

不,我不這麼認爲

+0

這是一個非常好的答案,我同意所有的觀點。 +1 – sfrj 2013-03-02 15:10:06

+1

謝謝。我很高興能夠提供幫助。 – phisch 2013-03-02 15:13:42

3

如果在你的代碼中使用System.out.println's是正確的,那麼對(單元/集成)進行測試是正確的。

有一個有用的系統測試實用程序稱爲系統規則來測試這種類型的代碼。

http://stefanbirkner.github.com/system-rules/

+0

我明白這個建議。但我也有興趣確保'eCobertura'告訴我該行已被覆蓋。爲什麼這個異常被解僱? – sfrj 2013-03-02 14:02:41

+0

+1提框架 – sfrj 2013-03-02 15:10:39

相關問題