アプリのスクリーンショットを撮るためのツールである、fastlaneのsnapshotがUIテストに対応したので試してみました、という発表を関西モバイルアプリ研究会 #7でしてきました。
snapshotへの対応
snapshot
への対応は、だいたい次のようになります。
snapshot init
作られた
SnapshotHelper.swift
をUIテストに追加する作られた
Snapfile
を編集するUIテストの
setUp()
に次のコードを追加する123let
app = XCUIApplication()
setLanguage(app)
app.launch()
通常の手順でUIテストを記録
スクリーンショットを撮りたいところで、
snapshot("0Launch")
みたいなコードを追加する
Tips
UIテスト中であることをターゲットアプリ側で認識
XCUIApplication.launchArguments
を利用するとターゲットアプリに引数を渡して起動できます。
1 2 3 4 | let app = XCUIApplication() setLanguage(app) app.launchArguments += [ "--snapshot" ] // 追加 app.launch() |
その引数はNSProcessInfo.arguments
で取れるので、そこでチェックしましょう。
1 2 3 | if NSProcessInfo().arguments.indexOf( "--snapshot" ) != nil { // code for initilizing } |
これを使うとapplication:didFinishLaunchingWithOptions:
のタイミングでsnapshotを撮る用のデータを用意したりすることができるようになります。
タブバーなどでスクリーンショットがうまく撮れない
2015.12.26 追記 このバグはFastlane 1.2.0で修正されました。
UIテストでは、基本的にUI操作ごとに自動でキャプチャを撮るようになっています。
snapshot()
では、snapshot
のためのキャプチャであるとわかるように、画面外でのスワイプを行っています。
1 2 3 4 | 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:
に入れるとよいです。
1 2 3 4 5 6 | 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。
1 2 3 4 5 | 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 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。