您將如何測試具有一些併發功能的Ruby代碼?例如,讓我們假設我有一個預計可以防止死鎖的同步機制。有沒有一種可行的方法來測試它的真正作用?可以控制纖維的執行是前進的方向嗎?測試併發特性
測試併發特性
回答
我需要確保我編寫的gem(redis-native_hash
)可以處理對同一個Redis散列的併發寫入,檢測競爭條件並優雅地恢復。我發現爲了測試這個,我根本不需要使用線程。
it "should respect changes made since last read from redis" do
concurrent_edit = Redis::NativeHash.find :test => @hash.key
concurrent_edit["foo"] = "race value"
concurrent_edit.save
@hash["yin"] = "yang"
@hash["foo"] = "bad value"
@hash.save
hash = Redis::NativeHash.find :test => @hash.key
hash["foo"].should == "race value"
hash["yin"].should == "yang"
end
在此測試情況下,我剛纔實例代表Redis的哈希值的同時編輯另一個對象,有它做出改變,然後確定保存指向相同的散列已經存在的對象尊重這些變化。
並非所有涉及併發的問題都可以在沒有使用併發性的情況下進行測試,但在這種情況下是可行的。您可能想嘗試尋找類似的東西來測試您的併發解決方案。如果可能的話,它肯定是更容易的路線。
我明白你的觀點。對於特定情況,這是一個優雅的解決方法。 – PJK
我有完全相同的問題,並已實現了一個簡單的寶石使用斷點同步子流程:http://github.com/remen/fork_break
我也在http://www.hairoftheyak.com/testing-concurrency-in-rails/
記錄爲Rails3中先進的使用場景這絕對是一個棘手的問題。我開始使用線程編寫我的測試,並意識到他們的方式我測試的代碼已經實現,我需要進程ID(PID)實際上是不同的。線程使用與啓動線程的進程相同的PID運行。學過的知識。
就在那時,我開始探索叉子,並遇到了這個堆棧溢出線程,並與fork_break一起玩。非常酷,並且易於設置。儘管我不需要爲我所做的工作提供斷點,但我只是想讓進程同時運行,使用斷點在未來可能會非常有用。我遇到的問題是我不斷收到EOFError,我不知道爲什麼。所以我開始實現自己的分叉,而不是通過fork_break,並發現在被測代碼中發生異常。可悲的是堆棧跟蹤由EOFError對我隱藏,雖然我明白,子進程突然結束,這是怎麼回事。
我遇到的下一個問題是DatabaseCleaner。不管使用哪種策略(截斷或事務),子進程的數據在子進程完成時被截斷/回滾,因此子進程插入的數據消失了,父進程無法選擇並驗證它是正確的。
在我的腦海裏敲了一下,並嘗試了許多其他不成功的東西之後,我碰到了這個帖子http://makandracards.com/makandra/556-test-concurrent-ruby-code,這幾乎就是我已經在做的事情,只有一點點補充。調用「Process.exit!」在叉子的盡頭。我最好的猜測(基於我對分叉的相當有限的理解)是,這會導致進程突然結束,以至於當子進程結束時它完全繞過任何類型的數據庫清理。所以我的父進程,實際測試,可以繼續並驗證它需要驗證的數據。然後,在正常的測試掛鉤(在本例中爲黃瓜,但也可以很容易地rspec)期間,數據庫清理器會像通常進行測試一樣啓動並清理數據。
所以,只是想我會分享一些我自己的經驗教訓,在這個討論如何測試併發功能。
- 1. 測試併發性
- 2. Junit測試併發性
- 3. 使用Spock測試線程併發性
- 4. 我如何編寫測試併發性的Tornado單元測試
- 5. 測試/調試/修復PHP併發性問題的工具?
- 6. 測試併發/並行執行
- 7. Rails 3:A/B測試應用特性
- 8. 用某些特性運行xunit測試
- 9. Apache基準測試 - 併發性和請求數
- 10. 實例和靜態方法的併發測試的有效性
- 11. 此測試對測試併發問題有意義嗎?
- 12. 如何編寫單元測試,測試併發不變
- 13. Nightwatch js併發測試取決於登錄測試
- 14. DOTNET測試併發布測試TFS 2015年
- 15. 單元測試併發代碼
- 16. 禁用測試的併發執行
- 17. SQL併發測試更新問題
- 18. 使用Microsoft.EntityFrameworkCore.InMemory測試併發令牌
- 19. 爲什麼java併發測試失敗?
- 20. Docker組合和併發集成測試
- 21. 如何在本地測試併發?
- 22. 測試併發數據結構
- 23. 測試併發代碼的行爲
- 24. 如何在開發環境中測試後端實例的併發性?
- 25. 性能測試
- 26. 性能測試
- 27. 並行測試
- 28. 如何測試特定CSS屬性的瀏覽器性能?
- 29. 軟件測試:維護過程中新特性測試的名稱是什麼?
- 30. 性能測試對戰單元測試
即使在社區比Ruby社區更注重併發性的語言中,這仍是一個難題。 http://stackoverflow.com/questions/12159/how-should-i-unit-test-threaded-code –
任何機會,你可以發佈一些代碼,甚至僞代碼E?這很難一般地回答,並且很難知道您希望測試的代碼的哪些方面。 – davetron5000