AWS Device FarmがiOSに対応したので使ってみた
sparkgene
こんにちは、sparkgeneです。
先日発表されたAWS Device Farmが、iOSにも対応したということで、試してみました。
AWS Device Farmとは
アプリの品質向上に役立つテストを行ってくれるサービスです。
対称となるのは、Android、Fire OS、iOS。
通常開発する時は、様々なデバイスとOSバージョンを組み合わせてテストを行うのですが、その為には多くのテスト用端末を保有しておく必要があり、新しいモノが出れば買い足す必要があります。
しかし、このサービスを使うと、アプリのファイルをアップロードすることで、デバイスとOSの複数の組み合わせに対してテストを実行することが出来ます。
アプリの準備
今回テストに使うのは、Xcodeで新規プロジェクトを追加するときに選べるテンプレートの中から、Single View Application
をそのまま使っています。
Device Farmを使う
まず最初にCreate a new project
ボタンをクリックして、新しくプロジェクトを登録します。
プロジェクトを作成したら、create a new run
をクリックして、新しいテストの計画(Run)を作成します。
Step 1: Choose application
テスト対象となるipaを選ぶとアップロードされ、メタ情報が表示されます。
Step 2: Configure test
次にどのようなテストを行うか指定します。今回の場合はビルトインのFuzzテストを指定します。(Fuzzテストとは、wikipediaによれば、モンキーテストのようなもの)
Step 3: Select devices
この画面では、どのデバイスとOSバージョンの組み合わせを使うかを指定します。
Device PoolはデフォルトのTop Devicesを指定すると、以下の様なデバイスとバージョンの組み合わせとなります。
Create a new device pool
をクリックすると、色々なデバイスとOSを組み合わせたオリジナルのDevice Poolを作成することが出来ます。試しに、iOS 8.4だけで色んなデバイスを選んでみるとこんな感じになります。
Step 4: Specify device state
この画面では、テストを行うにあたっての状態を設定します。今回はlocalだけja_JPにしました。
(extra dataの使い方が今ひとつわからないですね)
Step 5: Review and start run
設定内容を確認し問題がなければテストを実行します。
テスト結果
テストを実行してしばらく待つとテストの結果が表示されます。
テスト結果をクリックするとテストの詳細画面が表示されます。
テスト結果として表示されているのは、Setup、Fuzz、Teardownの3種類です。(テスト結果をクリックすると更に詳細が表示されます)
画面の下にはテストのログが表示されています。
タブのScreenshotを選ぶと、今回のテストでは何もないようです。
Performanceでは、テストを実行した時のパフォーマンス(CPU、メモリ利用、スレッド数)を見ることが出来ます。
Filesでは、テストを実行した際のログや生成されたファイルが見られるようです。
失敗するテストを試す
現時点では、XCTestのテストはObjective-cで書かれている必要があります。swiftで書いてある場合は、テストが無視されます。(1時間ぐらいハマった。。)
Working with XCTest for iOS and Device Farm
正常な動きがわかったところで、実際にテストに失敗したらどうなるのかを見てみました。
〜Tests.m
のtearDown
メソッドで、強制的にエラーとなるようにします。
- (void)tearDown {
XCTFail("force fail");
[super tearDown];
}
XCTestを行う場合は、〜Tests.xctestをzipファイルに圧縮して使います。
先ほどと同じように、Runを作成します。
Step 1ではipaをアップロードしますが、一定時間内であれば、最近アップロードしたipaがドロップダウンで選べるようになっており、アップロードしなくてもRunを作成することが出来ます。
Step 2: Configure test のところでXCTest
を選択し、zipにしたテストをアップロードします。
残りのステップは、最初と同じ内容で大丈夫です。
テストが終わると、今回はエラーの表示になりました。
テスト結果の詳細を見ると、ログにエラーの出力がされています。
まとめ
実機が手元になくても、様々な種類のデバイス×OSバージョンのテストを一気に実行できるのはかなり便利なのではないでしょうか。
今回はマネージメントコンソールからの操作でしたが、APIもCLIも用意されているので、CIツールとの連携も簡単にできると思います。(Jenkinsとの連携がすでに公開されています)