Coyote
土狼是一個跨平台庫,也是用於測試並發C#代碼和確定性再現錯誤的工具。
使用Coyote,您可以通過編寫我們稱為並發單元測試的內容來輕鬆地測試C#代碼中的並發和其他非確定性。這些看起來像您的常規單元測試,但可以可靠地測試並發工作負載(例如,對ASP.NET控制器的參與者,任務或併發請求)。在常規的單元測試中,您通常會由於片狀而避免並發,但是藉助土狼,您被鼓勵在測試中接受並發以查找錯誤。
Azure中的許多團隊都使用土狼測試其分佈式系統和服務,並在將代碼部署在生產中並影響用戶之前發現了數百個與並發相關的錯誤。用Azure服務架構師的話說:
土狼在開發過程的早期發現了幾個問題,這種問題通常會流血到生產中,以後變得非常昂貴。
土狼是由Microsoft Research由❤️製造的。
考慮以下簡單測試:
[ Fact ]
public async Task TestTask ( )
{
int value = 0 ;
Task task = Task . Run ( ( ) =>
{
value = 1 ;
} ) ;
Assert . Equal ( 0 , value ) ;
await task ;
}
該測試將大部分時間通過,因為斷言通常會在任務啟動之前執行,但是在一個時間表中,任務啟動足夠快以將value
設置為1
從而導致斷言失敗。當然,這是一個非常幼稚的例子,這個錯誤很明顯,但是您可以想像更複雜的種族條件隱藏在復雜的執行路徑中。
土狼的工作方式是,您首先使用Coyote TestingEngine
API將上述測試轉換為並發單元測試:
using Microsoft . Coyote . SystematicTesting ;
[ Fact ]
public async Task CoyoteTestTask ( )
{
var configuration = Configuration . Create ( ) . WithTestingIterations ( 10 ) ;
var engine = TestingEngine . Create ( configuration , TestTask ) ;
engine . Run ( ) ;
}
接下來,您從CLI(通常是後構建任務)運行coyote rewrite
命令,以自動重寫測試和生產二進製文件的IL。這使土狼可以注入控制測試過程中並發執行的鉤子。
然後,您可以從您喜歡的單元測試框架(例如Xunit)中運行並發單元測試。 Coyote將接管並反复執行N迭代的測試(在上面的示例中,n配置為10
)。在引擎蓋下,土狼使用智能搜索策略來探索可能隱藏每次迭代中錯誤的各種執行路徑。
令人敬畏的是,一旦找到錯誤,土狼就可以通過engine.TestReport
為您提供跟踪。TestReportAPI,您可以根據需要可靠地可靠地重現錯誤,從而使調試和解決問題更加容易。
與土狼入門很容易!首先,遵循本指南,從Nuget安裝coyote
命令行工具。現在,您準備訪問Coyote網站以獲取有關該項目的教程,文檔,操作方法,樣本以及更多信息。享受!
升級您的coyote
依賴性?在此處檢查Changelog。
請注意,土狼是一個提供“原樣”的開源項目。我們無法提供任何正式的支持。對於Microsoft員工,我們有Coyote Teams頻道的朋友,這是一個內部社區,可以幫助回答問題並相互學習。
該項目歡迎貢獻和建議。大多數捐款要求您同意撰寫貢獻者許可協議(CLA),宣布您有權並實際上授予我們使用您的貢獻的權利。有關詳細信息,請訪問https://cla.opensource.microsoft.com。
當您提交拉動請求時,CLA機器人將自動確定您是否需要提供CLA並適當裝飾PR(例如狀態檢查,評論)。只需按照機器人提供的說明即可。您只需要使用我們的CLA在所有存儲庫中執行一次。
該項目採用了Microsoft開源的行為代碼。有關更多信息,請參見《行為守則常見問題守則》或與其他問題或評論聯繫[email protected]。