ぴーさんログ

だいたいXamarin.Formsのブログ

.NET 6+, MAUIで使えるデバイステストランナー

今回は.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の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を指定すると、自動的にテストを収集して実行してくれます。

テストランナー画面

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

[NUnit向け] NUnit.Maui.Runner

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

使い方

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

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

テストランナー画面

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

おわり

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

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