2011-12-18 44 views
1

我有一個採取數據結構並寫入OutputStream的方法。我想編寫一個單元測試,確保給定輸入的該函數的輸出不會意外改變。使用junit檢查輸出是否穩定的最佳方法是什麼?

我覺得我的測試結構正確,使用JUnit理論。我的@DataPoints是一對標識符和示例數據結構,並且我有一個@Theory方法的輸出將與簽入到使用標識符使用getResourceAsStream獲取的版本控制的文件相同。

然而,痛苦的部分首先是生成這些文件。我目前非常醜陋的解決方案是一個名爲WRITE_TEST_OUTPUT的布爾常量,通常是錯誤的。當我想重新生成輸出文件(或者是因爲我更改了@DataPoints的列表,或者方法的期望行爲已經改變),我將此常量設置爲true,並且有一個測試,當這是真時,再次運行該函數將當前輸出文件寫入/ tmp中的目錄。然後它斷言該常數是錯誤的,所以我不會意外檢查一個常數爲真的版本。

讓代人僞裝成測試是非常方便的,所以我可以在Eclipse中運行它,但它看起來像一個可怕的kludge。這似乎是人們必須始終做的事情 - 其他人找到了什麼樣的解決方案?

回答

1

我可能會做的是檢測文件的存在,而不是使用外部修改的常量。所以,你必須像

public void testMethodOutput() { 
    if (new File(expectedOutput).exists()) { 
    // check method output against file 
    } else { 
    // generate expected output from current behaviour; test passes automatically 
    // (saves output to the expected-output file) 
    } 
} 

當你要更新的預期輸出,刪除文件,運行測試,提交新版本到版本控制。不需要更改源代碼。

看起來有點奇怪,正確的輸出是通過查看給定版本的程序來確定的,而不是你自己設置的東西(如果該版本有一個微妙的錯誤呢?)。可能這就暗示你的測試過於粗糙,反過來可能暗示你的方法本身太粗糙了。 (測試的氣味幾乎總是設計的氣味。)

+0

我不知道如何運行測試可以找出它應該保存在Maven模塊中的文件 - getResource()將返回目標下的目錄,而不是在src /測試/資源。 – 2011-12-18 10:57:36

相關問題