UITest と Xamarin.Forms の概要
重要
Visual Studio App Center は、2025 年 3 月 31 日に廃止される予定です。 完全に廃止されるまで Visual Studio App Center を引き続き使用できますが、移行を検討できる推奨される代替手段がいくつかあります。
UITest を Xamarin.Forms と共に使用して、何百ものデバイスでクラウドで実行する UI テストを記述できます。
概要
App Center Test を利用すると、開発者は iOS アプリと Android アプリのために自動化されたユーザー インターフェイス テストを記述できます。 同じテスト コードの共有など、若干の微調整を行うことで Xamarin.Forms アプリを Xamarin.UITest でテストできます。 この記事では、Xamarin.Forms で Xamarin.UITest を利用するためのヒントを紹介します。
このガイドは、Xamarin.UITest の知識を前提としています。 Xamarin.UITest に関する知識を得る場所として次のガイドを推奨しています。
UITest プロジェクトを Xamarin.Forms ソリューションに追加すると、Xamarin.Forms アプリケーションのテストを記述し、実行するための手順が Xamarin.Android または Xamarin.iOS アプリケーションの場合と同じになります。
要件
プロジェクトが 自動化された UI テストの準備ができているかどうかを確認するには、Xamarin.UITest を参照してください。
Xamarin.Forms アプリへの UITest サポートの追加
UITest は、画面上のコントロールをアクティブ化し、ユーザーが通常アプリケーションと対話する任意の場所で入力を提供することで、ユーザー インターフェイスを自動化します。 ボタンを押すか、ボックスにテキストを入力するテストを有効にするには、画面上のコントロールを特定する方法をテスト コードに与える必要があります。
コントロールを参照する UITest コードを有効にするには、各コントロールに一意の識別子を与える必要があります。 Xamarin.Forms では、この識別子を設定する推奨方法は、下の画像のように AutomationId
プロパティを使用することです。
var b = new Button {
Text = "Click me",
AutomationId = "MyButton"
};
var l = new Label {
Text = "Hello, Xamarin.Forms!",
AutomationId = "MyLabel"
};
AutomationId
プロパティも XAML に設定できます。
<Button x:Name="b" AutomationId="MyButton" Text="Click me"/>
<Label x:Name="l" AutomationId="MyLabel" Text="Hello, Xamarin.Forms!" />
Note
AutomationId
は BindableProperty
であり、バインディング式と設定することもできます。
テストに必要なあらゆるコントロールを一意の AutomationId
に追加してください (ボタン、テキスト エントリ、値を問い合わせる可能性があるラベルなど)。
警告
複数回 InvalidOperationException
のプロパティの設定 AutomationId
が試行されると、An Element
がスローされます。
iOS アプリケーション プロジェクト
iOS でテストを実行するには、 Xamarin Test Cloud Agent NuGet パッケージ をプロジェクトに追加する必要があります。 追加されたら、次のコードをメソッドに AppDelegate.FinishedLaunching
コピーします。
#if ENABLE_TEST_CLOUD
// requires Xamarin Test Cloud Agent
Xamarin.Calabash.Start();
#endif
Calabash アセンブリでは、パブリックではない Apple API が使用されるため、アプリは App Store によって拒否されます。 しかしながら、明示的にコードから参照されていないのであれば、Xamarin.iOS リンカーが最終 IPA から Calabash アセンブリを削除します。
Note
既定では、リリース ビルドには ENABLE_TEST_CLOUD
コンパイラ変数がないため、Calabash アセンブリがアプリ バンドルから削除されます。 ただし、デバッグ ビルドにはコンパイラ ディレクティブが既定で定義されています。これにより、リンカーはアセンブリを削除できなくなります。
次のスクリーンショットでは、デバッグ ビルドに設定されている ENABLE_TEST_CLOUD
コンパイラ変数を確認できます。
Android アプリケーション プロジェクト
iOS とは異なり、Android プロジェクトには特別なスタートアップ コードは必要ありません。
UITests を記述する
UITests を記述する方法については、UITest ドキュメントを参照してください。
Xamarin.Forms UI の AutomationId を使用する
UITests を記述するには、Xamarin.Forms アプリケーション ユーザー インターフェイスをスクリプト実行可能にする必要があります。 テスト コードで参照できるように、ユーザー インターフェイスのすべてのコントロールに AutomationId
を与えます。
UITests の AutomationId を参照する
UITests を記述するとき、AutomationId
値はプラットフォームごとに異なる方法で公開されます。
- iOS は
id
フィールドを使用します。 - Android は
label
フィールドを使用します。
iOS と Android の両方で AutomationId
を見つけるプラットフォーム非依存 UITests を記述するには、Marked
テスト クエリを使用します。
app.Query(c=>c.Marked("MyButton"))
省略形 app.Query("MyButton")
も機能します。
既存のソリューションへの UITest プロジェクトの追加
Visual Studio には、Xamarin.UITest プロジェクトを既存の Xamarin.Forms ソリューションに追加するためのテンプレートがあります。
ソリューションを右クリックし、[新しいプロジェクトのファイル>] を選択します。
Visual C# テンプレートから、テスト カテゴリを選択します。 UI テスト アプリ>のクロスプラットフォーム テンプレートを選択します。
この手順では、NUnit、Xamarin.UITest、および NUnitTestAdapter NuGet パッケージを含む新しいプロジェクトをソリューションに追加します。
NUnitTestAdapter は、Visual Studio が Visual Studio から NUnit テストを実行できるようにするサード パーティ製のテスト ランナーです。
新しいプロジェクトには 2 つのクラスも含まれています。 AppInitializer には、テストを初期化し、セットアップするコードが含まれています。 もう 1 つのクラスである Tests は、UITests を起動させるスケルトン コードが含まれています。
UITest プロジェクトから Xamarin.Android プロジェクトにプロジェクト参照を追加します。
この手順により、 NUnitTestAdapter は Visual Studio から Android アプリの UITests を実行できます。
Xamarin.UITest を Xamarin.Forms ソリューションに追加した後、UITest を作成し、ローカルで実行し、App Center Test に送信することができます。
まとめ
Xamarin.Forms アプリケーションは、テスト自動化のための一意の表示 ID として AutomationId
を公開する単純なメカニズムを利用し、Xamarin.UITest で簡単にテストできます。 UITest プロジェクトを Xamarin.Forms ソリューションに追加すると、Xamarin.Forms アプリケーションのテストを記述し、実行するための手順が Xamarin.Android または Xamarin.iOS アプリケーションの場合と同じになります。
App Center テストにテストを送信する方法については、「Xamarin.Android 用の UITest の提出」または「Xamarin.iOS 用 UITests の提出」を参照してください。 UITest の詳細については、App Center Test のドキュメントを参照してください。