2015/10/30

FastlaneのsnapshotがUIテストに対応したので試してみた (関西モバイルアプリ研究会 #7)

アプリのスクリーンショットを撮るためのツールである、fastlanesnapshotがUIテストに対応したので試してみました、という発表を関西モバイルアプリ研究会 #7でしてきました。

snapshotへの対応

snapshotへの対応は、だいたい次のようになります。

  1. snapshot init

  2. 作られたSnapshotHelper.swiftをUIテストに追加する

  3. 作られたSnapfileを編集する

  4. UIテストのsetUp()に次のコードを追加する

    let app = XCUIApplication()
    setLanguage(app)
    app.launch()
    
  5. 通常の手順でUIテストを記録

  6. スクリーンショットを撮りたいところで、snapshot("0Launch")みたいなコードを追加する

Tips

UIテスト中であることをターゲットアプリ側で認識

XCUIApplication.launchArgumentsを利用するとターゲットアプリに引数を渡して起動できます。

let app = XCUIApplication()
setLanguage(app)
app.launchArguments += ["--snapshot"] // 追加
app.launch()

その引数はNSProcessInfo.argumentsで取れるので、そこでチェックしましょう。

if NSProcessInfo().arguments.indexOf("--snapshot") != nil {
    // code for initilizing
}

これを使うとapplication:didFinishLaunchingWithOptions:のタイミングでsnapshotを撮る用のデータを用意したりすることができるようになります。

タブバーなどでスクリーンショットがうまく撮れない

2015.12.26 追記 このバグはFastlane 1.2.0で修正されました。

UIテストでは、基本的にUI操作ごとに自動でキャプチャを撮るようになっています。

snapshot()では、snapshotのためのキャプチャであるとわかるように、画面外でのスワイプを行っています。

let view = XCUIApplication()
let start = view.coordinateWithNormalizedOffset(CGVectorMake(32.10, 30000))
let finish = view.coordinateWithNormalizedOffset(CGVectorMake(31, 30000))
start.pressForDuration(0, thenDragToCoordinate: finish)

しかし、これがシミュレータ上では画面右端のタップと勘違いされてしまうので、タブの切り替えが発生してしまいます。

これを防ぐには次のようなコードをapplication:didFinishLaunchingWithOptions:viewDidLoad:に入れるとよいです。

if let rootView = window?.rootViewController?.view
        where NSProcessInfo().arguments.indexOf("--snapshot") != nil {
    let s = rootView.frame.size
    let view = UIView(frame: CGRectMake(s.width - 1, s.height - 1, 1, 1))
    rootView.addSubview(view)
}

上で説明した、UIテスト中の判定もしているので通常の実行では、ここは実行されません。 #if DEBUGなんかで囲ってしまうとさらによいでしょう。

参考: UI Testing: Snapshot helper clicks item on tabBar #215

許可を求めるダイアログでOKする

コンタクト情報へのアクセスなどの許可を求めるダイアログは、アプリ内の要素なので次のようにすればOK。

let app = XCUIApplication()
let button = app.alerts.element.collectionViews.buttons["OK"]
if button.exists {
    button.tap()
}

参考: Xcode7 | Xcode UI Tests | How to handle location service alert?

大きめのデバイスでスクリーンショットが汚ない

2015.12.26 追記 このバグはFastlane 1.2.0で修正されました。起動時に自動で、シミュレータサイズが等倍になります。

iPhone 5よりも横幅が長いデバイスではスクリーンショットが上のように汚なくなることがあります。

これはシミュレータのバグです。シミュレータの倍率を等倍にすると回避できます。

参考: Missing UI components in the screenshot #249

fastlaneのAndroid対応

次のWikiを参照してください。

fastlane actions --platform androidで確認したところ、gradleが追加されているようでした。 それ以外のアクションとしては、git系のツールやslackなどのサービス向けのアクションがiOSと同様に使えるみたいでした。

おわりに

今回は株式会社はてなではなく、フリュー株式会社での開催。 フリュー様の会議室は京都タワーの地下なので、京都駅前に近くて非常に便利でした。

会場と食事の提供をくださったフリュー株式会社に感謝いたします。

関連項目

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。