複数のスレッドから単体テストを行う最良の方法は何ですか?
-
09-06-2019 - |
質問
この種のは別のものの続きです 質問 私の。
基本的に、ファイルにアクセスするためのコードを取得したら (すぐに答えを確認します)、最善の方法は何でしょうか? テスト それ?
たくさんのものを生成するメソッドを作成しようと考えています 背景労働者か何かで、ファイルのロード/保存と、さまざまなファイル/オブジェクト サイズでのテストをすべてに指示します。次に、スレッドから応答を取得して、失敗したか、成功したか、世界を崩壊させたかなどを確認します。
これにアプローチする最善の方法について何か提案をいただけますか?前にも言ったように、これは私にとってまったく新しいことです:)
編集
続く アジュマストルアンの 役職:
私はコンソールアプリを使用して Debug.Asserts でテストしています:)
アップデート
当初は使用して巻いていました 背景労働者 スレッド処理に対処するために (Windows 開発で慣れているので)、続行する前に複数の操作 (スレッド) を完了する必要があるテストを実行しているときに、それがちょっとしたハックになることにすぐに気づきました。これをやるようにしてもらいます。
それから私はフォローアップしました アジュマストリーンの投稿を見て、実際に使用する必要があることに気づきました 糸 同時操作を行うためのクラス。次に、この方法を使用してリファクタリングします (アプローチは異なりますが)。
解決
.NETでは、 ThreadPool
設定しないとスレッドは返されません ManualResetEvent
または AutoResetEvent
s.これらは、簡単なテスト方法としてはやりすぎだと思います (作成、設定、管理が複雑であることは言うまでもありません)。バックグラウンド ワーカーもコールバックなどで少し複雑です。
私が見つけたうまくいくものは
- スレッドの配列を作成します。
- セットアップ
ThreadStart
各スレッドのメソッド。 - 各スレッドを開始します。
- すべてのスレッドで参加します (他のすべてのスレッドが完了するか中止されるまで、現在のスレッドをブロックします)
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();
}
}
他のヒント
@ajmastrean、単体テストの結果は予測可能である必要があるため、何らかの方法でスレッドを同期する必要があります。イベントを使用せずにそれを行う簡単な方法がわかりません。
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");
}
});
あなたのアイデアはうまくいくはずです。基本的には、大量のスレッドを生成し、ファイルを書き込むスレッドが実際にリーダーを待たせるのに十分な時間をかけて実行したいだけです。すべてのスレッドがエラーなく、永久にブロックされずに返された場合、テストは成功です。