読者です 読者をやめる 読者になる 読者になる

xin9le.net

Microsoft の製品/技術が大好きな Microsoft MVP な管理人の技術ブログです。

非同期メソッド入門 (14) - 単体テストの記述方法

近年の開発では単体テストがとても重要視されています。Visual StudioTeam Foundation Serverなどの進化を見ても、それが良く出ています。人によっては「テストコードがないプログラムなんて...」とか、「テスト書かないでコード書くなんて信じられない」とか言う方もいるかもしれませんね。そんな昨今、非同期メソッドに対してもちゃんとテストができなければなりません。ということで、今回は非同期メソッドに対するテストの記述方法について見ていきます。

テスト対象の準備

テストコードを見る前にテスト対象となるメソッドを準備しましょう。ここでは、Visual Studio 2010 + .NET Framework 4環境でも動くよう、TaskFactory.StartNewを利用したサンプルにしてみました。

public Task<int> GetValueAsync()
{
    return Task.Factory.StartNew(() =>
    {
        Thread.Sleep(1000);
        return 123;
    });
}

従来の書き方

これまでTask<T>を戻り値に持つメソッドに対するテストは、例えば次のように記述してきました。御覧の通り、Resultプロパティを利用して待機すればOKです。

[TestMethod]
public void TestMethod()
{
    var expect = 123;
    var actual = GetValueAsync().Result;  //--- 結果が返ってくるのを待機
    Assert.AreEqual(expect, actual);
}

新しい書き方

Visual Studio 2012 + .NET Framework 4.5環境では、上記を次のようにも記述できるようになりました。

[TestMethod]
public async Task TestMethod()  //--- 戻り値をTaskにする
{
    var expect = 123;
    var actual = await GetValueAsync();  //--- awaitで待機
    Assert.AreEqual(expect, actual);
}

コード中のコメントにもありますが、戻り値はTaskにしなければなりません。戻り値にvoidを指定するとテストの完了を待機してもらえなくなってしまうため、テストエクスプローラーにテスト結果が表示されません

これだけ見ると以前よりも記述が煩雑になってるのではないか感が否めませんが、async/awaitキーワードを利用した記述もできるようになったと認識して頂ければ良いと思います。