忙しい人向けの Handle interruptions and alerts in UI tests - #WWDC20
UI割り込みとは?
UI割り込みとは、UIテストにおいてアクセスしようとしている要素を予期せずブロックする要素のこと。この例では、バナーは TableView の行を隠さないため詳細画面へは遷移できるが・・・
戻るボタンが隠れてしまうので、詳細画面から一覧へ戻ることはできない。このケースではバナーはUI割り込みとみなされる。
UI割り込みの例としては、バナー・ダイアログ・他のウィンドウ、などがある。いずれも予期せず表示されるもの。UIテストによってボタンタップしてアラートが表示されるケースなどは該当しない。
割り込みハンドラは、XCTest によってスタック管理されるクロージャ一覧でテスト毎にリセットされる。割り込みハンドラが処理に成功したら true を返却してUIテストを続行し、失敗したら false を返却して次のハンドラでの処理が試みられる。
暗黙の割り込みハンドラ
XCTest は暗黙の割り込みハンドラを提供しており、iOS ではダイアログに対して”キャンセル”または”デフォルト”をタップする。Xcode 12 からはバナーについても処理されるようになった。
macOS ではパーミッションダイアログに対しては”許可しない”、Bluetoothセットアップについてはウィンドウを閉じる。
デモ
サーバとの通信エラー時にダイアログが表示されるケースについて見ていく。ここでは false を返却するだけの独自のハンドラを用意した。
テストコードではセルをタップしようとしているが、ダイアログが表示されているため処理を続行できない。
ダイアログはUI割り込みにあたるので、割り込みハンドラが実行される。ここでは処理できないとして false を返却しているが・・・
XCTest に用意された暗黙の割り込みハンドラによって”キャンセル”がタップされる。
”キャンセル”ではなく”リトライ”をタップしたい場合は、次のように実装すればよい。ここでは”リトライ”がタップできたら、割り込みに成功したとして true を返却している。
ベストプラクティス
テストによって表示される要素や、いつ表示されるか分かっている要素に対しては明示的に処理する。非決定的なものについてだけ割り込みハンドラを利用する。
セルをスワイプして削除する際に表示されるダイアログについては、次のように明示的に処理できる。
認証情報をクリアするAPI
システムの一部のリソース(写真など)にアクセスする際は、ダイアログが表示され明示的に”許可”または”非許可”にする必要がある。テストとしては両方のパスを確認したいが、選択結果はシステムに保存されてしまう。
認証情報をクリアする API が追加された。認証情報をクリアするとアプリが再起動されることもあるので注意。これはUIテストに限った話ではなく、ユーザが設定から認証ステータスを変更した時も同様。
写真への認証情報をクリアするコード例は次のとおり。アプリが再起動されるため、app.launch() の前に実行している。
まとめ
・UI割り込みは予期せず発生し、要素へのアクセスをブロックする。
・XCTest では暗黙の割り込みハンドラが提供されている。
・割り込みハンドラは非決定的なものに対してのみ利用する。
・認証情報をクリアするAPIが追加された。
免責
・本記事は公開情報のみに基づいて作成されています。
・要約(意訳)のみなので、詳細はセッション動画をご確認ください。
役に立った記事などありましたらサポート頂けると嬉しいです。