2009-09-03 45 views
0

我目前正在調試一些相當複雜的持久代碼,並嘗試在我進行測試時增加測試覆蓋率。傾銷單元測試的「真實世界」場景

我在生產代碼中發現的一些錯誤需要大量且非常具體的對象圖來重現。

儘管從技術上講,我可以在測試中坐下來寫出實例代碼的存儲桶以重現特定場景,但我想知道是否有工具可以爲我做這件事?

我想具體我想能夠轉儲出一個對象,因爲它在我的調試器框架中(可能是xml),然後使用一些東西來加載XML並創建對象圖來進行單元測試(例如,xStream等)。

任何人都可以推薦在這種情況下有用的工具或技術?

+1

是否真的沒有簡單的情況,可以重現錯誤的行爲?如果不是的話,我會把它看作一個功能測試。有了這種數據來觸發bug,我們有點超出了「單位」級別,恕我直言。 – Yishai 2009-09-03 22:52:31

+0

@易海 - 無論是單元測試還是功能測試都無關緊要嗎?無論哪種情況,他都希望自動化測試用例。 – ChrisW 2009-09-03 22:55:53

+0

@ChrisW - 一旦你開始從功能測試的角度思考它,就會打開一套完整的工具,並開始思考問題。它可能不會改變最終答案,但它應該改變我們對這個問題的看法。 – Yishai 2009-09-03 23:38:17

回答

2

我已經使用ObjectOutputStream來完成這種事情,但是XML應該可以正常工作。你需要使用一個可序列化的樹。您也可以嘗試JAXB或xStream等。我認爲這很簡單。如果你在你的代碼中有一個能夠以適合你的測試的形式構建結構的地方,那麼在其中注入序列化代碼,並將所有內容寫入文件。然後,刪除注入的代碼。然後,爲了測試,加載XML。您可以將文件填入類路徑的某處。我通常使用資源或配置目錄,並使用Thread.currentThread()。getContextClassLoader()。getResourceAsStream(name)獲取流。然後反序列化這些東西,而且你很好。

+0

使用ObjectOutputStream是一個很好的解決方案,除非您更改類,那麼您將需要重新生成整個對象圖並將其重新序列化。 – 2009-09-03 23:22:44

+0

對。我通常將注入的代碼放在某個地方。關於將其保留在工作環境中而不是家庭項目上,我會更正式。 – 2009-09-04 01:08:42

+1

+1您可以補充:1)任何形式的對象序列化在面對影響表示的類的變化時都是脆弱的; 2)在ObjectOutputStream上使用XML的優勢在於更容易「修復」引起的任何問題通過使用XML或文本編輯器的這種脆弱性。 – 2009-09-04 01:42:47

2

XStream在這裏有用。它將允許你實際上將任何POJO轉儲到XML中,而不必實現接口/註釋等。我遇到的唯一令人頭疼的事情是內部類(因爲它會嘗試和序列化引用的外部類)。

0

我不知道Java,但如果你改變你的類的實現,那麼你可能不再能夠反序列化舊的單元測試(它是從舊版本的類中序列化的)。因此,如果您更改類定義,將來可能需要花費一些精力來遷移單元測試數據。

2

我想你所有的數據都是保存在數據庫中的。您可以使用一些測試數據生成工具來使數據庫充滿測試數據,然後以SQL腳本的形式導出數據,然後在開始集成測試之前進行預加載。

您可以使用DBUnit在您的單元測試中預加載數據,在測試開始之前,它還有許多選項來驗證數據庫結構/數據。 http://www.dbunit.org/

對於數據庫中的測試數據生成,您可以使用許多商業工具。我不知道任何好的免費工具,可以處理像預定義的數據列表,預定義分佈的隨機數據,從其他表中的外鍵使用等功能。

+0

如果不清楚,db:unit可以簡單地將數據庫的當前狀態轉換爲它讀取的任何格式。 – ndp 2009-09-07 04:41:23