2017-09-25 85 views
1

我在節點項目中使用mysql。node.js上的單元測試mysql回滾

我想單元測試一個使sql事務的javascript函數。如果事務成爲鎖定監視器的受害者,則該函數具有處理失敗的代碼。

還是呢?

因爲我是單元測試,所以我只在一個本地數據庫上一次創建一個事務,所以永遠不會出現死鎖,對吧?我如何測試死鎖處理,如果它永遠不會發生?有沒有辦法強制它發生?

例子:

thisMustBeDoneBeforeTheQuery(); 
connection.queryAsync(/*This is an update*/).catch(function(err) { 
    undoThatStuffIDidBeforeTheQuery(); 
    // I hope that function worked, because my unit tests can't 
    // make a deadlock happen, so I can't know for sure. 
} 
+0

你應該嘲笑數據庫的東西,並在測試案例假死鎖錯誤。然後你可以測試你的錯誤代碼的有效性。這取決於你的用例。處理持久層的單元測試可能變得非常不安全。這也取決於你的代碼如何適合正確的測試策略。 – k0pernikus

+0

相關:https://stackoverflow.com/questions/8389149/how-do-you-mock-mysql-without-an-orm-in-node-js – k0pernikus

+0

它似乎嘲笑SQL可能工作。我會試一試。 –

回答

0

什麼是你的測試需要警惕或驗證的基本行爲?你需要測試你的mysql驅動程序嗎?還是MySql本身?我認爲@ k0pernikus確定了最高值測試:

假設數據庫客戶端由於死鎖而導致異常,那麼應用程序代碼如何處理它?

您應該可以非常容易地使用模擬庫或依賴注入來創建測試工具,並測試存根來模擬客戶端驅動程序返回死鎖異常。這不應該需要與mysql進行任何交互,除了初始調查之外,請查看mysql客戶端驅動程序的返回代碼/錯誤異常傳播的外觀。

這不是一個100%完美的測試,並且在mysql客戶端庫更改的情況下仍然會使您容易受到攻擊。


由於時間原因,確定性地重現併發問題通常是非常困難的。但使用SELECT ... FOR UPDATE和多個事務應該能夠確定性地重現mysql上的死鎖,以驗證您的客戶端庫代碼。