メソッドのパフォーマンステスト

ブログのネタに困っていたら、次の記事を思い出しました。

コメント欄にあるεπιστημηさんのアイデアがステキ。

"五秒の空待ちスレッド" と "重い処理スレッド" とをよーいどんしてどっちが早く終わるかテストすれば、長くとも五秒で結果が出るなり。

このアイデアを、既存のテスティングフレームワークっぽく実装してみました。

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);
});

メソッドのパフォーマンスもテストしておけば、早い段階でボトルネックが分かるかも。