Xcode 16 Betaの「XCTest」の紹介
Xcode 16 Betaのリリースノートから「Testing」については次で紹介したとおりです。
本記事では、そのリリースノートの「XCTest」という新項目(今回追加されたAPI的に以前だと 「UI Testing」という項目になるかと思います)に記載されている内容について紹介します。
XCTestの新規API
UIテストに関連する次の4つの新規APIがXCTestに追加されています。
XCUIElementに新しいAPIが追加されました
(1)指定された値になるまで指定時間待つ
wait(for:toEqual:timeout:)
(2)要素が存在しなくなるまで指定時間待つ
waitForNonExistence(withTimeout:)
デバイス向けに新しいAPIが追加されました
(3)ハンドジェスチャーがサポートされているかどうか
supportsHandGestures
(4)(AppleWatch向け)ダブルタップハンドジェスチャーを実行
XCUIDeviceHandGesture
上述した内容について実際のドキュメントをもとに説明を軽くしていきます。
API diffについては次を確認してください。
XCUIElementに追加された新しいAPI
(1)指定された値になるまで指定時間待つ
特定のUI要素が指定された値になるまで指定時間で待つことができます。
今までは次のようなAPIがありましたが、なかなか実装が面倒な側面がありましたが、今回のAPIで比較的かんたんにwaitができるようになっています。
例えば、次のように書いたとします。
let keyPath: KeyPath<XCUIElement, Bool> = \.isHittable
_ = element.wait(for: keyPath, toEqual: true, timeout: TimeInterval(1))
すると、指定したUI要素(ここではelement)のisHittableが指定した値(ここではtrue)になるまで指定した時間(ここではTimeInterval(1))まで待ってくれます。
これと次に書いた(2)を使うことでよりUIテストで待つことがやりやすくなります。
(2)要素が存在しなくなるまで指定時間待つ
今まであったのは、`waitForExistence` で、これは指定された要素が存在するまで指定時間待つものでした。
なにかの操作をおこない、それによってなにかのUI要素が存在することを確認するために利用するといったものです。
一方、これだと操作をおこない、それによってなにかのUI要素が「存在しなくなる」というのを確認できません。
そのため存在しなくなるというのを確認したい場合は自前で `exists` といったプロパティを都度確認する必要がありました。
(ちなみに存在する=タップできるではない点に注意が必要です)
今回の`waitForNonExistence`は「要素が存在しなくなるまで指定時間待つ」ものになります。
この手のは「対」になって存在していると便利だったりします。
デバイス向けの新しいAPI
(3)ハンドジェスチャーがサポートされているかどうか
iOSで利用できる「ハンドジェスチャー」というのがあります。
たとえば、Facetimeで手で特定のジェスチャーをするだけで何かしらのエフェクトが起きたりします。
これらは、iPhone端末ではあまり使ってないかも知れませんが、Apple WatchではCMでも使われているため、利用している方も多いかも知れません。
また、Apple Vision Proではよく使うことになるかと思います。
この「ハンドジェスチャー」がデバイスとしてサポートされているかどうかを確認するのがこの`supportsHandGestures` というAPIになります。
(4)(AppleWatch向け)ダブルタップハンドジェスチャーを実行
Apple Watch向け(watchOSデバイス向け)のAPIとしてハンドジェスチャーをおこなう `XCUIDeviceHandGesture` が追加されています。
この中で、ダブルタップができる`doubleTap` がサポートされました。
Swift Testingのような大きな変化はありませんが、UIテスト向けのXCTestも少しずつ改良されています。
Swift Testingとあわせていろいろなテストレベル/サイズの自動テストを活用していきましょう!