Express Edition でのテスト駆動型開発

(4117d) 更新


公開メモ

目的

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 ではできないと書いてあるのを見つけた。

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

2009/11/18 追記

下のコメント欄で bobo さんが教えて下さったように GUI からは設定する項目がないのですが、 プロジェクトファイル *.csproj を直接編集して、

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
   ...

   <StartAction>Program</StartAction>
   <StartProgram>C:\Program Files\Develop\NUnit 2.5\nunit.exe</StartProgram>
   ...

</PropertyGroup>

のように、StartAction, StartProgram のノードを追加すると、 通常通り F5 を押すだけで nunit にデバッガをアタッチした状態で 起動することができました。

というわけで、以下の項目は必要ありませんね。

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

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

※2009/11/18 追記 : 当初はそうしてましたが、上記のようによりよい方法があるので、 この項目は必要なくなりました。

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. 上記方法で .csprj ファイルを編集し、 デバッガ上でテストを行うとブレークやステップ実行ができますので、 失敗の原因を探すのに役立ちます
  6. 4. に戻る
  7. 成功したら 1. に戻る

コメント




テストプロジェクトを外部プログラム(nunit)から実行する方法

[bobo] (2009-11-18 (水) 02:42:21)

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

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

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

ExpressEditionのGUI上からは設定できませんが、設定ファイルを直接編集することで可能です。

[project-name].csproj.userファイルの <PropertyGroup>タグ内に
以下の文言を入れてみてください。

   <StartAction>Program</StartAction>
   <StartProgram>xxx\nunit.exe</StartProgram>


※ xxxは適時読み替えてください。

  • 貴重な情報ありがとうございます。教えていただいた方法でデバッグできることが確認できました。これでずいぶん開発が楽になります。 -- [武内]

Counter: 20975 (from 2010/06/03), today: 2, yesterday: 0