AWS Device Farm で iOS アプリをテストしてみた #アドカレ2015

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

AWS Device Farm (以下 Device Farm)は、モバイルアプリをクラウドでテストするためのサービスです。AWS クラウド上で、実際のスマホやタブレットを使ったテストを実施することができます。iOS / Android / Fire OS のデバイス、様々な OS バージョンの中からテストしたいデバイスを自由に選択し、自分のアプリを簡単にテストすることができます。

今回は、Swift で新規 Xcode プロジェクトを作成し、カンタンなデータクラスを作成。テストケースを XCTest で記述し、Device Farm 上のiOS デバイスでテストを実行するまでを試してみました。

有用な使い方のストーリーとしては、以下のものが考えられるかと思います。

  • iOS 8, 9 の各デバイスで、問題なくテストが通るかを確認する
  • 手元にない実機での挙動を見る

今回の記事では、そうしたストーリーに十分には沿っておらず、純粋な使い方の手順書として書きました。適宜、どんな時に使うと便利か、読者の皆さんの現場と照らし合わせて想像しながら読み進めていただければ幸いです。

なお、Device Farm に関しては、本アドベントカレンダーにて、諏訪吉原が記事を書いております。こちらも併せてご参照下さい。

AWS Device Farm を使ってモバイル向け Web アプリをクラウドでテストする #アドカレ2015 | Developers.IO

AWS DeviceFarm あらためて概要を調べました。#アドカレ2015 | Developers.IO

テスト実施概要

  • Xcodeで新規プロジェクト作成
  • アプリ側コードを記述
  • テストケースを記述
  • Device Farm にアップロードするファイルの準備
  • Device Farm上でテスト実行
  • テスト結果を確認

実施環境

  • 実施日 2015/12/19
  • Xcode 7.2

Xcodeで新規プロジェクト作成

スクリーンショット_2015-12-19_21_09_14

Xcode で iOS アプリのプロジェクトを作成します。

スクリーンショット_2015-12-19_21_07_49

今回は Single View Application テンプレートを用いて作成しました。

プロジェクト作成時のオプションで、include Unit Testsにチェックが入っている状態で、作成しました。これにより、ユニットテスト用のターゲットと関連ファイルが作成されます。

アプリ側コードを記述

今回は、テストを試験的に実施することが主な目的なので、テスト対象となるデータ処理コードのみをアプリ側で記述し、それに対応するテストケースを記述していきます。

//
//  StationDataService.swift
//  DeviceFarmUsingTests
//
//  Created by tamiya.tokihiko on 2015/12/11.
//  Copyright © 2015年 tamiya.tokihiko. All rights reserved.
//

import Foundation
import UIKit

class StationDataService: NSObject {
    // 駅名の配列を返すクラスメソッド
    class func getHibiyaStations() -> [String] {
        return ["中目黒駅","恵比寿駅","広尾駅","六本木駅","神谷町駅","霞ケ関駅","日比谷駅","銀座駅","東銀座駅","築地駅","八丁堀駅","茅場町駅","人形町駅","小伝馬町駅","秋葉原駅","仲御徒町駅","上野駅","入谷駅","三ノ輪駅","南千住駅","北千住駅"]
    }
}

東京メトロ日比谷線の駅一覧を配列で返すgetHibiyaStationsメソッドをもつ、StationDataServiceクラスを作成しました。

テストケースを記述

先ほどのプロジェクト作成時のオプション設定により、ユニットテスト用のクラスを記述したファイルが作成されています。それに追記修正する形で、テストケースを書いていきました。

なお、プロジェクト名が適切ではなく DeviceFarmUsingTestsTests.swift と、二回 "test" が入ってしまっています。。あらかじめご了承ください。

//
//  DeviceFarmUsingTestsTests.swift
//  DeviceFarmUsingTestsTests
//
//  Created by tamiya.tokihiko on 2015/12/10.
//  Copyright © 2015年 tamiya.tokihiko. All rights reserved.
//

import XCTest
@testable import DeviceFarmUsingTests

class DeviceFarmUsingTestsTests: XCTestCase {    
    override func setUp() {
        super.setUp()
    }

    override func tearDown() {
        super.tearDown()
    }

    func testExampleCase1() {
        var isExist = false
        let stations = StationDataService.getHibiyaStations()
        for station in stations {
            if station == "秋葉原駅" {
                isExist = true
            }
        }
        XCTAssert(isExist, "日比谷線に秋葉原駅は存在する?")
    }

