アプリのスクリーンショットを撮るためのツールである、fastlaneのsnapshotがUIテストに対応したので試してみました、という発表を関西モバイルアプリ研究会 #7でしてきました。
snapshotへの対応
snapshot
への対応は、だいたい次のようになります。
snapshot init
作られた
SnapshotHelper.swift
をUIテストに追加する作られた
Snapfile
を編集するUIテストの
setUp()
に次のコードを追加するlet app = XCUIApplication() setLanguage(app) app.launch()
通常の手順でUIテストを記録
スクリーンショットを撮りたいところで、
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 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。