かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

Windows Phone 7用の単体テストツール? その2「使ってみた」

1つ前の記事で見つけた単体テストのツールですが、調べてみたらSilverlight UnitTest Frameworkを使ってるみたいでした。ただ、素のSilverlight Toolkitに入ってるものではダメで下記のような例外が実行時に発生してしまいます。

Could not load type 'Microsoft.Silverlight.Testing.UnitTestSystem' from assembly 'Microsoft.Silverlight.Testing, Version=2.0.5.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35'.

ということで軽くぐぐってみたらMango用にSilverlight UnitTest Frameworkをビルド?改造?してくれてる人がいました。

Beta用にビルドされたものですが、日本語対応しているRCでの動作も確認できました。

このJeffさんのプロフィールを見る限りMSの中の人でSilverlight ToolkitとかUnitTest Frameworkを作ってる人っぽいですね。

Jeff Wilcox is a Senior Software Development Engineer at Microsoft, on the Silverlight team. 
He built the Silverlight Toolkit & Silverlight Unit Test Framework. 
Jeff lives in Seattle.

ということで簡単なサンプルプロジェクトを作って試してみようと思います。

ダウンロードと解凍

上記のページからTestFx20110609.zipをダウンロードします。zipを右クリックしてプロパティの一般ページからブロックを解除しておきます。

プロジェクト対象プロジェクトの作成

次に、Windows Phone 7アプリケーションを新規作成します。名前はCalcAppにしました。対象とするプラットフォームはもちろんWindows Phone 7.1です。

そして、今回のテスト対象のCalcクラスを作成して以下のように簡単に足し算をするメソッドを作ります。

namespace CalcApp
{
    /// <summary>
    /// 今回のテスト対象足し算クラス
    /// </summary>
    public class Calc
    {
        public static int Add(int x, int y)
        {
            return x + y;
        }
    }
}

あとは適当に画面にTextBoxを2つおいて、ボタンを置いてボタンを押したら計算結果をMessageBoxで表示するコードをさくっと組みます。今回は、単体テストツールの使い方が主目的なのでMVVMとかではなく、さくっと作ります。

private void button1_Click(object sender, RoutedEventArgs e)
{
    try
    {
        // 入力値を数字に
        var lhs = int.Parse(textBox1.Text);
        var rhs = int.Parse(textBox2.Text);

        // 計算
        var answer = Calc.Add(lhs, rhs);
        // 結果表示
        MessageBox.Show("計算結果 : " + answer, "情報", MessageBoxButton.OK);
    }
    catch (Exception ex)
    {
        // エラー内容の表示
        MessageBox.Show(ex.Message);
    }
}

実行すると、以下のような感じで動きます。

テストプロジェクトの作成

次に、テストプロジェクトを作成します。ここからが本番です。今回は、上記で作成したCalcクラスのテストをしたいと思います。将来計算ロジックが変わったりしたら不安ですからね!
ということで、Windows PhoneアプリケーションでCalcApp.Testという名前のプロジェクトを作成します。そして、ソリューションのフォルダにLibという名前でフォルダを作成して「TestFx20110609」内にあるものをまるっとコピーします。

そして、CalcApp.TestからLibフォルダにコピーしたdllを参照に追加します。

追加しようとすると警告が表示されますが気にせず追加します。

そして、MainPage.xaml.csに以下のようにコードを記述します。

using System.Windows;
using Microsoft.Phone.Controls;
using Microsoft.Silverlight.Testing;

namespace CalcApp.Test
{
    public partial class MainPage : PhoneApplicationPage
    {
        public MainPage()
        {
            InitializeComponent();
            // 単体テスト用の画面を表示する
            var testPage = UnitTestSystem.CreateTestPage() as IMobileTestPage;
            this.BackKeyPress += (x, xe) => xe.Cancel = testPage.NavigateBack();
            this.Content = testPage as UIElement;
        }
    }
}

この状態でCalcApp.Testをスタートアッププロジェクトに設定した実行すると以下のような画面が表示されます。

暫く放置しておくと、テストが実行された結果が表示されます。まだテストがないので以下のように何も表示されません。

下準備が出来たのでテストを作成します。CalcTestという名前でクラスを作成して、CalcApp.TestプロジェクトにCalcプロジェクトを参照に追加します。そしてCalcTest.csに以下のようなコードを書きます。ここらへんはSilverligh UnitTest Frameworkと同じ要領でいいみたいです。

namespace CalcApp.Test
{
    using Microsoft.VisualStudio.TestTools.UnitTesting;

    [TestClass]
    public class CalcTest
    {
        [TestMethod]
        public void AddTest()
        {
            Assert.AreEqual(10, Calc.Add(7, 3), "7 + 3は10のはず");
        }
    }
}

この状態で実行して、少し待つと以下のようにテスト結果が表示されます。

このプロジェクトはSkyDriveにアップしてるので以下からダウンロード出来ます。