2008-09-03 8 views
15

この種のものは、別のものであるquestionのものです。複数のスレッドから単体テストを行う最良の方法はありますか?

基本的には、一度ファイルにアクセスするコードがあれば(何分後に解答を見直しますか)にはどのような方法が良いでしょうか?

BackgroundWorkerのものをたくさん生成し、ファイルのロード/保存とファイル/オブジェクトのさまざまなサイズのテストを作成する方法を考えています。次に、スレッドからの応答を取得して、それが失敗したかどうか/成功したかどうか/世界が壊れたかどうかを確認してください。

あなたはこれに最も良い方法を提案できますか?私が前に言ったように、これは私にすべてのちょっと新しいです:)

編集

ajmastrean'sポスト次のとおりです。

私はDebug.Asserts :)


をテストするためにコンソールアプリケーションを使用しています

更新

私は元々BackgroundWorkerを使用してスレッドを処理していました(私はWindowsデベロッパーから慣れています)継続する前に複数のオペレーション(スレッド)を完了する必要があるテストを実行しているときに、これを行うにはちょっとしたハックになるだろうと私は気づきました。

その後、私はajmastreanの投稿をフォローし、実際には並行操作で作業するためにThreadクラスを使用しているはずです。私は今このメソッドを使ってリファクタリングします(別のアプローチですが)。

+0

Visual Studioテストツールを使用していますか?またはNUnitやMbUnitのようなサードパーティのツールですか?それぞれのマルチスレッドテストには非常に異なるパターンがあります。そして、その点については、あなたは_Unit testing_ですか、あるいは単にテスト目的のためにコンソールアプリを一緒に置いていますか? –

答えて

13

.NETではManualResetEventまたはAutoResetEventを設定しないと、ThreadPoolスレッドは返されません。私は簡単なテスト方法(作成、設定、管理するのに複雑なことは言及していません)のために、これらの過剰なものを見つけます。バックグラウンドワーカーも、コールバックなどで少し複雑です。作品私が発見した

何かがスレッドの配列を作成し

  1. です。
  2. 各スレッドのThreadStartメソッドを設定します。
  3. 各スレッドを開始します。
  4. ユニットテストの結果は、我々は何とかスレッドを同期する必要があり、予測可能でなければならないため、@ajmastrean(完全な他のすべてのスレッドまで現在のスレッドをブロックまたは中止)すべてのスレッドに参加
public static void MultiThreadedTest() 
{ 
    Thread[] threads = new Thread[count]; 

    for (int i = 0; i < threads.Length; i++) 
    { 
     threads[i] = new Thread(DoSomeWork()); 
    } 

    foreach(Thread thread in threads) 
    { 
     thread.Start(); 
    } 

    foreach(Thread thread in threads) 
    { 
     thread.Join(); 
    } 
} 
+0

これは、BackgroundWorkersが操作を完了する前にメインのアプリケーションスレッドが終了してからの同時実行性を扱うため、受け入れられました(そして、私はThread.Sleepの追加に疲れました!) –

-2

あなたの考えはうまくいくはずです。基本的には、たくさんのスレッドを生成し、ファイルを書き込むスレッドが実際に読者を待たせるのに十分な時間がかかるようにします。すべてのスレッドがエラーなく返され、永遠にブロックされない場合、テストは成功します。

1

。私はイベントを使わないでそれを行う簡単な方法を見ることができません。

私はそのThreadPoolを見つけました。QueueUserWorkItemを使用すると、そのようなユースケースを簡単にテストできます。

ThreadPool.QueueUserWorkItem(x => { 
    File.Open(fileName, FileMode.Open); 
    event1.Set(); // Start 2nd tread; 
    event2.WaitOne(); // Blocking the file; 
}); 
ThreadPool.QueueUserWorkItem(x => { 
    try 
    { 
     event1.WaitOne(); // Waiting until 1st thread open file 
     File.Delete(fileName); // Simulating conflict 
    } 
    catch (IOException e) 
    { 
     Debug.Write("File access denied"); 
    } 
}); 
関連する問題