UI層は、その名のとおりユーザー・インターフェイスとなる層のことである。UIのWindows技術としては、大きくWindowsフォームとASP.NET Webフォームに分類することができる。今回はWindowsフォームでのテストファーストを例として取り上げ、NUnitFormsというオープンソースのツールを紹介する。
NUnitFormsは、NUnitを拡張したWindowsフォーム用のテスティング・フレームワークである。NUnitと同様にテスト・コードとしてUIの振る舞いを記述でき、NUnit-Guiから実行することで視覚的にテスト結果を判断できるようになる。NUnitFormsは、次のページからダウンロードできる。
インストールはここから最新バージョンのバイナリ版zipファイル(執筆時点では「NUnitForms-v1.3.1-bin.zip」)をダウンロードして、ローカル環境の任意の場所(例えば「C:\Program Files\NUnitForms-v1.3.1」)に解凍する。後は実際に使用する際に、「NUnitForms.dll」ファイルをアセンブリとして参照すればよい。併せて、同じフォルダの「nunit.framework.dll」ファイルもアセンブリとして参照する必要がある。
今回は、次の画面のようなWindowsフォームをNUnitFormsを利用したテスト・コードの例とともに紹介する(なお、執筆時点でNUnitFormsは.NET Framework 2.0に対応していないため、本稿では.NET Framework 1.1でテスト・コードを記述している)。本稿で使用するサンプル・コード全体は次のリンク先からダウンロードできる。
|
テスティングを行うWindowsフォームの例(LoginForm.csのデザイン) |
ユーザー名とパスワードを入力し、ログインを行うためのWindowsフォーム。[ログイン]ボタンをクリックすることでログイン処理が開始されるが、ユーザー名とパスワードが入力されていない状態で[ログイン]を実行すると、エラー・メッセージが表示される。 |
|
|
フォームは、「LoginForm」というクラス名で作成し(ファイル名は「LoginForm.cs」)、タイトルのテキスト(Textプロパティ)は「ログイン画面」に変更する。 |
|
|
[ユーザー名]テキストボックス。コントロール名は「txtUserName」、初期値(Textプロパティ)は「空文字列」、最大文字数(MaxLengthプロパティ)は「12」をそれぞれ指定する。 |
|
|
[パスワード]テキストボックス。コントロール名は「txtPassword」、初期値(Textプロパティ)は「空文字列」、パスワード文字(PasswordCharプロパティ)は「*」、最大文字数(MaxLengthプロパティ)は「16」をそれぞれ指定する。 |
|
|
[ログイン]ボタン。コントロール名は「btnLogin」、表示テキスト(Textプロパティ)は「ログイン」をそれぞれ指定する。[ログイン]ボタンのClickイベント・ハンドラを生成して、そこに[ユーザー名]/[パスワード]のテキストボックスの入力内容をチェックし、その内容がエラーに相当する場合には、[エラー・メッセージ表示]ラベルにエラー・メッセージを表示するコードを記述する。具体的な仕様は、ユーザー名が未入力の状態で[ログイン]がクリックされると[エラー・メッセージ表示]ラベルを「可視」に変更し(=VisibleプロパティをTrueに指定する)、そこに「ユーザー名を入力してください。」というテキストを表示する(=Textプロパティにテキストを設定する)。また、パスワードが未入力の状態で[ログイン]が実行されると、「可視」に変更し、「パスワードを入力してください。」というテキストを表示する。エラーがない場合には、ダイアログをそのまま閉じる。 |
|
|
[エラーメッセージ表示]ラベル。コントロール名は「lblErrorMessage」、初期状態(Visibleプロパティ)は「不可視(False)」。 |
|
上記のWindowsフォームに対するNUnitFormsを利用したテスト・コードは以下のようになる(ファイル名は「LoginFormTest.cs」)。なおNUnitFormsを利用するには、(前述のとおり)事前にNUnitFormsアセンブリとnunit.frameworkアセンブリへの参照が必要だ。
using System;
using System.Windows.Forms;
using NUnit.Framework;
using NUnit.Extensions.Forms;
namespace WindowsApplication.Test
{
[TestFixture]
public class LoginFormTest : NUnitFormTest
{
Form loginForm;
public override void Setup()
{
base.Setup ();
loginForm = new LoginForm();
loginForm.Show();
}
public override void TearDown()
{
loginForm.Close();
base.TearDown ();
}
public override bool UseHidden
{
get
{
return false;
}
}
[Test]
public void ログインフォームのタイトル表示()
{
FormTester loginFormTester =
new FormTester("LoginForm");
Assert.AreEqual( "ログイン画面", loginFormTester.Text);
}
[Test]
public void ユーザー名テキストボックスに設定されるべき値()
{
TextBoxTester userNameTester =
new TextBoxTester("txtUserName");
Assert.AreEqual(string.Empty, userNameTester.Text);
Assert.AreEqual(12, userNameTester["MaxLength"]);
}
[Test]
public void パスワードテキストボックスに設定されるべき値()
{
TextBoxTester passwordTester =
new TextBoxTester("txtPassword");
Assert.AreEqual(string.Empty, passwordTester.Text );
Assert.AreEqual(16, passwordTester["MaxLength"]);
Assert.AreEqual(char.Parse("*"),
passwordTester["PasswordChar"]);
}
[Test]
public void エラーメッセージラベルに設定されるべき値()
{
LabelTester errorMessageLabelTester =
new LabelTester("lblErrorMessage");
Assert.IsFalse(
(bool)errorMessageLabelTester["Visible"]);
}
[Test]
public void ユーザー名を入力しないとログインできない()
{
ButtonTester loginButtonTester =
new ButtonTester("btnLogin");
loginButtonTester.Click();
LabelTester errorMessageLabelTester =
new LabelTester("lblErrorMessage");
Assert.IsTrue(
(bool)errorMessageLabelTester["Visible"]);
Assert.AreEqual(
"ユーザー名を入力してください。",
errorMessageLabelTester.Text);
}
[Test]
public void パスワードも入力しないとログインできない()
{
TextBoxTester userNameTester =
new TextBoxTester("txtUserName");
Keyboard.UseOn( userNameTester );
Keyboard.Click(Key.U);
Keyboard.Click(Key.S);
Keyboard.Click(Key.E);
Keyboard.Click(Key.R);
Keyboard.Click(Key.DIGIT_1);
ButtonTester loginButtonTester =
new ButtonTester("btnLogin");
loginButtonTester.Click();
LabelTester errorMessageLabelTester =
new LabelTester("lblErrorMessage");
Assert.IsTrue(
(bool)errorMessageLabelTester["Visible"]);
Assert.AreEqual("パスワードを入力してください。",
errorMessageLabelTester.Text);
}
}
}
|
|
NUnitFormsを利用したテスト・コード(LoginFormTest.cs) |
本稿のサンプル・コードでは、LoginFormクラスが「WindowsApplication」という名前空間に所属している。 |
このようにNUnitFormsのコントロール・クラスを通じて、対応するUIのコントロールを制御できる。UI上のコントロールの値を取得するだけでなく、キーボードの制御やイベントの制御なども可能だ。
以下は、NUnitFormsの実行結果だ。
|
NUnitFormsの実行結果(NUnit-Guiの実行画面) |
NUnitに付属のNUnit-Guiアプリケーションを起動して、先ほど作成したテスト・コードを実行したところ。自動的にWindowsアプリケーションが起動され、テキストボックスなどに値が入力され、その実行結果が検証される。 |
NUnitFormsの詳しい利用方法については、下記サイトにドキュメントとして公開されているので参考にしてほしい。
また、今回はUI層の技術としてWindowsフォームを取り上げたが、Web UI技術であるASP.NET Webフォームでのテストファーストには、NUnitAspやVisual Studio 2005 Team SystemでのWebテストが利用できるので、興味がある方はそちらもぜひ試していただきたい。
|