🎃

Friendlyで作ったWPFの自動テストをGithub Actions上でテストする(.NET Framework編)

2022/07/09に公開

WPFで作成されたアプリケーションのUIを自動化したいというのは、誰もが夢見つつ、実際に実現するのはなかなかにハードルが高い目標だと思います。

何しろ価値のあるレベルのテストを維持すること自体が、死ぬほど大変なので、できている方々には尊敬の念しかありません。

さて本稿では、WPFアプリケーションの為のテストをFriendlyで作った場合に、それをGitHub Actionsで動作させるための方法について整理します。

Friendly自体の使い方は範囲に含めておりませんので、公式のドキュメントなどをご覧ください。

本稿のコードなどはこちらに公開しています。

前提

  • Friendlyで実装された .NET FrameworkベースのWPFアプリケーション向けテストが実装されている

.NET6.0などで実装されている場合は、ここの方法は利用できないためご注意ください。ただ .NET Frameworkより簡単だと思います。

概要

ざっくりつぎの2つの手順が必要となります。

  1. GitHub Actions用のself-hosted runnerを立てる
  2. Actions用のWorkflowを記述する

なお本稿ではWPFアプリケーションをGitHub Actions上でビルドする方法についての説明は割愛しています。詳細は下記の記事も参考にしてください。

self-hosted runnerを立てる

WPFのUIテストをしようとした場合、つぎの2の条件が満たされている必要があります。

  1. Windows環境のrunnerであること
  2. 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