テストを実施する流れ
前編で構築したテスト環境とテストケースを用いて、Webテストを実行してみましょう。手順は次の通りです。
- Selenium RCサーバの起動
- テスト対象サイトの起動
- NUnitを実行してテストを実施
(1)Selenium RCサーバの起動
まずSelenium RCのプロキシサーバを起動します。起動するには、「C:\selenium\selenium-server-1.0.1」フォルダに移動して次のJavaコマンドを実行します(JRE5.0以上必要)。
Selenium RCサーバーの起動コマンド
java -jar selenium-server.jar
このコマンドはよく使用するので、バッチファイルを作成しておいてもよいでしょう。
(2)テスト対象サイトの起動
ローカル環境のWebアプリをテストする場合は、他のVisual StudioインスタンスでASP.NETアプリを実行しておきます。もしくは以下のコマンドを使ってASP.NET開発サーバーを起動しておきます。
ASP.NET開発サーバーの起動コマンド
WebDev.WebServer.EXE /port:<ポート> /path:<物理フォルダ>
本稿のサンプルはマイコミジャーナルのサイトにアクセスするため、この手順は必要ありません。
(3)Visual Studioでテストの実行
いよいよテストを実行してみましょう。Visual Studioの「デバッグ開始」ボタンをクリックします。NUnitが起動したらRunボタンをクリックします。そうするとSeleniumのウィンドウが表示され、その後ブラウザにて自動テストが実行されます。
テストが終了するとNUnitに結果が表示されます。
テストに成功したことが確認できました。
主要なSeleniumコマンドのサンプル
実際の開発では、レコーディングに頼らず手動でテストコードを書いたほうが早い場合もあります。そこで主要なSeleniumコマンドを使ったコードのサンプルを示しておきます。以下はサイトにログインするイメージのコードです。
ログイン時のテストコードの例(C#)
//ログインページに移動
selenium.Open("/login.aspx");
//ユーザ名を入力
selenium.Type("ctl00_UserName", "aoki");
//パスワードを入力
selenium.Type("ctl00_Password", "aoki-pass");
//ログインボタンをクリック
selenium.Click("ctl00_LoginButton");
//ページの遷移が終わるまで待つ(30000ミリ秒超えればタイムアウト)
selenium.WaitForPageToLoad("30000");
//URLをチェック
Assert.IsTrue(selenium.GetLocation().Contains("default.aspx"));
//id「ctl00_aLogin」の文字列が「ログアウト」になっていることをチェック
Assert.AreEqual("ログアウト",selenium.GetText("identifier=ctl00_aLogin"));
// GetText(identifier=xxx) id属性もしくはname属性でオブジェクトを取得
// GetText(dom=xxx) Domでオブジェクトを取得
// GetText(xpath=xxx) XPathでオブジェクトを取得
// GetText(link=xxx) リンクを取得
//「ログアウト」というリンクのhref属性をチェック
Assert.IsTrue(selenium.GetAttribute("Link=ログアウト@href").Contains("/logout.aspx"));
//テスト結果のスクリーンショットを取る
selenium.CaptureScreenshot(@"C:\selenium\検証物1.png");
Seleniumコマンドの詳細を知りたい場合は「C:\selenium\selenium-dotnet-client-driver-1.0.1\doc\index.html」を開いて、ISeleniumインタフェースをチェックするとよいでしょう。
筆者がテストコードを書いた時の感想
本稿ではWebテストの自動化について紹介しました。最後に、筆者がテストコードを書いた時の感想とポイントを紹介しておきます。
- テスト作成は時間がかかるため導入時のコストは高い
- テスト完成後は再帰テストが簡単にできるので品質を維持しやすい
- Selenium IDEのクリップボードの種類をC#に設定しておくと便利
- 初期処理[SetUp]と終処理[TearDown]は基本クラスに記述したほうがコードがシンプル
- 結果を確認する画面が無い場合は、データベースの値を読み出してアサーションを記述した
- シナリオ全般で使うクラスの情報はグローバル変数的な領域に保存した
本稿を読んでWebテストに興味を持たれた方は、SeleniumとNUnitを試してみてはいかがでしょうか。