XCode9でのFastlane/Snapshotの実行


頑張ってたけど動かなくなったので一部解決したことと解決していないことのまとめ

snapshotって

https://github.com/fastlane/fastlane/tree/master/snapshot
これですね
fastlaneのツール群の一つでアプリのスクショを自動で取ってくれてhtml化して一覧で見れるようにしてくれます。
XCode7からはXCUITestが追加されたことでそれを使ってスクショを取っています。
こちらの記事が導入の参考になります
https://qiita.com/tamaki/items/f5e9f9985a91fb6a0f06

XCode9

2017年の9月にでました。
UITest周りにいくつか修正が入っています
詳しくはこちら
http://shashikantjagtap.net/hands-xcuitest-features-xcode-9/
その影響?でせっかく作った俺のUITestが動かなくなった!!!!

snapshot実行すると最後のhtml化するとこでこける

XCode9からXCodeが自動で取ったスクショをテスト終了後に破棄するかどうかを選択できるようになります。
デフォルトで破棄になっています。
XCUITestを使ったスクショはXCode9から明示的にスクショを取るメソッドが用意されましたがそれまではXCodeがよしななタイミングでスクショを取っていました。
fastlane/snapshotでは画面の向きに.unknownを突っ込み強制的にスクショを撮らせるなかなかトリッキーなことをしてました
実際に撮らせていたのはこのコード

XCUIDevice.sharedDevice().orientation = .Unknown

画面の向きが変わる時にスクショを取る法則を逆手に取ったコードですね
このコードを呼ぶ直前に

snapshot:\(画像名)

というテキストを出力していましたのでスクリプトでsnapshot:を探してその直後の画像をhtmlにするみたいな仕組みだと思います。
話は戻りますがなので結局のところsnapshotを実行して取った画像もXCodeが自動で取ったスクショの一部なのでテスト実行後に削除されてsanpshotのスクリプトで失敗するという具合です。

プロジェクトのEdit Scheme>Test>Optionsに

こんな感じでチェック項目があるのでDelete when each test succeedsのチェックを外しましょう
またその上のCapture srrenshots automaticallyのチェックを外すとそれはそれでテストが失敗します。
Fastlaneのissueにもこの対応が載ってました
Fastlane/Snapshotが一刻も早く純正のsnapshotメソッドの成果物を使うように修正することを願ってます

Viewの裏にあるボタン(Cell)はタップできない

僕の扱っているアプリでは一部部分だけ透過したViewがTableViewにかかっているレイアウト担っています。
透過部分は下にあるTableViewのセルをタップすることができます。
UITestのレコーディング機能を使ってる時はタップできます。
しかしいざUITestを実施するとタップすることができずクラッシュします。
XCode8ではこの動作が可能だったのでなにかViewの構造解析で手が加わったのかと思います。
回避策としては一度スクロールしてViewと被らない位置までタップしたいCellを移動させてからTap()すると正常に動作しました。

iPhone2017-A~Cというsimulatorが生まれる

sanpshot reset_simulators

コマンドを実行すると
iPhone2017-A,-B,-Cという名前のsimulatorがいつのまにか作られます
fastlaneにissueが過去挙げられてました
https://github.com/fastlane/fastlane/issues/10354
reset_simulatorsコマンドは実行するとシミュレーターのリセットをした後デフォルトのシミュレーターリストにあるものの再生成を行いますがそこにその名前でそれぞれ

iPhone2017-A -> iPhone8
iPhone2017-B -> iPhone8 Plus
iPhone2017-C -> iPhoneX

で載ってるみたいです。なのでそこの名前が変わらないことにはこのままみたい
fastlaneのissueでは「それが一体何が問題なんだい?」的なスタンスで締めくくられてissueがクローズされてましたんでしばらくこのままみたい

TabBar,ToolBarのボタンをtap()しても遷移しないことがある(未解決)

これがクッソむかつくのと頭を悩ませています。
2回に一回くらいでコレ起因でクラッシュしています。
要素がないのかと思ってブレイクポイントをうって確認するとボタンは存在しているタップも実行されているなのに画面遷移しない・・・・
しかもだいたいブレイクポイントを打っている時は正常に動くという
遅延しているだけかと思いsleepを入れても変わらず....泣きそう....
もし同様の動作になったことがある方で対応策を見つけた方がいればコメントくださいorz

あとがき

UITest最近ちょっと力入れてやって見てますが奥が深い
アプリのUITestは探り探りな部分がまだまだ多いですね....
継続的な運用をどうすればいいのか、いい設計はこれだというものを知っている方が入ればぜひコメント等で教えてください
UITestでなく、ユニットテストについても色々教えてくださいmm