【入門編】Windows Formsアプリケーションの自動UIテストの基礎:FlaUIを用いた画面操作自動化スクリプトの作成 – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク

こんにちは!Windows Forms(WinForms)のレガシーな画面を相手に日夜格闘しているエンジニアの皆さん、あるいは「そろそろ手動テストの地獄から抜け出したい!」と願っているマクロ卒業生の皆さん。

私たちが長年愛用してきたVisual Basic (VB / VB.NET)ですが、「画面のテストを自動化するなんて、専用の有料ツールが必要なんでしょ?」と思っていませんか?

実は、オープンソースの強力なUI自動化フレームワーク「FlaUI」を使えば、VB.NETのコードだけで、まるで人間が操作しているかのようにWindows Formsアプリを自動テストできるんです。しかも、導入は驚くほどシンプル。

今回は、手動クリックの繰り返しやリグレッションテストの不安からあなたを解放する、FlaUIを使ったUIテスト自動化の極意を、優しく丁寧にお伝えします。ここをクリアすれば、あなたのVB.NET開発スキルは確実に次のステージへ進めますよ!

—

1. なぜWindows Formsのテストに「FlaUI」なのか?

私たちが作るWinFormsアプリは、ボタン、テキストボックス、グリッドなど、古き良きWin32 APIや.NETのコントロールで構築されています。

従来のテストツールは、画面の「座標(X, Y)」を無理やりクリックするものや、内部のコントロール構造に依存しすぎて壊れやすいものが多かったのです。しかし、FlaUIはMicrosoftが提供する「UI Automation (UIA)」という正統派の仕組みをラップしているため、以下のような圧倒的なメリットがあります。

  • コントロールを「名前(AutomationIdやテキスト)」で直接狙い撃ちできる
  • アプリの内部構造が変わっても、IDさえ生きていればテストが壊れにくい
  • 何より、慣れ親しんだVB.NETでそのまま書ける!

それでは早速、具体的なセットアップとコードの世界へ飛び込みましょう。

—

2. 開発環境の準備:NuGetでFlaUIを手に入れたら8割成功

まずは、Visual StudioでVB.NETのコンソールアプリ(またはテストプロジェクト)を新規作成してください。ここでは一番分かりやすい「Console App (.NET Framework または .NET 6/8)」を想定します。

必要なパッケージのインストール

NuGetパッケージマネージャーコンソールを開き、以下のコマンドを叩くだけです。

Install-Package FlaUI.UIA3

※`UIA3`は現在のWindows環境で最も標準的で強力なUI Automationプロバイダを操作するためのエンジンです。これだけで、FlaUIの全ての魔力があなたの手に入ります。

—

3. 実践!VB.NETで書く画面自動操作スクリプト

それでは、実際にテスト対象のWinFormsアプリを起動し、「テキストボックスに文字を入力し、ボタンをクリックして、結果のラベルを確認する」という一連の流れを自動化するコードを見てみましょう。

Imports FlaUI.Core
Imports FlaUI.Core.AutomationElements
Imports FlaUI.UIA3

Module Module1

Sub Main()
‘ ==========================================
‘ 1. テスト対象アプリケーションの起動
‘ ==========================================
‘ ※ご自身のWinFormsアプリのパスに変更してください
Dim appPath As String = “C:\MyApp\SampleWinFormApp.exe”

Console.WriteLine(“アプリを起動しています…”)
Using app As Application = Application.Launch(appPath)

‘ UIA3の自動化エンジンを初期化
Using automation As New UIA3Automation()

‘ ==========================================
‘ 2. メインウィンドウの取得
‘ ==========================================
‘ アプリが完全に立ち上がるまで少し待つ(タイムアウト付き)
Dim mainWindow As Window = app.GetMainWindow(automation, TimeSpan.FromSeconds(5))
Console.WriteLine($”ウィンドウタイトル: {mainWindow.Title}”)

‘ ==========================================
‘ 3. コントロールの特定と操作
‘ ==========================================
‘ WinForms上の「TextBox1」というAutomationIdを持つテキストボックスを探す
Dim txtInput As TextBox = mainWindow.FindFirstDescendant(Function(cf) cf.ByAutomationId(“TextBox1”)).AsTextBox()

If txtInput IsNot Nothing Then
txtInput.Text = “FlaUIからの自動入力テスト”
Console.WriteLine(“テキストボックスに入力しました。”)
End If

