レガシーを資産に変える:VB.NET × FlaUI で実現する「Windows Forms」自動テストの極意
こんにちは。現場で「動けばいい」と言われ続けてきたWindows Forms(WinForms)アプリを、現代のCI/CDパイプラインへと昇華させるための極意を伝授します。
VBAの「マクロの記録」から一歩踏み出し、真のエンジニアリングの領域へ足を踏み入れようとしているあなたへ。今日は、VB.NETを使ってWinFormsのUI操作を自動化し、リグレッションテストを完全自動化する手法を解説します。
—
1. なぜ「手動テスト」から脱却すべきなのか?
WinFormsアプリは、一度リリースすると「触るのが怖い」という呪縛に囚われがちです。ボタンを押すたびに画面が遷移し、データが更新される。この複雑な「状態」を人間の目で追い続けるのは、もはや限界です。
自動テストを導入するということは、「コードが正しく動くことを、プログラム自身に証明させる」というフェーズへの進化を意味します。これこそが、保守性を劇的に向上させ、あなたの時間を「単なる修正作業」から「設計の熟考」へとシフトさせる鍵なのです。
—
2. FlaUI:最強のUI自動化ツールとの出会い
WinFormsのUI操作を自動化するツールはいくつかありますが、現代のベストプラクティスはFlaUIです。これはかつてのUI Automation(UIA)をラップし、驚くほど直感的な操作を可能にしたライブラリです。
準備するもの
- Visual Studio 2022
- NuGetパッケージ: `FlaUI.UIA3` をプロジェクトにインストールしてください。
—
3. 実践:ボタン押下とテキスト検証の自動化コード
まずは、特定のボタンをクリックし、結果のテキストボックスの内容を確認する簡単なテストを書いてみましょう。
Imports FlaUI.UIA3
Imports FlaUI.Core
Imports FlaUI.Core.AutomationElements
‘ テストクラスの定義
Public Class FormAutomationTest
Public Sub ExecuteTest()
‘ 1. アプリケーションを起動(パスは環境に合わせて設定)
Using app = Application.Launch(“C:\Path\To\YourApp.exe”)
Using automation = New UIA3Automation()
‘ 2. メインウィンドウを取得
Dim window = app.GetMainWindow(automation)
‘ 3. UI要素を特定(AutomationIDが鍵です!)
Dim myButton = window.FindFirstDescendant(Function(cf) cf.ByAutomationId(“btnSubmit”))
Dim resultText = window.FindFirstDescendant(Function(cf) cf.ByAutomationId(“lblResult”))
‘ 4. アクションを実行
myButton.AsButton().Click()
‘ 5. 結果を検証(ここがテストの本質!)
If resultText.AsLabel().Text = “成功しました” Then
Console.WriteLine(“テストパス: UIの挙動は正常です。”)
Else
Throw New Exception(“テスト失敗: 期待値と異なります。”)
End If
End Using
End Using
End Sub
End Class
【極意】なぜ `AutomationID` が重要なのか?
初心者が陥りがちな罠は、ボタンの「名前(Textプロパティ)」で要素を探すことです。しかし、翻訳や微調整で名前は変わります。必ず `AutomationID` を設定する習慣をつけましょう。 これがUIテストの安定性を担保する唯一の道です。
—
4. 陥りやすいエラーとその対策
自動テストの現場で最も多いトラブルが「タイミング問題」です。
- エラー: `ElementNotFoundException` が頻発する。
- 原因: アプリの起動や処理の完了を待たずに、プログラムが次の行へ進んでしまっている。
- 対策: `FlaUI`の待機機能(WaitUntil)を使いましょう。
‘ 要素が表示されるまで最大5秒待機する
Dim myButton = window.FindFirstDescendant(Function(cf) cf.ByAutomationId(“btnSubmit”))
Retry.WhileNull(Function() window.FindFirstDescendant(Function(cf) cf.ByAutomationId(“btnSubmit”)),
TimeSpan.FromSeconds(5))
—
5. CI/CDパイプラインへの統合:自動化の真髄
テストコードを書いただけでは不十分です。GitHub ActionsやAzure DevOpsを使い、「コードをコミットするたびにテストが自動で走る」環境を作りましょう。
1. ビルド: ソリューションをビルドする。
2. 実行: `dotnet test` コマンドで先ほどのテストプロジェクトを走らせる。
3. 通知: テストが失敗したらSlackやTeamsに通知を飛ばす。
これにより、意図しないバグの混入を数分で検知できるようになります。これができれば、あなたはもう「動かないアプリ」に怯える必要はありません。
—
最後に:先輩からのアドバイス
「自動化」は手段であって目的ではありません。目的は、あなたの作るソフトウェアが、いつまでも信頼され、変更に強い状態であることです。
まずは1つのボタンから。次に1つのフォームから。小さく始めて、徐々にカバレッジを広げていきましょう。VB.NETという歴史ある言語の力を使いこなせば、レガシーなWinFormsも最新のモダンな開発プロセスに十分適応できるはずです。
もしコードが動かなくても焦ることはありません。それは、あなたが「新しい知識を学んでいる」証拠です。この記事が、あなたのエンジニアライフをより生産的にする助けになれば幸いです。
さあ、次のコミットで自動テストを走らせてみましょう!応援していますよ。
