Xamarin.Formsのソースコードをビルドしてテストを実行してみた

  • 11
    Like
  • 0
    Comment

Introduction

この記事は、Xamarin.Formsのソースコードをビルドして単体テストを実行してみたという趣旨の内容となっております。
結構詰まるところがあったので、記事にしてまとめておこうと思います。
以下の環境で実施しました。
・Windows10 Anniversary Update
・Visual Studio 2015
・Xamarin.Forms 2.3.3(2016年12月時点最新バージョン)
※Mac持ってないのでiOSビルドは行ってません。

Build

forkしてcloneしてきたソースコードをbuildします。
いきなりbuildしてもエラーが出てしまう方が多いかと思います。
Xamarin.Forms内にWindows8.1のプロジェクトがあるのですが、そのプロジェクトでBing MapsのSDKが要求されているためです。
Nugetではないため自動で解決されないので自分でBing Maps SDK for Windows 8.1 Store apps Visual Studio拡張をインストールします。(Xamarin.Formsのドキュメントにもそのように書いてます)
または気に食わなければWindows8.1がらみのプロジェクトをUnloadするのも手でしょう。ビルド時間も短くなるのでお勧めです。
iOS版をビルドする場合、Xamarin Compornentsのライブラリを使用しているため、Xamarinのアカウントが必要になるので注意しましょう。

Test

Xamarin.Formsには膨大な数のテストコードが存在します。自分がまともに実行できたのはAndroid版のみなのですが、iOS版とWindows版のテストをなぜできなかったかについても書き残しておきたいと思います。

Buildも通ったしさあテストだ!と行きたいところなのですが、こんな感じにテストがテストエクスプローラに一個も表示されない方がいるかと思います。
SnapCrab_NoName_2016-12-4_18-9-13_No-00.png
このような状態になった場合、Visual Studio拡張のNUnit Test Adapterをインストールしてください。
この時注意することとしてインストールするのはあくまでもNunit Test Adapterであり、NUnit 3 Test Adapter ではありません。
Xamarin.FormsのテストコードがNUnitの2.6.4を使用しているためです。いずれは最新のものに対応されるかもしれませんが、現状はそうなっているのでそのようにしてください。
次にOSおよびターゲットプラットフォームの言語設定が日本語になっている場合は英語(米国)に変更してください。日本語に設定されているとstring format等のテストで失敗します。ソフトウェアキーボードの言語設定があるならそれも英語に変更してください。

以後各プラットフォームごとの操作となります。

Androidでのテスト

まず、Xamarin.Forms.ControlGallery.AndroidプロジェクトのMapsKey.csにGoogle Maps API Keyを設定します。
Google Maps API Keyを取得するにはここを参照してください。
次に実行するデバイスを下記のように実際にテストを行う設定に変更します。
SnapCrab_NoName_2016-12-4_20-40-27_No-00.png
また、エミュレータでテストを実行する場合には事前にエミュレータを起動しておいてください。
準備ができたらテストを実行して成功するのを祈ります。ちなみにテスト実行時間ですが、全部実行するとクソ長いです。筋トレどころではありません。軽くカタン1プレイできてしまうぐらいかかります。

iOSでのテスト

Mac持ってないのでできませんでした。ごめんなさい。
持ってる人やってみてください。。。

Windowsでのテスト

どうもよくわからないのですが、テストのSetup時にかならず失敗するようでテストを実行できませんでした。
下のXamarin.FormsのUIテストコードを見るとWindowsのテストコードはまだ実装されていないように見えますが・・・どうなんでしょう。

static IApp InitializeApp ()
{
    IApp app = null;
#if __ANDROID__

    app = InitializeAndroidApp();

#elif __IOS__

    app = InitializeiOSApp();
#endif
    if (app == null)
        throw new NullReferenceException ("App was not initialized.");

    // Wrap the app in ScreenshotConditional so it only takes screenshots if the SCREENSHOTS symbol is specified
    return new ScreenshotConditionalApp(app);
}

このInitializeAppというメソッドはXamarin.FormsのUIテスト実行のSetup時に必ず呼び出されるのですが、Windowsで実行するとappがかならずnullになるため、NullReferenceExceptionが発生してしまいます。
なのでまだ実装されてないのかなと思ったのですが、そもそもmasterブランチに実行できないテストのプロジェクトがあるのもおかしいし、Xamarin.FormsのドキュメントにWindowsでのAPIキーの取得の仕方とか書いてあってちょっと腑に落ちない感じです。
もしかしたらなんか方法があるかもしれませんがどうなんでしょう。

まとめ

以下まとめます。
・Windows8.1のプロジェクトをBuildする場合はBing MapsのSDKをインストールする。
・テストを実行する際には、言語設定を"全て"en-USにする。ソフトウェアキーボードの設定も同様にen-USにする。
・テストランナーはNUnit 3 Test Adapterではなく、NUnit Test Adapterを使用すること。
・Androidのテストを実行する場合、Xamarin.Forms.ControlGallery.AndroidプロジェクトのMapsKey.csにGoogle Maps API Keyを設定する。
・WindowsのUIテストは現状テストできない??(要調査)

全部テスト実行できなかったのがなんとも残念な感じですが、Xamarin.Formsのソースコードをビルドする上での躓きポイントをある程度解消できたかなと思います。

This post is the No.7 article of Xamarin(その2) Advent Calendar 2016