概要
自作のC# WPFアプリケーションの作成に自動テストを導入した際の備忘録を残す
条件
- .Net8.0アプリケーション
- Visual Studio Community 2022
実施したこと
- Visual Studioの拡張機能などのインストール
- ソリューションを作成する
- GitHub Actionを設定
Visual Studioの拡張機能などのインストール
- .Netデスクトップ開発のオプション機能の中から"MSIX Packaging Tools"をインストール
- ユニバーサルWindowsプラットフォーム開発をオプションなしでインストール
(実際にはデフォルトでチェックが入っていた"IntelliCode"と"DirectX用グラフィックスデバッガーおよびGPUプロファイラー"だけインストール対象とした)
この2つがないとWindowsユニバーサルパッケージプロジェクトが作成できない
ソリューションを作成する
ソリューションの構成は、以下の2つに分離して作成
- 対象の開発プロジェクトとテストプロジェクトを含んだもの
- 対象の開発プロジェクトとWapプロジェクトを含んだもの
最初は全部一緒くたで構築したが、UnitTestsの自動ビルドの際に.sln単位でビルドがかかり、ApplicationWap.wapprojのエラーによりテストが通らない事態となったため、分離した。
GitHub Actionを設定
-
ソリューション、テストプロジェクト、パッケージパス、パッケージプロジェクトを設定する
この時変数はそれぞれ以下を指定。
Solution_Name: Application.sln(アプリとテストのソリューション)
Test_Project_Path: ApplicationTest.csproj
Wap_Project_Directory: ApplicationWap (ApplicationWapの保存フォルダ)
Wap_Project_Path: .\ApplicationWap\ApplicationWap.wapproj -
matrix:の設定にtargetplatformを追加
targetplatform: [x86, x64]
これはWPFだと必須らしい。
プロジェクトファイルを設定
-
Application.csprojのプロジェクトプロパティを変更
- プロジェクトファイルをダブルクリックしてxmlファイルにてTargetFramewokの設定を
- ターゲットフレームワーク
- ターゲットOS
- ターゲットOSバージョン"
の組み合わせに修正
- PlatformTargetの設定を追記
<TargetFramework>net8.0-windows7.0</TargetFramework> <PlatformTarget>x86</PlatformTarget>
- プロジェクトファイルをダブルクリックしてxmlファイルにてTargetFramewokの設定を
-
証明書を作成
今回はオレオレ証明書を作成(.pfx証明書ファイル)
参考:https://qiita.com/ttoori-ttoori/items/f756a1baabda6359995d -
ApplicationWap.wapproj内に証明書を設定
- 宣言を選択
- 使用可能な宣言から"証明書"を選択
- ストア名:”個人証明書”、コンテンツ:.pfxファイル名
を設定
-
Power ShellでSigningCertificate_Encoded.txtを作成(Actionのワークフローファイルにしたがって)
ワークフローファイルのコメントの通り以下を実行すると.txtファイルができる
# $pfx_cert = Get-Content '.\SigningCertificate.pfx' -Encoding Byte
# [System.Convert]::ToBase64String($pfx_cert) | Out-File 'SigningCertificate_Encoded.txt'
できたSigningCertificate_Encoded.txtの内容をGitHubのsecretフォルダに保管
Setting→Secret and variables→ActionsのSecretsタブでNew repository secretを選択し、BASE64_ENCODED_PFXファイルに.txtファイルのデータをコピー
(私はパスワードを設定しなかったのでパスワードファイルはおかなかったが、パスワードがあればPfx_Keyとして同じSecretsに追加)
その他心得
- テストは色んなパターンで通しておく
- ビルドのwarningはなくす、減らす
- エラーが出たらMESSAGEをちゃんと読んで書かれたことを対応する(意外とそれで治る)
- リモートでfailになる場合は同じことをローカルで実行して確認する