AWS Device FarmがiOSに対応したので使ってみた

こんにちは、sparkgeneです。

先日発表されたAWS Device Farmが、iOSにも対応したということで、試してみました。

AWS Device Farmとは

アプリの品質向上に役立つテストを行ってくれるサービスです。

対称となるのは、Android、Fire OS、iOS。

通常開発する時は、様々なデバイスとOSバージョンを組み合わせてテストを行うのですが、その為には多くのテスト用端末を保有しておく必要があり、新しいモノが出れば買い足す必要があります。

しかし、このサービスを使うと、アプリのファイルをアップロードすることで、デバイスとOSの複数の組み合わせに対してテストを実行することが出来ます。

アプリの準備

今回テストに使うのは、Xcodeで新規プロジェクトを追加するときに選べるテンプレートの中から、Single View Applicationをそのまま使っています。

スクリーンショット 2015-08-05 22.46.27

Device Farmを使う

まず最初にCreate a new projectボタンをクリックして、新しくプロジェクトを登録します。

スクリーンショット 2015-08-05 22.55.06

プロジェクトを作成したら、create a new runをクリックして、新しいテストの計画(Run)を作成します。

Step 1: Choose application

テスト対象となるipaを選ぶとアップロードされ、メタ情報が表示されます。

スクリーンショット 2015-08-05 22.09.31

Step 2: Configure test

次にどのようなテストを行うか指定します。今回の場合はビルトインのFuzzテストを指定します。(Fuzzテストとは、wikipediaによれば、モンキーテストのようなもの)

スクリーンショット 2015-08-05 22.09.42

Step 3: Select devices

この画面では、どのデバイスとOSバージョンの組み合わせを使うかを指定します。

Device PoolはデフォルトのTop Devicesを指定すると、以下の様なデバイスとバージョンの組み合わせとなります。

スクリーンショット 2015-08-05 22.14.57Create a new device poolをクリックすると、色々なデバイスとOSを組み合わせたオリジナルのDevice Poolを作成することが出来ます。試しに、iOS 8.4だけで色んなデバイスを選んでみるとこんな感じになります。

スクリーンショット 2015-08-05 23.13.59Step 4: Specify device state

この画面では、テストを行うにあたっての状態を設定します。今回はlocalだけja_JPにしました。

(extra dataの使い方が今ひとつわからないですね)

スクリーンショット 2015-08-05 22.15.39

Step 5: Review and start run

設定内容を確認し問題がなければテストを実行します。

スクリーンショット 2015-08-05 22.15.49

テスト結果

テストを実行してしばらく待つとテストの結果が表示されます。

スクリーンショット 2015-08-05 22.17.43

テスト結果をクリックするとテストの詳細画面が表示されます。

スクリーンショット 2015-08-05 22.18.13

テスト結果として表示されているのは、Setup、Fuzz、Teardownの3種類です。(テスト結果をクリックすると更に詳細が表示されます)

画面の下にはテストのログが表示されています。

スクリーンショット 2015-08-05 22.18.54

タブのScreenshotを選ぶと、今回のテストでは何もないようです。

スクリーンショット 2015-08-05 22.19.30

Performanceでは、テストを実行した時のパフォーマンス(CPU、メモリ利用、スレッド数)を見ることが出来ます。

スクリーンショット 2015-08-05 22.19.43

Filesでは、テストを実行した際のログや生成されたファイルが見られるようです。

失敗するテストを試す

注意)
現時点では、XCTestのテストはObjective-cで書かれている必要があります。swiftで書いてある場合は、テストが無視されます。(1時間ぐらいハマった。。)

Working with XCTest for iOS and Device Farm

正常な動きがわかったところで、実際にテストに失敗したらどうなるのかを見てみました。

〜Tests.mtearDownメソッドで、強制的にエラーとなるようにします。

- (void)tearDown {
  XCTFail("force fail");
  [super tearDown];
}

XCTestを行う場合は、〜Tests.xctestをzipファイルに圧縮して使います。

先ほどと同じように、Runを作成します。

Step 1ではipaをアップロードしますが、一定時間内であれば、最近アップロードしたipaがドロップダウンで選べるようになっており、アップロードしなくてもRunを作成することが出来ます。

Step 2: Configure test のところでXCTestを選択し、zipにしたテストをアップロードします。

スクリーンショット 2015-08-06 0.54.53

残りのステップは、最初と同じ内容で大丈夫です。

テストが終わると、今回はエラーの表示になりました。

スクリーンショット 2015-08-06 0.40.32

テスト結果の詳細を見ると、ログにエラーの出力がされています。

スクリーンショット 2015-08-06 0.54.12

まとめ

実機が手元になくても、様々な種類のデバイス×OSバージョンのテストを一気に実行できるのはかなり便利なのではないでしょうか。

今回はマネージメントコンソールからの操作でしたが、APICLIも用意されているので、CIツールとの連携も簡単にできると思います。(Jenkinsとの連携がすでに公開されています)