2

私は一般的なトピックに関する一般的な考えやリンクを探していますが、現時点での私の特定の動機は、BackgroundWorkerおよび/またはTPLのいずれかを使用した進捗レポートに関連するUIタスクです。非同期プログラミング全般に関する私の経験レベルは初心者です。私が最もよく知っているテストツールは、NUnitとRhinoです。

私の頭のてっぺんからいくつかのブレインストーミングのアイデア:

  1. 気にしないでください。複雑すぎて、BGWまたはTPLをテストするだけです。
  2. ある種の偽物やモックを作ります。
  3. EventWaitHandlesを使用する
4

1 に答える 1

6

Nito.Asyncライブラリの単体テストを作成するときに学んだように、非同期コードの単体テストは世界で最も単純なことではありません。:)

まず、実際にテストしたいものを定義します。非同期アクションが実行されているかどうかをテストするだけですか、それともBGW /タスクがUI進捗レポートを適切に同期していることを確認しますか?

アクションのテストは非常に簡単です。アクションが完了するまで待ってから、事後条件を確認してください。(ただし、以下の例のように同期コンテキストを指定しない限り、BGWRunWorkerCompletedはスレッドで発生することに注意してください)。ThreadPool

適切な同期のテスト(たとえば、コードの各部分が正しいスレッドで実行されていること)はより複雑です。

テストごとに、同期コンテキストを確立する必要があります。これは、UI同期コンテキストをあざけることになります。私のNito.Asyncライブラリはそれを助けるかもしれません。これには、ActionThreadEAPコンポーネント(BGWなど)の所有とタスクのスケジューリング(など)に適した同期コンテキストを含む別のスレッドがありますTaskScheduler.FromCurrentSynchronizationContext

これは次のように使用できます(MSTestの例を使用)。

[TestMethod]
public void Test()
{
  using (ActionThread thread = new ActionThread())
  {
    thread.Start();

    // Anything passed to Do is executed in that ActionThread.
    thread.Do(() =>
    {
      // Create BGW or call TaskScheduler.FromCurrentSynchronizationContext.
    });

    // The thread is gracefully exited at the end of the using block.
  }
}

私は、適切な同期をチェックする最も簡単な方法であると考えていますThread.CurrentThread.ManagedThreadIdThread.CurrentThread.IsThreadPoolThreadテストコードを内から実行する場合はActionThread.Do、進行状況の更新(および完了通知)をそれに同期する必要がありますActionThread

Nito.Asyncユニットテストの多くはActionThreadこの方法で使用されるため、さまざまな例を探すことができます。

于 2010-12-07T20:16:15.720 に答える