シャーディングを設定する

このページでは、シャーディングを介してスイート モジュール(AndroidTest.xml)を調整し、ラボでの連続実行中に最適な速度パフォーマンスを得る方法について説明します。各オプションの一般的な使用について、その根拠とともに説明します。

ラボでスイートを連続して実行する場合、全体の完了時間を短縮するために、スイートは通常複数のデバイス間でシャーディングされます。ハーネスは通常、各シャードの実行時間のバランスをとって全体的な完了時間(最後のシャードの終了時)を最小化しようとします。しかし一部のテストの性質上、必ずしも十分なイントロスペクションがあるとは限らず、モジュールのオーナーがなんらかの動作を調整する必要があります。

シャーディング可能かどうか

モジュール(AndroidTest.xml)に <option name="not-shardable" value="true" /> というタグを付けて、シャーディング不可であることをハーネスに通知できます。

一般的なモジュールではハーネスでモジュールをシャーディングするのが正しい方法(デフォルトの動作)ですが、場合によっては、この動作をオーバーライドする必要があります。

  • モジュールの設定にコストがかかる場合:

モジュールをシャーディングすると、対象のデバイスごとに、準備(APK や push ファイルなどのインストール)が 1 回実行される可能性があります。モジュールの設定に時間やコストがかかり、テスト実行時に比べて複製に値しない場合は、モジュールに not-shardable のタグを付けます。

  • モジュール内のテスト数が少ない場合:

モジュールをシャーディングすると、すべてのテストケースが異なるデバイスで独立して実行される可能性があります。これは最初の項目に関連しています。テストの数が少ないと、一部のシャードでテストが 1 回しか実行されないか、まったく実行されないことがあり、準備のコストが割高になります。たとえば 1 つのテストケースに APK をインストールすることは、通常、価値がありません。

インストルメンテーション テスト: シャードの最大数

AndroidJUnitTest で実行されるインストルメンテーション テストでは、実際に APK をインストールして実行するまで、インストルメンテーションに含まれるテストの数がハーネスに対し明らかにされません。このようなオペレーションにはコストがかかり、スイートの全モジュール部分のシャーディング時に実行できません。

ハーネスがインストルメンテーション テストを過度にシャーディングし、空のシャードになる場合があります。5 つのテストがあるインストルメンテーション テストを 6 つのシャードにシャーディングした場合、1 つのテストを含むシャード 5 つと、テストを含まないシャード 1 つになります。これらのシャードがそれぞれ、コストがかかる APK のインストールを必要とします。

そのため、インストルメンテーション テスト APK のテスト数が少ない場合は、モジュールに <option name="not-shardable" value="true" /> のタグを付けることで、シャーディングする価値がないことをハーネスに通知できます。

AndroidJUnitTest ランナーには、シャーディング可能な最大数を指定できる特別なオプション <option name="ajur-max-shard" value="5" /> があります。

これにより、呼び出しレベルでリクエストされるシャードの数に関係なく、インストルメンテーションをシャーディングできる最大回数を指定できます。デフォルトで、インストルメンテーションは、呼び出しでリクエストされたシャード数にシャーディングされます。

たとえば、インストルメンテーション テスト APK に含まれるテストケースが 2 つしかなくてもシャーディングを行う場合、ajur-max-shard 値を 2 にすると、空のシャードは作成されません。