忙しい人向けの Handle interruptions and alerts in UI tests - #WWDC20

画像1

UI割り込みとは?

UI割り込みとは、UIテストにおいてアクセスしようとしている要素を予期せずブロックする要素のこと。この例では、バナーは TableView の行を隠さないため詳細画面へは遷移できるが・・・

画像2

戻るボタンが隠れてしまうので、詳細画面から一覧へ戻ることはできない。このケースではバナーはUI割り込みとみなされる。

画像3

UI割り込みの例としては、バナー・ダイアログ・他のウィンドウ、などがある。いずれも予期せず表示されるもの。UIテストによってボタンタップしてアラートが表示されるケースなどは該当しない

画像4

割り込みハンドラは、XCTest によってスタック管理されるクロージャ一覧でテスト毎にリセットされる。割り込みハンドラが処理に成功したら true を返却してUIテストを続行し、失敗したら false を返却して次のハンドラでの処理が試みられる。

画像5

暗黙の割り込みハンドラ

XCTest は暗黙の割り込みハンドラを提供しており、iOS ではダイアログに対して”キャンセル”または”デフォルト”をタップする。Xcode 12 からはバナーについても処理されるようになった。

画像6

macOS ではパーミッションダイアログに対しては”許可しない”、Bluetoothセットアップについてはウィンドウを閉じる。

画像7

デモ

サーバとの通信エラー時にダイアログが表示されるケースについて見ていく。ここでは false を返却するだけの独自のハンドラを用意した。

画像8

テストコードではセルをタップしようとしているが、ダイアログが表示されているため処理を続行できない。

画像9

ダイアログはUI割り込みにあたるので、割り込みハンドラが実行される。ここでは処理できないとして false を返却しているが・・・

画像10

XCTest に用意された暗黙の割り込みハンドラによって”キャンセル”がタップされる。

画像11

”キャンセル”ではなく”リトライ”をタップしたい場合は、次のように実装すればよい。ここでは”リトライ”がタップできたら、割り込みに成功したとして true を返却している。

画像12

ベストプラクティス

テストによって表示される要素や、いつ表示されるか分かっている要素に対しては明示的に処理する。非決定的なものについてだけ割り込みハンドラを利用する。

画像13

セルをスワイプして削除する際に表示されるダイアログについては、次のように明示的に処理できる。

画像14

認証情報をクリアするAPI

システムの一部のリソース(写真など)にアクセスする際は、ダイアログが表示され明示的に”許可”または”非許可”にする必要がある。テストとしては両方のパスを確認したいが、選択結果はシステムに保存されてしまう。

画像15

認証情報をクリアする API が追加された。認証情報をクリアするとアプリが再起動されることもあるので注意。これはUIテストに限った話ではなく、ユーザが設定から認証ステータスを変更した時も同様。

画像16

写真への認証情報をクリアするコード例は次のとおり。アプリが再起動されるため、app.launch() の前に実行している。

画像17

まとめ

・UI割り込みは予期せず発生し、要素へのアクセスをブロックする。
・XCTest では暗黙の割り込みハンドラが提供されている。
・割り込みハンドラは非決定的なものに対してのみ利用する。
・認証情報をクリアするAPIが追加された。

免責

・本記事は公開情報のみに基づいて作成されています。
・要約(意訳)のみなので、詳細はセッション動画をご確認ください。

役に立った記事などありましたらサポート頂けると嬉しいです。