branch10480’s blog

Topics that I've learned.

iOSアプリ開発自動テストの教科書 を読んでいく 〜 27 〜

UIテスト実行時間の短縮

UIテストの実行時間短縮には次の2つの方法がある。

方法
ビルドとテストの実行を分離する
テストの実行を並列化する

ビルドとテストの実行を分離する

通常、Xcodeからテストを実行するときには次の2つのステップで実行される

  1. テスト用アプリのビルド
  2. ビルドしたアプリでのテスト実行

GUIではなく、CUIの xcodebuild コマンドではこれらを別々に実行できる。

  1. build_for_testing
  2. test_without_building

fastlane を使って次のように2つ lane を用意しておくと便利。

■ A

lane :build_for_testing do
    scan(
        derived_data_path: "my_folder",
        build_for_testing: true
    )
end

■ B

lane :test_without_building do
    scan(
        derived_data_path: "my_folder",
        test_without_building: true
    )
end

事前に A を実行しておき、そのビルドで作られた成果物を保存しておく。

テスト用のアプリをビルドし直す必要がないときは B のみでテストを実行すると、アプリ生成の時間を短縮して実行ができる。

テストの実行を並列化する

Xcode10から複数のiOSシミュレーターを起動させテストの並列実行が可能になった。

Xcode > Edit Scheme > Test > Infoタブ > Options

Execute in parallel on Simulatorのチェックで有効になる。

これをONにすると、1つの親シミュレーターからクローンが作られ並列にテストが実行される。この並列化はテストコードのクラス単位で勝手に分割して行ってくれます。

従って、テストコードが1つのクラスしか存在しない場合は、並列事項されない。(逆にいうとクラス内の連続性は担保される)

このような仕様のため、1つのクラスに多くのテストを書くと並列実行されず時間がかかる。そのため、可能であればクラスを分割しておくのがよい。(A -> A1 + A2 + A3 など)

コマンドラインから利用する際は、xcodebuildのオプションが用意されている。

オプション 説明
-parallel-testing-enabled YES/NO テストの並列実行するかどうか
-parallel-testing-worker-count NUMBER 並列実行上限

> 次回に続く