    func testExampleCase2() {
        var isExist = false
        let stations = StationDataService.getHibiyaStations()
        for station in stations {
            if station == "横浜駅" {
                isExist = true
            }
        }
        XCTAssert(isExist, "日比谷線に横浜駅は存在する?")
    }
}

testExampleCase1testExampleCase2が追記したテストケースになります。この2つのメソッドでは、それぞれのテストケースで指定した駅名が、StationDataServiceクラスの getHibiyaStations()メソッドにより得られる配列の中に存在するかをテストする内容になっています。

駅名が存在すればテスト成功、存在しなければテスト失敗となります。

Device Farm にアップロードするファイルの準備

Device Farm に送信するファイルは2つです。

  • アプリの ipa ファイル
  • xctestファイルをzip圧縮したもの

作成手順を順に見ていきましょう。

ipaファイル作成

スクリーンショット 2015-12-19 23.28.53

XcodeメニューでProduct > Archiveを選択。すると、xcarchiveファイルが作成され、そのファイルが表示された状態で、Organizerが起動します。

スクリーンショット_2015-12-19_23_28_53

スクリーンショット_2015-12-19_23_30_47

Exportをクリックすると、エクスポート方法を選択すると出てくる画面で、Save for Development Deploymentを選択ます。

スクリーンショット_2015-12-19_23_31_02

続いて、App Thinningについての対応をどうするか聞かれます。今回はExport one app for all compatible devicesで行きます。

スクリーンショット 2015-12-19 23.31.22

スクリーンショット 2015-12-19 23.31.55

そのまま進んでいくと、最後にipaファイル作成され、自動的にファイルがFinder上で開かれます。こちらのファイルを適切な場所にコピーしておきましょう。

xctestファイルをzip圧縮したもの作成

スクリーンショット_2015-12-19_23_37_57

Xcodeの左ペイン下方に、(プロジェクト名)Tests.xctestというファイル項目があります。初めはこの項目が赤字になっており、存在しない状態です。

スクリーンショット_2015-12-19_23_39_38

ビルドしてファイルを作成しましょう。 Product > Build For > Testing を実行します。

すると、左ペインのxctestファイル項目が黒字となり、作成されたことが分かります。あとは、そちらの項目を右クリックし、Show in Finderを選択。Finder上に、xctestファイルが現れます。

こちらのファイルを適切な場所にコピーし、zip形式で圧縮しておきましょう。

Device Farm 上でテスト実行

ここから先は、AWSコンソール上でのオペレーションになります。

順に見ていきましょう。

AWS Device Farm 管理画面を開く

スクリーンショット 2015-12-19 23.41.39

スクリーンショット 2015-12-19 23.43.01

AWSコンソールトップ画面から、AWS Device Farmを選択します。

Device Farmのプロジェクト作成

スクリーンショット_2015-12-19_23_44_18

スクリーンショット 2015-12-19 23.45.20

テストの詳細を設定する前に、まずテストプロジェクトの名前を決めます。

はじめに、Create a new Projectをクリックし、プロジェクト名を設定します。テスト対象となるアプリの名前など、好きな名前をつけるとよいでしょう。

Create a new run

先ほど作成した2つのファイルを、Device Farm の管理画面からアップロードし、テスト対象端末の選択など、テストの各種設定をします。

ここから先は、テストに使うファイルのアップロードや、使用する端末の選択、テストオプションの設定を行っていきます。この部分では、Step1-5まで、全部で5段階あります。

早速見ていきましょう。

Step 1: Choose application

アプリの種類を選択し、ipaファイルをアップロードします。

アプリの種類の選択

2015/12/19の時点では、Androidアプリ/iOSアプリ、Android/iOS上のウェブアプリケーションが選択出来ます。今回はネイティブアプリですので、ドロイドくんとAppleが表示されているマークを選択します。

ipaファイルのアップロード

スクリーンショット_2015-12-19_23_53_01

続いて、Uploadをクリックすると、ファイル選択画面になります。こちらで先程のipaファイルを選択します。

同プロジェクトで2回目以降に Create a new runしている場合、Select a recent upload項目が出現し、最近アップロードしたipaファイルをテストに使用することが出来ます。

