ループを使用すると、1回のテスト実行内で一連のテストステップを指定した回数繰り返すことができます。ループは、ドロップダウンのすべてのオプションを選択する、カートに複数のアイテムを追加する、テーブルの各行を確認するなど、リスト内の各アイテムに対して同じ操作を実行する必要がある場合に役立ちます。この記事では、テストでループを作成して操作する方法について説明します。具体的には以下の内容を含みます。
- ループを作成する
- ページ上のアイテムをループ処理する
- 配列内のアイテムをループ処理する
- ループインデックス変数を使用する
- ループを早期に終了させる
- Trainerでループを再生する
- テスト実行でのループ出力を確認する
制限事項
APIテストのフローでは、ループはサポートされていません。
ループを作成する
mablトレーナーで、次の手順を実行してループを作成します。
-
[+ (ステップを追加)] > [ループ処理] をクリックします。
-
ループはmablのフローとして保存されます。フローに名前を付けてください。
-
[ループ処理] タブをクリックします。
-
ループ処理のオプションを選択します。
- [指定回数ループ処理]: 指定した回数だけステップを繰り返します。値は2~500の有効な数値である必要があります。
- [変数を使ったループ処理]: 数値変数からイテレーション回数を動的に設定します(こちらも2~500)。
- [要素を使ったループ処理]: CSSクエリーに一致するすべての要素をループ処理します。ブラウザーテストのみでサポートされています。
- [変数配列を使ったループ処理]: 配列型変数の各アイテムに対して1回ずつループします。ブラウザーテストとモバイルテストの両方でサポートされています。
フローパラメータを使用してループするようにフローを設定することはできません。
-
OKをクリックします。
-
[Start flow] ステップと [End flow] ステップの内側にTrainerのカーソルがある状態で、ループ内で繰り返すテストステップを記録します。
または、既存のテストステップのセットをループに変換することもできます。ループを作成し、[Start flow] ステップと [End flow] ステップをドラッグアンドドロップして、ループ内で繰り返すテストステップを囲みます。
フローにループ値を設定しても、その設定は他のフローのインスタンスには適用されません。ループとして機能することを意図したフローを識別するために、ワークスペース内で命名規則を使用することをお勧めします。
ループの設定
ページ上のアイテムをループ処理する
ループの一般的なユースケースとして、ドロップダウンのオプション、テーブルの行、メニューアイテムなど、ページ上の動的なリストの各アイテムに対してステップを繰り返すことが挙げられます。
最も簡単な方法は、ループの作成時に [要素を使ったループ処理] を選択することです。mablはCSSクエリーに一致するすべての要素をループ処理し、{{@run.loop_locator}}というランタイム変数が現在のイテレーションで一致する要素をターゲットにします。
- ループを作成し、[要素を使ったループ処理] を選択します。
- ループ処理する要素を特定するCSSクエリーを記述します。
- ループ内で、要素の検索ステップで
{{@run.loop_locator}}を使用し、現在のアイテムを操作します。クリックする、テキストをアサートする、プロパティから変数を作成する、といった操作が可能です。
要素を使ったループ処理は、ブラウザーテストのみでサポートされています。
インデックス変数を使用する
カスタムXPathセレクターが必要な場合や、テスト内の他の場所で要素数を再利用したい場合は、代わりにインデックス変数を使用してループできます。
- アイテムを数える。 要素を検索を使用して、ループ処理する要素を見つけます。要素数から変数を作成してください。
- カウント変数を使用してループを作成する。 上記のステップに従ってループを作成し、[変数を使ったループ処理] を選択して、先ほど作成したカウント変数を選択してください。
-
ゼロベースのインデックス変数を作成する。 ループ内で、値が
{{@run.loop_index-1}}のindexという変数を作成します。これは、run.loop_indexが1から始まるのに対し、要素リストはゼロインデックスであるため必要です。詳細については、ループインデックスの使用に関するセクションを参照してください。 -
インデックスを使用して各アイテムをターゲットにする。 要素を検索を使用し、
{{@index}}を組み込んだXPathまたはCSSセレクターで現在のアイテムをターゲットにします。例:(//li[@role="option"])[{{@index}}]。 - アクションを実行する。 要素をクリックする、テキストをアサートする、プロパティから変数を作成する、または各アイテムに対して繰り返す必要がある他のステップを記録してください。
要素からテキストやプロパティをリストに抽出する必要がある場合は、スニペットジェネレーターを使用して、必要な値を収集するJavaScriptスニペットを作成できます。
配列内のアイテムをループ処理する
以前の共有変数やテストステップからデータのリストを収集している場合は、[変数配列を使ったループ処理] を使用して、各アイテムに対して1回ずつループ処理できます。このオプションは、APIレスポンスやJavaScriptスニペットの出力をループ処理する必要があるテストシナリオに最適です。ループを作成すると、{{@run.loop_item}}というランタイム変数が、現在のイテレーションでの配列の値に解決されます。
- データの配列を抽出し、変数に格納します。たとえば、アカウント内のすべてのユーザーを取得するAPIリクエストを実行し、その結果を
account_usersという変数に格納します。 - ループを作成して [変数配列を使ったループ処理] を選択し、配列変数を選択します。
- ループ内で、
{{@run.loop_item}}を使用して現在のアイテムにアクセスします。これを使用して、リスト内の各アイテムを検索、操作、または検証します。
配列にオブジェクトが含まれている場合は、波括弧内でドット記法を使用してプロパティにアクセスします。たとえば、account_usersの各アイテムにemailプロパティがある場合、{{@run.loop_item.email}}を使用してすべてのユーザーのメールアドレスをアサートできます。
変数配列を使ったループ処理は、ブラウザーテストとモバイルテストの両方でサポートされています。
ループインデックス変数を使用する
ループ内では、run.loop_indexという名前の、1から始まる特別な読み取り専用の変数が追加されます。ループインデックスにアクセスするには、mablの変数構文{{@run.loop_index}}を使用します。
ゼロベースのインデックス
run.loop_indexは1から始まるため、配列や要素リストなどのゼロインデックスデータにアクセスする際は調整が必要です。ループ内で値が{{@run.loop_index-1}}の変数を作成し、セレクターやデータアクセス式でその変数を使用してください。
スニペットでループインデックスにアクセスする
スニペットでは、次のいずれかの方法でループインデックスにアクセスできます。
-
{{@run.loop_index}}をスニペットのパラメータとして追加します。 -
mablInputsオブジェクトからループインデックスにアクセスする:mablInputs.variables.web.runtime.flow_run_ordinal_index
ループを早期に終了させる
特定の条件が満たされたときに終了するホワイルループを実質的に作成するには、次のステップに従ってください。
- 変数を作成し、値として数値を代入します。
- 作成した変数を使ってループするフローを作成します。
- フロー内で、ループが終了する条件をアサートするIFステップを追加します。
- IFステップで、ループ変数と同じ名前で新しい変数を作成する変数ステップを追加し、その値を0に設定します。
- ELSEステップを追加します。
- ELSEステップで、ブレーク条件が満たされなかった場合にループが実行するステップを記録します。
次の例では、変数totalを500に初期化しています。ループ内で、チェックされたチェックボックスの数が5に達するとすぐに、totalの値が0に変わります。ループ変数の値を更新すると、ループが早期に終了します。
ループを早期に終了させる
このパターンは、期待する値が表示されるまでページを更新するなど、ポーリングのシナリオにも役立ちます。ループ回数を最大リトライ数に設定し、期待する要素または値が存在する場合にループを終了する条件を追加してください。
Trainerでループを再生する
mablトレーナーでループを再生する際、ループを途中で停止したとしても、mablは現在のインデックスからループ再生を再開しようとします。Trainerでの再生用に特定の反復にループを設定するには、ループドロップダウンをクリックしてください。
テスト実行でのループ出力を確認する
クラウドでループを含むテストを実行すると、テスト出力には各イテレーションに対して次のタグが表示されます: Loop: {current index}/{total loop count}。
{total loop count}は、テスト実行中にループが実行された回数を示します。この数値は、テストに設定されたループ回数と必ずしも同じではありません。例えば、ループを5回実行するように設定していても、ループの3回目のイテレーション中にテストが失敗した場合、テスト実行のループ合計回数は5ではなく3になります: Loop: {current index}/3。
ループとデータテーブル
ループとデータテーブルシナリオは、それぞれ異なる目的を持っています。
- ループは1回のテスト実行内でステップのサブセットを繰り返します。
- データテーブルシナリオは、データの行ごとにテスト全体を1回実行します。