爲了測試併發性問題,我想使用單元測試在兩個不同線程上完全同時調用同一個方法。實際上,我可能想在同一時間在幾個線程上調用相同的方法。多線程單元測試
我正在使用微軟內置的VS2008單元測試儀。
我的想法是,我會鎖定一個對象,然後同步設置每個線程,這些線程會立即等待鎖定,然後釋放允許所有線程訪問共享資源並測試代碼能力的鎖定正確處理多個線程。
以前有人做過這個嗎?我在這裏採取合理的方法嗎?
爲了測試併發性問題,我想使用單元測試在兩個不同線程上完全同時調用同一個方法。實際上,我可能想在同一時間在幾個線程上調用相同的方法。多線程單元測試
我正在使用微軟內置的VS2008單元測試儀。
我的想法是,我會鎖定一個對象,然後同步設置每個線程,這些線程會立即等待鎖定,然後釋放允許所有線程訪問共享資源並測試代碼能力的鎖定正確處理多個線程。
以前有人做過這個嗎?我在這裏採取合理的方法嗎?
這種方法的問題是結果不可重現。因此,如果代碼中存在錯誤,多次調用相同的測試會導致(例如)在某些情況下出現死鎖,而在其他情況下則不會。
我以前做過這件事,即使結果不總是可重複的,但它們可以突出顯示代碼中的問題或錯誤。
雖然我不使用Microsoft的單元測試,但我更喜歡MbUnit,它具有ThreadedRepeat屬性,允許您指定要運行的線程數。它使整個多線程測試變得更容易,只需編寫一個測試並添加一個屬性即可。
對於單元測試,我認爲這是次優的,因爲Kibbee表示它可能會或可能不會成功。您需要運行數百次或數千次,即使這樣,即使存在競爭條件,您也可能永遠不會遇到錯誤。
如果你試圖確保沒有死鎖,你可以看看typemock賽車手:http://www.typemock.com/learn_about_typemock_racer.html我沒有經驗,但它聽起來像它可以檢測到很多死鎖。
如果你使用單元測試來測試多線程代碼,你可能會做錯了。
對於初學者,您沒有任何保證,兩種方法將同時運行;這意味着您的測試不能保證您的代碼正常工作。
您可能可以通過插入睡眠命令來測試您的方法在多線程環境中是否正常工作,但這對單元測試來說太具侵入性;它實際上是一個概念證明,而不是我在確定代碼的某些部分按預期工作之後作爲單元測試離開的東西。
多線程測試本身很好,單元測試需要很長時間才能加速單元測試,但單元測試對於測試小型獨立方法是必不可少的。
你可能會考慮的是壓力測試,但這是「從外部」完成的,而不是像「從內部」這樣的單元測試。這意味着你可以在服務器上再次編寫一個客戶端,並從多臺機器運行數千次,測試整個系統,而不是單個孤立的方法。壓力測試有兩個主要優勢。首先,壓力測試用於準確地找到在實時情況下在一百次運行中發生的缺陷類型;其次,由於它們是「從外部」完成的,因此它們更好地重現了線程穿過您的線程的方式應用。
單元測試在我的opionion中對測試多線程代碼和通過調試器運行你的代碼不一樣 - 當一個線程正在等待你啓動下一步時,其他線程將超時,而你永遠不會有現實生活中的重現。總而言之,並不是所有的事情都應該進行單元測試;概念驗證測試是確保您的線程安全集合確實是線程安全的好方法,並且壓力測試對於發現多線程代碼中的錯誤非常有用。