Express Edition でのテスト駆動型開発 のバックアップ(No.2)

更新


公開メモ

目的

Visual C# 2008 Express Edition を用いてテスト主導型の開発を行いたい。

TestDriven

Visual Studio を用いてテスト主導型の開発を行うためのアドイン。

NUnit を同梱している。

開発ブログ:http://weblogs.asp.net/nunitaddin/default.aspx
ダウンロード:http://www.testdriven.net/download.aspx
インストールのしかた:http://d.hatena.ne.jp/kumat/20080516/p1

Visual Studio の無料バージョンである Express では、 プラグインの利用ができないため、TestDriven はうまく使えないみたい?

NUnit

しかたがないので、NUnit を単体で用いる。

http://www.tdd-net.jp/cs2008ee-nunit-25-helloworld.html

ここを見ながらやったところ、うまくいった。

ポイントは、

  • Visual Studio の [ツール]-[オプション]-[プロジェクトおよびソリューション]-[全般]-[ビルド構成の詳細を表示] をチェックすること
  • ビルド時の構成を [デバッグ] にすること
  • NUnit で [Tool]-[Settings]-[IDE Support]-[Visual Studio]-[Enable Visual Studio Support] をチェックすること
  • NUnit で New Project とするのではなく、Open Project から Visual Studio のプロジェクトをそのまま開くこと

なのだけれど、チュートリアルがなければ絶対にできないので注意。

[New Project] としてから [Project]-[Add VS Project] としたのでは、

"System.NullReferenceException : オブジェクト参照がオブジェクトインスタンスに設定されていません。For further information, use the Exception Details menu item."

というエラーが出る。言われたとおりに [Tools]-[Exception Details...] を見てみると、

"System.NullReferenceException... 場所 NUnit.Util.TestLoader.ReloadTest(RuntimeFramework framework)"

としか表示されない。

この手順でなぜうまく行かないのかは分からないけれど、 上の手順でうまく行くので追求はしない。

テストコード実行中のデバッグ

テストコードを NUnit 経由で実行中に、Visual Studio のデバッガーを使って 開発中のコードをデバッグしたい。

テストコードはクラスライブラリとして作るので、デバッグの開始動作を NUnit の起動にしておけば簡単にできそう。

で、クラスライブラリを外部プログラム経由でデバッグする方法は、

方法 : DLL プロジェクトからデバッグする
http://msdn.microsoft.com/ja-jp/library/605a12zt.aspx

にやり方が書いてあるのだけれど、実際にこれをやろうとすると、 [デバッグ] のページに [開始動作] の設定項目が見つからない。

  1. ソリューション エクスプローラで DLL プロジェクトを選択します。
  2. [表示] メニューの [プロパティ ページ] をクリックします。
  3. [Project プロパティ ページ] ウィンドウの [構成] ボックスで、[Debug] を選択します。
  4. [デバッグ] タブをクリックします。
  5. 次のいずれかの手順を実行して、アプリケーションを起動します。
    1. [開始動作] を [外部プログラムの開始] に設定します。

↑ここでつまづく。

かなり時間を使って調べたあげく、

http://msdn.microsoft.com/ja-jp/library/68c8335t.aspx

に、Express Edition ではできないと書いてあるのを見つけた。

先のページではできると書いてあるのに・・・

テストを走らせるためのプロジェクトを別に作る

テストを走らせるためのプロジェクトを作って、そこから走らすことにした。

Project1 というプロジェクトをテストするために
Project1Test というクラスライブラリを作って NUnit で走らせていた場合
Project1TestRunner という Windows アプリケーションを新たに作って以下のコードを書く。

LANG:C#
using System.Reflection;
using TestDriven.Framework;
using System.Collections;

namespace Project1TestRunner
{
    public partial class TestForm: Form
    {
        public TestForm()
        {
            InitializeComponent();
        }

        private void TestForm_Load(object sender, EventArgs e)
        {
            var runner = new NUnit.AddInRunner.NUnitTestRunner();
            var Listener = new Listener();
            runner.RunAssembly(Listener, 
                Assembly.GetAssembly(typeof(Project1Test.SomeTestClass)));
            Close();
        }
    }
    public class Listener: ITestListener
    {
        public void TestFinished(TestResult summary)
        { }
        public void TestResultsUrl(string resultsUrl)
        { }
        public void WriteLine(string text, Category category)
        { }
     }
}

見て分かるとおり、ダミーの Listener を割り当てて NUnit を走らせているだけ。

GetAssembly には、Project1Test に定義したクラスを1つ渡すことで、 Project1Test.dll のアセンブリに対するテストを行うことができる。

これをコンパイルするには、Project1TestRunner の参照設定に

  • Project1Test
  • nunit.addin
  • TestDriven.Framework

を追加しておく。

テストは実行する物の、成功しようが失敗しようが無視して終了するので、 デバッグしたいコードにブレークポイントを仕掛けてから実行すると良い。

ということで、アドインとしては使えなかった TestDriven がこんなところで役に立つ というお話。

以上を踏まえた開発手順

  1. Project1Test に新たなテストを書く
  2. NUnit からテストを行い失敗することを確認
  3. Project1 を修正
  4. NUnit からテストを行う
  5. 失敗したらブレークポイントを置いた上で Project1TestRunner から走らせて原因を特定&除去
  6. 4. に戻る
  7. 成功したら 1. に戻る

Counter: 21009 (from 2010/06/03), today: 1, yesterday: 0