Upload
toshiyuki-hirata
View
908
Download
0
Embed Size (px)
Citation preview
fastlane snapshotの並列実行についてまとめてみた
2017/12/5(Tue)
iOS Test Night #6 - 1周年 -
平田敏之(@tarappo)
自己紹介
平田敏之@DeNA
SWET (Software Engineer in Test)
私がやっていること(一部)
• クライアントアプリ周りのテスト戦略、自動テストの開発
• CI/CD環境整備
• テスト基盤環境の開発(マスティフ、ダルメシアン etc)
• iOS / Android Test Night 主宰
今日の流れ
• snapshot
• snapshotって?
• 課題
• 従来の解決策
• テストの並列化
• 実験
• 実行環境
• 実行結果
• まとめ
snapshot
• 指定端末・指定言語のスクリーンショットを簡単に撮ることが出来る
• App Storeで利用する画像の用意
• ローカライズ検証のために利用
• 簡易的なUIテスト
https://docs.fastlane.tools/actions/snapshot/
snapshot導入手順
• Step
• fastlane snapshot init
• 以下のファイルが生成される
• fastlane/Snapfile
• fastlane/SnapshotHelper.swift
• UIテストを用意
• SnapshotHelper.swiftを利用
• snapshot(“filename”)を呼び出す
• Fastfile or Snapfileに設定を記載
• 実行したいdevices / languagesを指定
• snasphotの実行
• スクリーンショットが保存される
• Xcode9から撮れるようになったが、今までは?
DerivedDataPath/Logs/Test/Attachments/
snapshot課題
端末数・言語数が増えれば増えるほど実行時間が増加
0
350
700
1050
1400
1750
1台 2台 3台 4台 5台 6台
se
c
devices
3 languages
snapshot(今までの)解決策(の例)
• 実行環境の並列化
• 仮にlanguagesが3種類だったとする
• languages:[ ‘ja-JP’, ‘en-US’, ‘fr-FR’ ]
• 以下のようにマシンを分割し実行すれば1/3程度になる
• マシンA(ja-JP) / マシンB(en-US) / マシンC(fr-FR)
実行環境を用意するコスト並列化できるように実装するコスト
テストの並列化(1/2)
• Xcode9 - What’s New in Testing -
• シミュレーターのテストの並列実行が出来るようになりました
• xcodebuild -workspace yourworkspace.xcworkspace -scheme yourscheme -derivedDataPath ‘derivedDataPath‘ -destination 'platform=iOS
Simulator,name=iPhone SE,OS=11.1' -destination 'platform=iOS Simulator,name=iPhone 6,OS=11.1' test
• destinationが複数指定出来るようになりました
• Xcode9の並列テストはどれだけ効果があるのか? by huin
• https://speakerdeck.com/huin/xcode-9-falsebing-lie-tesutohadoredakexiao-guo-gaarufalseka
テストの並列化(2/2)
• snapshotでテストの並列実行をおこなえる対応が入った
• https://github.com/fastlane/fastlane/pull/9570
• 2017/8/22
• fastlane 2.54.0
• 12/2現在:2.68.0
snapshotテストの並列化
• 利用方法
• 以下のパラメータをtrueにするだけ
• concurrent_simulators: true
• 湧き上がる疑問
• どのように並列化されるの?
• シミュレーターの起動数は?
snapshotテストの並列化
• 起動数
• 実行するマシンに依存
• (hwprefs_available? ? `hwprefs thread_count` : `sysctl -n hw.physicalcpu_max`).to_i
• 上記コマンドで得られた値 - 1を起動数としている
• テストの並列実行
• 例:devices: [ “iPhone 5s”, “iPhone SE”, “iPhone 6”, “iPhone 7” ]
• devicesの数を元に並列化される
• 起動数が4以上であれば、一度に上記端末を実行する
• 起動数が3であれば、3つを実行した後に残りの1つを実行する
実験
• 実行環境
• Mac Pro (Late 2013) 3.5 GHz 6コア / 16GB
• OS: 10.12.6
• Xcode 9.1
上記環境で以下の内容で実行
• devices:1〜6台まで
• languages:3種類
• 試行回数:5回
実験結果
端末数実行時間(秒)
並列実行ON
実行時間(秒)
並列実行OFF
1台 250.2 251
2台 332.2 492
3台 416.2 725
4台 496.2 981.6
5台 558 1148.6
6台 764.6 1344.8
実験結果
0
350
700
1050
1400
1750
1台 2台 3台 4台 5台 6台
se
c
ON OFF
おわりに
• snapshotでテストの並列化が「すごく簡単」にできるようになりました
• snapshotを既に導入しているプロジェクト
• (devicesの値が2つ以上なら)concurrent_simulatorsをtrueにしましょう
• fastlaneのsnapshotを未導入のプロジェクト
• snapshot触ってみませんか?
まずは最初の一歩を