Next stepをクリックし、次へ進みます。

Step 2: Configure test

どんな種類のテストをするか設定できます。2015/12/19時点で、以下が選択出来ます。今回はXCTestを選択します。 * Built-in: Fuzz * Appium Java JUnit * Appium Java TestNG * Calabash * UI Automation * XCTest

スクリーンショット_2015-12-19_23_48_48

Uploadをクリックすると、ファイル選択画面になります。こちらで先程のzipファイルを選択します。

同プロジェクトで2回目以降に Create a new runしている場合、Select a recent upload項目が出現し、最近アップロードしたzipファイルをテストに使用することが出来ます。

Next stepをクリックし、次へ進みます。

Step 3: Select devices

スクリーンショット_2015-12-19_23_49_56

どのデバイスを使ってテストするか選択します。

複数のデバイスをあらかじめチョイスし、グルーピングしておいたものを、Device poolと呼びます。

Create a new device poolで、Device poolを作成できます。クリックし、画面を開きます。

スクリーンショット_2015-12-19_23_50_07

多数のデバイスが表示されます。端末名、iOS/Androidなどプラットフォーム名、OSのバージョン、フォームファクタ(電話かタブレットか)フィルタリング出来ます。好きなデバイスを選択しましょう。

Name欄にdevice poolの名前、Description欄に説明文を入力し、Save device poolをクリックします。

スクリーンショット_2015-12-19_23_50_21

Device pool欄で、今作成したDevice poolを選択します。 Next stepをクリックし、次へ進みます。

Step 4: Specify device state

スクリーンショット_2015-12-19_23_50_29

テストに伴い、様々な追加設定ができます。以下のものがあります。今回は、デフォルトのままで行きます。

Review and start runをクリックし、次へ進みます。

Step 5: Review and start run

スクリーンショット_2015-12-19_23_50_35

Step 1〜4で設定した内容が表示されます。 問題なければ、Confirm and start runをクリックし、テスト実行に入ります。

テスト結果を確認

テスト完了を待つ

Run results 画面に移行します。ココでは、テストの状況と概要が今までの履歴とともに表示されます。

実行中のテストについては、アイコンがクルクルと回転して、今テストしている最中であることを教えてくれます。しばらく待ちましょう。

スクリーンショット_2015-12-19_23_51_04

結果を表示する

スクリーンショット
    _2015-12-20_0_08_20

実行結果がバーグラフ等で表示されます。

各項目の左端のアイコンで、テストの概要が分かります。例えば、赤丸の中に!マークが表示されていれば、失敗したテストケースがあることが分かります。

スクリーンショット_2015-12-20_0_08_20 2

バーグラフは、テスト結果によってカテゴライズされています。赤が失敗したテスト、緑が成功したテストです。何らかの理由でスキップされたテストは青で表示されます。

スクリーンショット_2015-12-20_0_12_19

項目をクリックすると、テストに使用したデバイスごとに、詳細結果が表示できます。どのテストケースでエラーが発生したかが表示されます。

テストケースをクリックすると、テストの詳細が見られます。

タブ名 内容 備考
Details テストのログを表示 項目でフィルタリング可能
Screenshots スクリーンショット XCTestでは関係なし
Performance 横軸が時間、縦軸にCPU使用率/秒間フレーム数/メモリ使用料/スレッド数 を記載したグラフを表示
Files 各種ログをダウンロードするタブ

スクリーンショット_2015-12-20_0_15_39

Details では、テストのログが分かりやすく見られます。この内容は、Download logsから、json形式でダウンロード可能です。JSON to CSVでCSV形式に変換したりすると、使いやすいかもしれません。

今回は、開始から11.657秒で、XCTAssertTrue failed - 日比谷線に横浜駅は存在する?のメッセージがログに記録されています。

まとめ

今回は、XCTest を使って、AWS Device Farm を試しました。ちなみに、ipaファイルとxctestファイルを分けてアップできることにはメリットが有ります。いちいちArchiveしなおさなくても、xctestファイルを圧縮したものを入れ替えていけば、次々と新しいテストケースを実行することが出来るのです。

デバイスごとの違いは、UIAutomation テストで顕著に現れることが多いかと思います。こちらについては、また追って実施した内容をDevelopers.IOに投稿できればと思います。

明日(12/21)は 小室 啓 の AWS SDK C++ と UE4 に関する記事です。