Friendlyで作ったWPFの自動テストをGithub Actions上でテストする(.NET Framework編)
WPFで作成されたアプリケーションのUIを自動化したいというのは、誰もが夢見つつ、実際に実現するのはなかなかにハードルが高い目標だと思います。
何しろ価値のあるレベルのテストを維持すること自体が、死ぬほど大変なので、できている方々には尊敬の念しかありません。
さて本稿では、WPFアプリケーションの為のテストをFriendlyで作った場合に、それをGitHub Actionsで動作させるための方法について整理します。
Friendly自体の使い方は範囲に含めておりませんので、公式のドキュメントなどをご覧ください。
本稿のコードなどはこちらに公開しています。
前提
- Friendlyで実装された .NET FrameworkベースのWPFアプリケーション向けテストが実装されている
.NET6.0などで実装されている場合は、ここの方法は利用できないためご注意ください。ただ .NET Frameworkより簡単だと思います。
概要
ざっくりつぎの2つの手順が必要となります。
- GitHub Actions用のself-hosted runnerを立てる
- Actions用のWorkflowを記述する
なお本稿ではWPFアプリケーションをGitHub Actions上でビルドする方法についての説明は割愛しています。詳細は下記の記事も参考にしてください。
self-hosted runnerを立てる
WPFのUIテストをしようとした場合、つぎの2の条件が満たされている必要があります。
- Windows環境のrunnerであること
- runnerはWindows Serviceではなく、ユーザーセッションで動作していること
GitHub ActionsでもWindowsのrunnerは提供してくれているのですが、2の方が満たされません・・・
とうことで、どこかにWindows OSを起動させておいて、ログインしっぱなしにしておいて、そのセッション上でコンソールからrunnerを起動しておく必要があります。
具体的なrunnerの立て方は、本稿記載後に変わる可能性もあるので、GitHubのドキュメントを参照してください。
基本的に公式が用意してくれているPowerShellのスクリプト片を、コピペして流していくだけです。Windowsサービスとしてインストールするかどうかだけ、Noを選択するように注意しましょう。
Workflowを記述する
詳細は長すぎるのでこちらをご覧ください。
ここではポイントを絞って解説します。
self-hosted runnerを利用する
いや、当たり前ですけどね・・・
runs-on: self-hosted
必要なソフトウェアをインストールする
MSBuild、NuGet、NUnit.ConsoleRunnerをインストールします。
FriendlyではデフォルトのテストライブラリがNUnitなので、コンソールからテストするためのランナーをインストールする必要があります。
# Add MSBuild to the PATH: https://github.com/microsoft/setup-msbuild
- name: Setup MSBuild.exe
uses: microsoft/setup-msbuild@v1.0.2
# Install Nuget.exe
- name: Setup Nuget
uses: Nuget/setup-nuget@v1.0.5
# Install NUnit console runner
- name: Install NUnit.ConsoleRunner
run: nuget install NUnit.ConsoleRunner -Version 3.13.0 -DirectDownload -OutputDirectory .
テスト対象をビルドする
パッケージをリストアしたあと、Debugビルドします。
- name: Restore Debug
run: msbuild $env:Solution_Name /t:Restore /p:Configuration=Debug /p:RestorePackagesConfig=true
- name: Rebuild Debug
run: msbuild $env:Solution_Name /t:Rebuild /p:Configuration=Debug /p:PackageCertificateKeyFile=GitHubActionsWorkflow.pfx /p:PackageCertificatePassword=${{ secrets.Pfx_Key }}
このサンプルではインストーラーまで作成しているため、アプリケーションのビルド時に証明書とそのパスワードを指定しています。
ユニットテストを実行する
NUnit.ConsoleRunnerを利用してテストを実行します。
- name: Run UnitTests
run: ./NUnit.ConsoleRunner.3.13.0/tools/nunit3-console.exe $env:Test_Dll_Path
このとき指定するのは、ビルド済みのテストプロジェクトのDLLです。ちょっと面倒ですね・・・
以上です!
Discussion