kamulog

xamarin.formsのネタなど

Test Cloudを使わずにXamarin.UITestだけを使ってのローカルUIテスト(準備編)

みなさんUITestしてますか?私はしてません(笑)
手動のポチポチテスト(テストと言えるのかは疑問ですが)はしてますけど。

初回リリースはそれで良かったんですが、何か機能を追加した時に、それによって既存の動きがおかしくなってないかとかを調べるのに また手動で同じことをポチポチとしなくてはならなくて、それがだるすぎるのでXamarin.UITestを利用してみることにしました。

Xamarin.UITestを実際に使った例があまりなかったので、苦労した点を踏まえて備忘録として記事にしてみます。

※Xamarin.Studioを使う場合で説明します。

素材・完成品

github.com

今回は以前作成したTheme切り替えサンプル用のBMI計算アプリをテスト対象にして説明していきます。

完成コミットはこちらです。

UITestプロジェクト追加+α

ytabuchi.hatenablog.com

まずはこちらの田淵さんの記事通りにUITestプロジェクトを追加します。

少し補足するとローカルテストだけの場合はTest Cloudのアカウントはなくても大丈夫でした。

テンプレートのままではXamarin.UITestのバージョンが古いので更新しておきます。 NUnitの方は2.6に依存してるっぽいので更新しない方が良いです。

ここまで来たら一度UITestプロジェクトをビルドします。 ビルドが完了すると単体テストパネルに

f:id:kamusoft:20170117152529p:plain

「アプリのテスト」というのが出てくるので、右クリックしてテストしたいプロジェクトを追加します。

f:id:kamusoft:20170117152802p:plain
iOSAndroidそれぞれのPlatform毎のProjectを選択

追加するとそれぞれのプロジェクトのところを右クリックでテストデバイスを切り替えられます。

iOSの特殊処理とスクリーンショット使用ON

iOSのアプリをテストするにはいくつかの準備が必要です。

まずテストするターゲットアプリ(テスト対象のアプリ)iOSプロジェクト 今回の場合はThemeSample.iOSのプロジェクトに
Xamarin.TestCloud.Agent
というnugetパッケージをインストールする必要があります。

f:id:kamusoft:20170117153439p:plain

インストールできたら同プロジェクトのAppDelegate.csにコードを追記します。

public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
    global::Xamarin.Forms.Forms.Init();

// これを追加
#if ENABLE_TEST_CLOUD
    Xamarin.Calabash.Start();
#endif
//

    LoadApplication(new App(new iOSInitializer()));

    return base.FinishedLaunching(app, options);
}

次にUITestプロジェクトのAppInitializer.csを開いてEnableLocalScreenshots()を追記します。

public static IApp StartApp(Platform platform)
 {
     if (platform == Platform.Android) {
         return ConfigureApp
             .Android
             // TODO: Update this path to point to your Android app and uncomment the
             // code if the app is not included in the solution.
             //.ApkFile ("../../../Droid/bin/Debug/xamarinforms.apk")
             .EnableLocalScreenshots()  //これ
             .StartApp();
     }

     return ConfigureApp
         .iOS
         // TODO: Update this path to point to your iOS app and uncomment the
         // code if the app is not included in the solution.
         //.AppBundle ("../../../iOS/bin/iPhoneSimulator/Debug/XamarinForms.iOS.app")
         .EnableLocalScreenshots()  //これ
         .StartApp();
 }

テンプレートのままではスクリーンショットが使えないのでその対策です。

これで準備は完了です。

テスト実行

単体テストパネルにAppLaunchesというテストメソッドがあるのでそれをiOSAndroidでそれぞれ右クリックから実行してみましょう。

f:id:kamusoft:20170117160503p:plain

完了後に緑色になっていれば成功です。

もしこの時点で赤になってエラーがでていれば、ターゲットのシミュレータを変更してみたり、再起動してみたりすると正常に動作するかもです。

AppLanchesでは

[Test]
public void AppLaunches()
{
    app.Screenshot("First screen.");
}

スクリーンショットを1枚とっているだけなんですが、このスクショがどこに保存されているかと言いますと UITestプロジェクトの bin/Debug/ にscreenshot-n.pngという形で保存されています。 nは実行した順番で連番となるようです。

引数のFirst screenという文字はファイル名になるわけではないようなので、順番を覚えてないとどの場面かわかりません(笑)
しかもテストを実行する度に上書きされるので複数のテストの後で確認もできません。 なかなか使いどころが難しそうです…。

テストコードはとりあえずはAppLanchesに記述していけば良いかと思います。

次回は実際のテストコードの書き方を説明していきます。