Coyote
Coyoteは、同時C#コードをテストし、バグを決定的に再現するためのクロスプラットフォームライブラリとツールです。
Coyoteを使用して、 Concurrencyユニットテストと呼ばれるものを書くことにより、C#コードで同時性とその他の非皮質主義を簡単にテストできます。これらは通常のユニットテストのように見えますが、同時のワークロード(アクター、タスク、ASP.NETコントローラーへの同時リクエストなど)を確実にテストできます。定期的な単体テストでは、通常、フレークネスのために並行性を回避しますが、コヨーテを使用すると、バグを見つけるためにテストの同時性を受け入れることが奨励されます。
Coyoteは、Azureの多くのチームが分散システムとサービスをテストするために使用されており、生産にコードを展開し、ユーザーに影響を与える前に、数百の同時実行関連のバグを見つけました。 Azure Service Architectの言葉で:
Coyoteは、開発プロセスの初期にいくつかの問題を発見しました。これは、通常生産に流れ込み、後で修正するのに非常に高価になるこの種の問題を発見しました。
Coyoteは、Microsoft Researchによる❤️で作られています。
次の簡単なテストを検討してください。
[ Fact ]
public async Task TestTask ( )
{
int value = 0 ;
Task task = Task . Run ( ( ) =>
{
value = 1 ;
} ) ;
Assert . Equal ( 0 , value ) ;
await task ;
}
このテストは、タスクが開始される前に通常実行されるため、ほとんどの場合に合格しますが、タスクを1
にvalue
するのに十分な速さを開始し、アサーションを失敗させるスケジュールが1つあります。もちろん、これは非常に素朴な例であり、バグは明らかですが、複雑な実行パスに隠されているはるかに複雑な人種条件を想像できます。
Coyoteの仕組みは、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など)から同時単位テストを実行できます。コヨーテは引き継ぎ、n反復の最初から最後までテストを繰り返し実行します(上記の例では10
に設定されました)。ボンネットの下で、コヨーテはインテリジェントな検索戦略を使用して、各反復でバグを隠す可能性のあるあらゆる種類の実行パスを探索します。
素晴らしいことは、バグが見つかると、コヨーテはengine.TestReport
を介してトレースを提供することです。テストラポートAPIは、バグを何度も希望どおりに再現するために使用できるため、問題のデバッグと修正が大幅に容易になります。
Coyoteを始めるのは簡単です!まず、このガイドに従って、Nugetからcoyote
コマンドラインツールをインストールします。これで、チュートリアル、ドキュメント、ハウツー、サンプル、およびプロジェクトに関する詳細については、Coyote Webサイトをチェックする準備ができました。楽しむ!
coyote
依存関係をアップグレードしますか?ここでChangelogを確認してください。
Coyoteは、「AS-IS」が提供されるオープンソースプロジェクトであることに注意してください。正式なサポートを提供することはできません。 Microsoftの従業員には、Friends of Coyote Teams Channelがあります。これは、質問に答えてお互いから学ぶのに役立つ内部コミュニティです。
このプロジェクトは、貢献と提案を歓迎します。ほとんどの貢献では、貢献者ライセンス契約(CLA)に同意する必要があります。詳細については、https://cla.opensource.microsoft.comをご覧ください。
プルリクエストを送信すると、CLAボットはCLAを提供し、PRを適切に飾る必要があるかどうかを自動的に決定します(たとえば、ステータスチェック、コメント)。ボットが提供する指示に従うだけです。 CLAを使用して、すべてのリポジトリでこれを1回だけ行う必要があります。
このプロジェクトは、Microsoftのオープンソース行動規範を採用しています。詳細については、FAQのコードを参照するか、追加の質問やコメントについては[email protected]にお問い合わせください。