shogouki's 技術系メモ

WindowsPhoneとか、WPFとか、Androidとかその辺の技術メモ

NUnitを使ってみるテスト

WindowsPhoneはおろか、今までxUnitは使用したことがありませんでしたが、

開発効率を上げるためにも自動テスト(ユニットテスト?)とやらを勉強しようと思い、

ひとまずWindowsPhoneでNUnitを使ってみました。

環境

NUnitを使用するためには

  • WP開発環境
  • NuGet

がインストールされている必要があります。

使い方

テスト対象の用意

まずは、適当にテスト対象のアプリを作ります。
f:id:shogouki3:20120318000854p:plain

で、適当にテスト対象のクラスを作ります。

public class Tax
{
    /// <summary>
    /// 消費税込の価格を返す
    /// </summary>
    /// <param name="price">税抜き価格</param>
    /// <returns>税込み価格</returns>
    public int AddExciseTax(int price)
    {
        return (int)(price * 1.05);
    }
}

テストアプリを追加

次に、テスト用のアプリプロジェクトを追加します。
f:id:shogouki3:20120318004929p:plain

このプロジェクトに対して、NuGetでNUnitをインストールします。
f:id:shogouki3:20120318001846p:plain

・・・何をどうしていいか分からないので、まずはNUnit_Readme.txtを読んでみます。
Readmeによると、

UnitTest.cs と Test_Readme.txt はいらないから消していいよ。
例は NUnitTest.cs に書いてあるから。

あと、MainPageのLoadedイベントのハンドラに
this.StartTestRunner(new Microsoft.Silverlight.Testing.UnitTesting.Metadata.NUnit.NUnitProvider());
って書いとけばおk

とのことなので、要らないファイルを消して、MainPageのLoadedに上記コードを記述します。

namespace TestApp
{
    public partial class MainPage : PhoneApplicationPage
    {
        // コンストラクター
        public MainPage()
        {
            InitializeComponent();
            this.Loaded += new RoutedEventHandler(MainPage_Loaded);
        }

        void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            this.StartTestRunner(new Microsoft.Silverlight.Testing.UnitTesting.Metadata.NUnit.NUnitProvider());
        }
    }
}

次に、Tax.cs のテストをするために、TestAppプロジェクトの参照にTargetAppを追加します。
f:id:shogouki3:20120318002548p:plain

そんで、NUnitTest.csのテストコードを書き換えます。

namespace TestApp
{
    [TestFixture]
    public class NUnitTest
    {
        [Test]
        public void TaxTestPass()
        {
            Assert.AreEqual(105, TargetApp.Tax.AddExciseTax(100));
        }
        [Test]
        public void TaxTestFail()
        {
            Assert.AreEqual(100, TargetApp.Tax.AddExciseTax(100));
        }
    }
}

この例では、100円の税込み価格が105円になるかチェックするテスト(成功例)と、
価格が変わらないテスト(失敗例)を記述しています。

実行してみる

のまえに、TestAppプロジェクトを右クリックして、スタートアップ プロジェクトに設定しておきます。

それが出来たらアプリを起動してみます。
起動すると、こんな画面が出てきて…
f:id:shogouki3:20120318004052p:plain

しばらくするとテストが実行されます。
f:id:shogouki3:20120318004445p:plain

右下を見てみると、「1Pass」「1Fail」と書いてあり、期待通りの結果になっているようです。
もう少し詳しく見てみると
f:id:shogouki3:20120318004525p:plain

このように、どのテストが失敗したか分かります。

まぁ、xUnitの実装方法についてはど素人なので、おかしなことやってるかもしれませんが…。
とにかく、これでテストするところまで出来ました。

あとは、リファクタリングするなり、なんなり。