‘ 「Button1」というAutomationIdを持つボタンを探してクリック
Dim btnSubmit As Button = mainWindow.FindFirstDescendant(Function(cf) cf.ByAutomationId(“Button1”)).AsButton()

If btnSubmit IsNot Nothing Then
btnSubmit.Click()
Console.WriteLine(“ボタンをクリックしました!”)
End If

‘ ==========================================
‘ 4. 結果の検証(アサーション)
‘ ==========================================
‘ 処理結果を表示するラベルを取得
Dim lblResult As Label = mainWindow.FindFirstDescendant(Function(cf) cf.ByAutomationId(“LabelResult”)).AsLabel()

If lblResult IsNot Nothing Then
Dim actualText As String = lblResult.Text
Console.WriteLine($”結果ラベルの値: {actualText}”)

‘ 期待値と一致しているかチェック
If actualText = “正常に処理されました” Then
Console.WriteLine(“【テスト成功】期待通りの結果になりました!”)
Else
Console.WriteLine(“【テスト失敗】予期せぬ結果です。”)
End If
End If

End Using
End Using

Console.WriteLine(“テストスクリプトが終了しました。何かキーを押してください…”)
Console.ReadKey()
End Sub

End Module

—

4. コードの深掘り:初心者がハマりやすい「3つの罠」

上記のコードは非常に美しく動きますが、実際の現場(特にレガシーなWinFormsアプリ)では、いくつかの「罠」にハマりがちです。先輩エンジニアからのアドバイスとして、事前に知っておくべきポイントを解説します。

罠1: 「AutomationId」が見つからない!

WinForms(特に古いVB.NETのコード)では、デザイナーが自動生成したコントロールに明示的な名前(AutomationId)が振られていないことが多々あります。

  • 対策: FlaUIは `ByAutomationId` だけでなく、画面上の表示文字列(`ByName`)や、コントロールの型(`ByControlType`)でも検索できます。

‘ 名前(Textプロパティ)でボタンを探す場合
Dim btn = mainWindow.FindFirstDescendant(Function(cf) cf.ByName(“実行(&E)”))

可能であれば、テスト対象のWinForms側のコードで、各コントロールの `Name` プロパティがそのままFlaUIの `AutomationId` になるため、事前にコントロールに分かりやすい名前をつけておくことを強くお勧めします。

罠2: アプリの起動が追いつかずにエラーになる

`Application.Launch` の直後にコントロールを探しに行くと、画面の描画が完了する前にコードが実行されてしまい、`NullReferenceException` のようなエラーになります。

  • 対策: FlaUIには強力な待機機構があります。`GetMainWindow` にタイムアウト時間をしっかり指定すること、また非同期処理や重いデータバインドがある画面では、明示的に数秒待つ(`System.Threading.Thread.Sleep` や `Wait.Until`)配慮が必要です。

罠3: オブジェクトの解放漏れ(メモリリーク)

FlaUIを使う際、`Application` や `Automation` オブジェクトはWindowsの背後にあるCOMオブジェクトやプロセスと強く結びついています。

  • 対策: コード例でも使っている `Using` ステートメントを必ず使用してください。スコープを抜けた瞬間に確実にリソースが解放され、テスト実行後にゾンビプロセスがタスクマネージャーに残るのを防げます。

—

5. おわりに:ここをクリアすれば、基本はバッチリ!

お疲れ様でした!今回はFlaUIを用いたWindows Formsアプリケーションの自動UIテストの基礎について解説しました。

  • NuGetで `FlaUI.UIA3` を導入する
  • `Application.Launch` でアプリを起動し、`GetMainWindow` で画面を掴む
  • `FindFirstDescendant` で操作したいコントロールを名前やIDで取得し、`.Click()` や `.Text` で操作する

この基本の型さえ押さえてしまえば、毎回のリリース前に行っていた絶望的な手動デバッグ地獄から解放され、ボタン一発でテストが走り抜ける爽快感を手に入れることができます。

「マクロの記録」のように壊れやすい自動化から卒業し、ロジカルで堅牢なVB.NETの自動テストコードを書けるようになったあなたなら、どんなレガシーシステムだって怖くありません。

ぜひ、あなたの手元のWinFormsプロジェクトに組み込んで、この自動化の心地よさを体験してみてくださいね!

タイトルとURLをコピーしました