2010-01-22 208 views
5

我正在嘗試創建一個模擬系統故障以確保Oracle Berkeley DB XML數據庫完整性的測試。在插入操作過程中,當前正在經歷數據丟失,所以我想設置一個測試,開始插入任意數量的文檔,並沿途解決這個過程(類似於電源線上的某個人)。在進程死亡後,我想生成一個新進程並打開數據庫以確保它正常打開。JUnit測試數據庫失敗?

單元測試是Maven構建中的衆多測試之一,並且此測試必須在Linux和Windows XP環境中運行。我目前的思考過程是爲這兩個操作系統制定一個腳本,因爲我可以使用該腳本來終止該進程並在其位置啓動一個新腳本。我有其他選擇嗎?我可以使用JUnit創建單獨的進程空間/ VM嗎?

+0

你想測試數據庫?或者你想測試你的代碼使用該數據庫? – 2010-01-22 18:20:49

+0

我想要它來測試我的代碼,因爲有問題的數據庫被嵌入。系統故障期間的數據損壞是非事務性Berkeley DB XML(我們必須使用)的已知問題 - 我在包裝代碼中實施了一些理智檢查以減輕損壞。 – toddk 2010-01-22 18:37:44

+8

然後,你會想編寫單元測試來證明你的理智檢查完成他們應該做的事情。您可以編寫數據庫接口模擬並模擬各種故障,以便確定行爲。根本問題是證明你實施的完整性檢查實際上可以防止你描述的腐敗。我不會在單元測試中做到這一點,除非在每次測試運行時失敗都是可重現的。如果他們不是,我會把這個測試當作一個性能/穩定性測試來代替。 – ShabbyDoo 2010-01-23 02:26:37

回答

1

我不會考慮這種測試單元測試,但你可能可以做這樣的事情。

  1. 使用ProcessBuilder類構造和啓動過程,存儲返回的過程對象。
  2. 開始插入記錄。
  3. 在某個點destroy()的過程。

請記住先前對此測試的非確定性性質的評論。

我遇到了SQLite team also doing a simulated failure strategy作爲其自動化測試套件的一部分。

0

這種類型的行爲非常適合交易。如果您的代碼要開始一個事務,那麼數據庫就會知道在事務由於進程死亡而中止時如何保持數據一致。你可能會在這裏重新發明輪子。每日跆拳道有一個很好的例子,我們如何欺騙自己reinventing the wheel

仔細看看你的第一個修訂版,並對自己說「手套」。

+4

你正在向合唱團傳道。我被告知我們不能使用數據庫的事務版本......所以我想我需要問「爲什麼不?」在進一步深入之前。 – toddk 2010-01-26 17:16:17

0

怎樣才能使用整個過程的線程insead?例如:

  • 您可以創建一個後臺工作線程併爲其提供一些工作負載。
  • 然後在主測試的線程中等待一個毫秒的隨機數。然後殺死線程。
  • 然後,也許你想等待緩存的數據保存(或不是,取決於你測試的)
  • 然後運行你的理智。如果投擲,測試將會失敗,因爲您需要!
  • 在這裏你完成了。

我寧願將上述測試稱爲集成測試。無論如何,它會做你需要的。 運行會多次測試每次運行的不同數據損壞情況。

0

我不認爲這適合於UNIT測試。 單元測試你想測試一小段代碼,例如你的理智代碼, 可能帶有一個模擬數據庫。或者只調用部分代碼。 你所指的是一個更復雜的測試,可能值得做 ,但不一定值得作爲單元測試 的一部分重複自動運行和重複運行,你大概經常運行(在構建或每晚或每當)。 添加這種測試也可能會減慢你的單元測試,並會對你的單元測試可以運行的環境施加限制 我建議編寫更小的單元測試,並將整個測試單獨測試在一起。

我。