20

この種のことは、私の別の質問の続きです。

基本的に、ファイルにアクセスするためのコードを取得したら (すぐに回答を確認します)、それをテストする最良の方法は何でしょうか?

多くのBackgroundWorkerまたは何かを生成し、それらすべてにファイルのロード/保存を指示し、さまざまなファイル/オブジェクトサイズでテストするメソッドを作成することを考えています。次に、スレッドから応答を取得して、失敗したか、成功したか、世界を内破させたかなどを確認します。

これにアプローチするための最良の方法について何か提案はありますか? 前に言ったように、これは私にとってまったく新しいことです:)

編集

ajmastrean の投稿に続いて:

私はDebug.Assertsでテストするためにコンソールアプリを使用しています:)


アップデート

私は元々 、スレッド化に対処するためにBackgroundWorkerを使用していました (Windows 開発者の使用に慣れているため) 続行する前に複数の ops (スレッド) を完了する必要があるテストを実行しているときに、それが次のようになることに気付きました。これを行うためのちょっとしたハック。

その後、 ajmastreanの投稿をフォローアップしたところ、並行操作を処理するためにThreadクラスを実際に使用する必要があることに気付きました。この方法を使用してリファクタリングします (別のアプローチではありますが)。

4

3 に答える 3

16

.NETでは、sまたはsThreadPoolを設定しないとスレッドは戻りません。簡単なテスト方法(作成、設定、管理が複雑なことは言うまでもありません)には、これらのやり過ぎを見つけました。バックグラウンドワーカーも、コールバックなどと少し複雑です。ManualResetEventAutoResetEvent

私が見つけたものはうまくいく

  1. スレッドの配列を作成します。
  2. ThreadStart各スレッドのメソッドを設定します。
  3. 各スレッドを開始します。
  4. すべてのスレッドに参加します(他のすべてのスレッドが完了するか中止されるまで、現在のスレッドをブロックします)
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();
    }
}
于 2008-09-03T12:52:52.613 に答える
1

@ajmastrian、単体テストの結果は予測可能でなければならないため、何らかの方法でスレッドを同期する必要があります。イベントを使わずにそれを行う簡単な方法がわかりません。

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");
    }
});
于 2008-09-03T13:06:50.863 に答える
-2

あなたのアイデアはうまくいくはずです。基本的には、一連のスレッドを生成するだけで、ファイルを書き込んでいるスレッドが実際にリーダーを待機させるのに十分な時間がかかることを確認します。すべてのスレッドがエラーなしで、永久にブロックされることなく戻ってきた場合、テストは成功します。

于 2008-09-03T12:45:55.923 に答える