ブログのネタに困っていたら、次の記事を思い出しました。
コメント欄にあるεπιστημηさんのアイデアがステキ。
"五秒の空待ちスレッド" と "重い処理スレッド" とをよーいどんしてどっちが早く終わるかテストすれば、長くとも五秒で結果が出るなり。
このアイデアを、既存のテスティングフレームワークっぽく実装してみました。
public static class Assert { public static void Performance(int expectedMillisecond, Action block) { bool finished = false; Exception error = null; Thread thred = new Thread((ThreadStart)delegate { try { block(); finished = true; } catch (Exception ex) { error = ex; } }); thred.Start(); thred.Join(expectedMillisecond); if (!finished) { thred.Abort(); throw new AssertFailedException("失敗"); } if (error != null) { throw error; } } }
使い方はこんな感じ。
// 100 ミリ秒以内にメソッドが終了すれば成功 Assert.Performance(100, () => { service.Update(code, data); });
メソッドのパフォーマンスもテストしておけば、早い段階でボトルネックが分かるかも。