.NET 6+, MAUIで使えるデバイステストランナーを紹介します。

maui_device.jpg 今回は.NET 6以降、MAUI世代のユニットテストに使えるデバイステストランナーについて紹介します。

動機

Xamarin.Forms世代の頃には(古い内容のままでしたが)一応ユニットテスト用のプロジェクトテンプレートが存在していました。しかしこれは.NET 6以降のiOS, Androidアプリに対応していないため乗り換える必要がある、というお話です。 xUnit向け、NUnit向けと1つずつ紹介します。

デバイステストテストランナーとは?

ここではiOS, Androidアプリ上で実行するテストを"デバイステスト"(Device Tests)と呼びます。 テストランナーについては、xUnitやNUnitを使って書かれたテストコードを"収集して順番に実行する"存在を指します。 今回紹介するデバイステストランナーはiOS, Androidアプリとしてテストコードを実行するためのライブラリです。

なぜ必要なのか?

Visaul Studio組み込みで動くユニットテストランナーもありますが、あれらでは.NETコンソールアプリケーションとして実行するため、.NET for iOS/Androidのプログラムをテストできません。 iOS, Android固有の機能やクラスを利用するコードをテストするには、iOS, Androidアプリとして実行する必要があります。

[xUnit向け] Shiny.Xunit.Runners.Maui

  • [GitHub] https://github.com/shinyorg/xunit-maui
  • [NuGet] https://www.nuget.org/packages/Shiny.Xunit.Runners.Maui

GitHubのdotnet/mauiリポジトリの中にあるテストツールを切り出したものです。 元のテストツールはMAUIを使ってMAUIをテストするような作りになっているところを、ライブラリとして利用できるように工夫されています。

余談: MAUIプロジェクトではxharnessという実験的な内製ツールを使ってHeadless Testをしているようです。興味がある人は覗いてみてください。(dotnet/xharness: C# command line tool for running tests on Android / iOS / tvOS devices and simulators)

使い方

MAUIの新規アプリを作成して CreateMauiApp() の部分に .ConfigureTests() と .UseVisualRunner() を追加します。 TestOptions.AssembliesにxNuitのテストが定義されているAssemblyを指定すると、自動的にテストを収集して実行してくれます。

20231112195518.png

テストランナー画面

必要最低限の機能を備えているという感じ。テキスト入力によるフィルタリングがありがたいです。

20231112195920.png

20231112195953.png

20231112195935.png

[NUnit向け] NUnit.Maui.Runner

Xamarin.Forms版のNUnitテストランナーをForkしてMAUI仕様に手直ししたライブラリのようです。

  • [GitHub] https://github.com/JaneySprings/NUnit-MAUI-Runner/tree/master
  • [NuGet] https://www.nuget.org/packages/NUnit.Maui.Runner

使い方

まずConfigクラスを用意します。ProvideAssemblies()でNNuitのテストが定義されているAssemblyを返すようにしてください。

20231112195555.png

MAUIの新規アプリを作成して CreateMauiApp() の部分で .UseMauiApp<T>() に渡すApplicationクラスの型をテストランナーが用意したAppクラスに差し替えます。そして builder.Services に上で用意したConfigを登録します。

20231112195607.png

テストランナー画面

こちらも必要最低限の機能を備えているという感じ。ただテキスト入力フィルタは付いていません。

20231112195727.png

20231112195800.png

20231112195743.png

おわり

アプリの規模やプロジェクトごとの判断によるところではありますが、共通な部分は標準のテストランナーで.NETコンソールアプリとしてユニットテストを実行して、iOS, Android固有な部分は実アプリでテストすると割り切る判断もアリだと思います。公式ドキュメントも割とそんな世界観のように見えます。

とはいえ、MAUIのプロジェクトテンプレートにも何かしらユニットテストプロジェクトを用意してほしいところですね。

お気軽にご依頼・ご相談ください

前へ

【Movable Type】プラグインを使わずにMTEntryCategoriesタグを管理画面の並び順に表示&glueモディファイアで出力する方法!

次へ

Power Apps キャンバスアプリの動作が遅い!?そんな時にはパフォーマンスを改善できるかも!