狠狠撸

狠狠撸Share a Scribd company logo
Xcode10での
テスト周りの進化をふりかえる
2018/12/14(Fri) @ HAKATA Test Night #1
平田敏之(@tarappo)
自己紹介
平田 敏之@DeNA / SWET (Software Engineer in Test)
ミッション
? DeNAサービス全般の品質向上
? DeNAエンジニアの開発生産性向上
私の担当(の一部)
? 自動テスト(iOS領域)
? プロセス(CI/CD周り)
? Test Night 主宰
はじめに
? 2018年が終わるいま「WWDC」を思い出してみましょう
? 「What’s New in Testing」を見ましたか?
? Appleのプラットフォームを取り巻く「Testing周り」は進化
しています
? Xcode10のテスト周りの進化をふりかえってみましょう
Xcode 10から開発時におけるサポートが増えました
今なら日本語訳もあります
本発表で話すこと
(15分)
? What’s New in Testing 2018
? ? Code coverage
? ? Test selection and ordering
? Automatically include new tests
? Randomize execution order
? ? Parallel testing
? Execute parallel on Simulator
Xcode10からの新機能
Xcode9.4.1
Edit Scheme
Xcode10.1
Edit Scheme
Xcode10からの新機能
1. Automatically include new tests
2. Randomize execution order
3. Execute parallel on Simulator
Automatically include new tests
新規に実装したテストコードを自動で含めるか否か
? 「Automatically include new tests」が指定できるよ
うになりました
? デフォルトはオン
Automatically include new tests
新規に実装したテストコードを自動で含めるか否か
? Xcode 9までの世界
? 新規テストコードはすべてEnabled
? 実行対象外にしたい場合は手動でDisableにする
必要がある
Automatically include new tests
新規に実装したテストコードを自動で含めるか否か
? Xcode 9までの世界
? SchemeのTestの箇所のチェックを外すと全て対
象外になるが…
Enableを選択しても対象外のまま
Automatically include new tests
新規に実装したテストコードを自動で含めるか否か
? Xcode10からの世界
? 「Automatically include new tests」のチェックを
外すと新規テストコードはDisableになる
Automatically include new tests
新規に実装したテストコードを自動で含めるか否か
? Xcode10からの世界
? Schemeからの一括Enabledもちゃんと動きます
Automatically include new tests
新規に実装したテストコードを自動で含めるか否か
? この機能はどんなときに利用するのか?
? 例えば
? 自動で追加しない:チェックをオフ
? 対象:常に動かすテストコード
? 安定してから実行対象にする
? 自動で追加する:チェックをオン
? 対象:Nightlyなどで動かすテストコード
? 安定するかを確かめる
Randomize execution order
テストのランダム実行
? 「Randomize execution order」が指定できるよう
になりました ?
? デフォルトはオフ
Randomize execution order
テストのランダム実行
? テストの実行順序
? Xcode 9までの世界
? アルファベット順(Alphabetical)
? 名前が変わらない限り常に一定
? Xcode 10からの世界
? (new) ランダム実行
? アルファベット順:デフォルト
Randomize execution order
テストのランダム実行
自動テストをランダム実行できると何が良いのか?
? 自動テストはそれぞれのテストケースが独立しているのが良い
? 他のテストケースに副作用を与えてはいけない
? 副作用を与えているかどうかは分かりづらいこともある
? テストの実行順が常に固定であれば問題が発見されづらい
ランダム実行をするとそんな依存関係が見つかるかも
Randomize execution order
テストのランダム実行
自動テストはそれぞれのテストケースが独立しているのが良い
?
? テストケースが増えたときなどにテストが急に失敗することがある
? 特定のテストケース「だけ」で実行したときに失敗することがある
? 本来テストしたかったことをちゃんと考えられてない可能性がある
全てのテストを実行すると成功するけど、
一部を指定して実行するとテストが失敗する
という世界もありえます
Randomize execution order
テストのランダム実行
? Arrange-Act-Assert
? http://wiki.c2.com/?ArrangeActAssert
? Arrange
? 前提条件
? Act
? 操作
? Assert
? 期待値の確認
別のテストケースの実行(Arrange-Act)が
他のテストケースのArrangeに
なっていることがある
Randomize execution order
テストのランダム実行
ランダム実行にして実行すると良い!
しかしまだ課題もあります
Randomize execution order
現状の課題
? ランダムで実行してテストが落ちた場合、再度そのランダム順で
実行する術がない
? Rspecの場合
? ランダム実行時は、シードが生成されるので、そのシードを使
って再度同じ順番で実行することができる
? Rspec2.8(2012/1)からの機能
? -order rand: xxxx
https://openradar.appspot.com/radar?id=4953802914398208
Execute parallel on Simulator
並列実行
? Xcodeからの実行でもシミュレーターの並列実行を
することができるようになりました ?
? コマンドラインからもできます
? デフォルトはオフ
Execute parallel on Simulator
並列実行
? Xcode 9までの世界
? 複数のシミュレーターを起動可能になった ?
? fastlaneも対応
? 欠点
? xcodebuildからの実行のみ対応
? destinationsで指定
? Xcode 10からの世界
? Xcodeからの実行に対応
? destinations毎ではない実行
Execute parallel on Simulator
並列実行
? Xcodeからの実行方法
? チェック状態になっていれば自動で並列化
? テストを実行する「だけ」でOK
? 並列の仕方
? クラス単位での並列化(テストメソッド単位ではない)
? メインとなるシミュレーターの複数のクローンを作っての実行
? 数はコマンドラインからオーバーロードできる
Execute parallel on Simulator
並列実行
? コマンドラインからの実行時は次を指定して設定の
上書きが可能
? -parallel-testing-worker-count n
? nの数はマシンのスペック次第
? -parallel-testing-enabled YES | NO
? xcprettyは未対応(テストレポート出力はできない)
? https://github.com/supermarin/xcpretty/issues/344
Execute parallel on Simulator
並列実行
? コマンドからの実行
? fastlaneの場合の例
? xcodebuildコマンド直接の場合の例
? xcodebuild -scheme testnight-testScheme -project
./testnight.xcodeproj -destination 'platform=iOS
Simulator,name=iPhone X' -parallel-testing-enabled YES -parallel-
testing-worker-count 4 test
並列化により実行時間が短縮!
開発が捗る!
しかし落とし穴もあります
Execute parallel on Simulator
並列実行
1. テストの実行時間は各クラスの実行時間に依存する
? 並列化はクラス単位おこなわれます
? Espresso(Android)のtest shardingはcase単位
? 1つでも実行時間が長いクラスがあると…
2. 並列実行を許容するテストコードでなければならない
? 例えば、同じデータを並列して変更すると…
? データの不整合の発生
Execute parallel on Simulator
現状の課題(の例)
テストの実行時間
A
B
C
D
E
実行時間
Execute parallel on Simulator
現状の課題の対策例
テストの実行時間
A
B
C
D
E
実行時間
A’
A’
クラスを良い感じに
分割しましょう
Execute parallel on Simulator
現状の課題の対策例
並列化におけるさらなる工
夫
? テスト実行するクラスを絞ることができます
? -only-testing:実行する対象を指定
? 複数指定ができる
? -skip-testing:実行しない対象を指定
? 動かない..?
Execute parallel on Simulator
さらなる工夫
活用しましょう
(今の)自動テストは毎回すべてを実行するというものでもない
? 自動テストをあらかじめグルーピングしておく
? test sizeそれぞれでわけておき実行パターンを変える
? 実行時間の履歴を用いてグルーピングする
? 並列数に応じてどうグルーピングするかを決める
Execute parallel on Simulator
さらなる工夫
さいごに
? iOS周りも以前に比べると進化しています
? WWDC 2017 「What’s New in Testing」
? 要チェック
? WWDC 2018 「What’s New in Testing」
? 要チェック!
? ぜひ、さわってみましょう
? 知見はぜひ、Test Night(など)で

More Related Content

Xcode10での テスト周りの進化をふりかえる