ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
テストをXCTSkipする
大事なテストの結果を入手しましょう-そして大事でないものはSkipしましょう。XCTSkipを実行し、条件に合わせてテストがランタイム中に開始しないようにする方法をお伝えします。この新しいテスト結果をどう戻し、様々なテストの中で単にpassとfailだけではないドキュメントテストの実施方法を丁寧にご説明します。 このセッションを最大限に活用するには、XCTestと、unit/UIテストについての知識があることが望ましいです。事前に"Testing in Xcode"をご覧ください。 XCTSkipを学んだら、テストに関する改善点も確認しましょう:"Triage test failures with XCTIssue"、"Handle interruptions and alerts in UI tests"、"Eliminate animation hitches with XCTest"をご覧ください。 テストスイートを改善するには、"Write tests to fail"をご覧ください。
リソース
関連ビデオ
WWDC22
WWDC20
- より早くテスト結果を得る
- 不具合検出テストを書く
- UIテストにおける割り込みやアラートの処理
- XCTestを使ってアニメーションヒッチを除去する
- XCTIssueを使用してテストの失敗をトリアージする
WWDC19
-
ダウンロード
こんにちは WWDCへようこそ “XCTSkip Your Tests” 私はウィル Xcodeのテストおよび 自動化を担当しています このセッションでは XCTSkipについてお話しします 実行時の条件に基づく テストの実行を管理する新しいAPIです 一部のテスト 特に統合テストでは 模擬的に再現しにくい 必要条件や依存関係があります 例えばアプリケーションがiPad特有の 機能を持っている場合 iPhoneではテストできません 別のテストでは 古いOSで動いているデバイスで 利用できないAPIを用いるかもしれません メンテナンスのために定期的にオフラインの サーバーでテストが必要なこともあります これらすべては実行時にのみ決定できる 条件の例です テストの必要条件を満たさない環境で 取り扱えるようにするには 条件付きの実行の作成が必要です それ以外に テスト担当者には 2つの選択肢しかありません 早めに終わらせてテストを合格にするか 不合格を報告するかです
どちらの場合にも問題があります 実際には検証に合格していない プログラムが機能します 他方でテスト不合格となると 何が悪いのかわからず 判断のため多くのリソースを 消費したりするかもしれません 幸い XCTSkipが使用できるようになりました 条件付きの実行が必要な テストを行うことができます このAPIはXcode 11.4で導入されたもので 新しいテスト結果を出します テストは合格か不合格ですが XCTSkipでは 明示的に“スキップ”の結果が出せます
Xcodeはこのアイコンを使って スキップされたテストを強調し テストスイートが実際に検証したことの 明確な全体像を見ることができます これが実際にどのように動作するか 見てみましょう Play Gardenという名前の 小さいプロジェクトがあります これは私が3歳の娘と一緒に 作ったものです Play Gardenは裏庭にある すべての植物やおもちゃ 家具などの 追跡と管理を支援してくれます 最近になってpointer interactionを サポートすることにしました 人気の機能で アプリケーションをほぼiPadで使うためです
娘はまだ3歳ですが テスト重視の開発を完全に取り入れています したがってこの新しい機能に対して いくつかの単体テストを加えることが課されます 画面でこれらのテストの1つを ご覧いただけるでしょう このテストには2つの条件があり それに従うと実行が 意味をなさない可能性があります まず pointer interactionは iOS 13.4で導入されたので このテストはそれ以前のOSで 実行できません そのため古いiOSバージョン用にXCTSkipを使った 利用可能なガードを追加しました
次にアプリケーションはiPadでだけ pointer interactionを有効にします したがって もし他のデバイスで実行した場合 このテストを実行する必要はありません この条件を扱うため “XCTSkipIf”を使います 最初にこのテストを 通常どおり実行できるような 環境で行いましょう iOS 14が入ったiPadを使います
ご覧いただいたとおり 期待通りに実行されて合格しました それではもっと古いデバイスで実行しましょう iOS 13.0が入ったiPhoneです
今回はテストを実行するのに キーボードショートカットを使用します “control option command G”です これは単純に直近のテスト アクションを繰り返します
今度は緑の“合格”アイコンが グレーの“スキップ”アイコンに 変わったのが見えます ソースエディタの注記に テストがスキップされた場所と理由が示されます
他にXcodeでUIがスキップ結果を 提供しているところがないか確認しましょう 最初にTest Navigatorです
ここでスキップがテストの横に 表示されているのがわかります さらに 表示されているリストを絞込み スキップされたテストだけを表示できます ナビゲーター下の このボタンを使います
それでは テストの報告書を見てみましょう
ここにスキップされた実行があります
テストの詳細を開くと スキップが発生した場所の ファイルと行が 理由の説明とともにわかります こうやって見ていくと 行の最後の2つのボタンに 気付いたかもしれません 最初のボタンは“ジャンプ”です スキップが発生した場所とソースに 連れていってくれるものです 2番目のボタンを確認するために 戻ります
“アシスタント”ボタンはXcode 12の新機能で 2番目のエディターを開いて スキップが参照したソースの 場所を示します これにより テスト報告書と ソースコードを並べて確認できます 最後に 連続した統合において スキップがどう見えるか確認しましょう
CIシステムからの結果がここにあります テストを3つの異なるデバイスで 実行したものです このテストだけに焦点を当てるため “スキップ済”の絞り込みを使います テスト結果の詳細で テストを実行した各デバイスの結果が見えます 最初のiPadでは合格で 他のデバイスではスキップです デバイスの結果の詳細を拡げると スキップの場所と理由が表示され すべての情報を手に入れられます これで終わりです 簡単だったでしょう XCTSkipをテストで使うと 様々な条件に対するテストについて Xcodeはスキップされたテストと 通常に合格または不合格になったものの 差をはっきりと 表示することができます それではAPIの詳細を見てみましょう
デモでご覧いただいたとおり XCTSkipの使用方法は何通りかあります XCTSkipを開始する関数は2つあります XCTSkipIfと XCTSkipUnlessです どちらの関数も同じパラメーターを取ります XCTSkipIfは条件式が真の場合に スキップします XCTSkipUnlessは条件式が偽の場合に スキップします
この例ではiPad以外のデバイスで実行された時に テストがスキップされる方法を示しています
テストはXCTSkip構造体を 直接投げることもできます これはガードと組み合わせると便利で 先ほどiOS 13.4向けの 利用可能なチェックとともに紹介しました
まとめると 一部のテスト 特に統合テストは 特定の条件下では 実行できない場合があります そういった条件に対応するために XCTSkipが使えます テストの実行結果を 最も正確にモデル化できる方法です これによって結果的に 全体の結果が確実により明快になります 連続統合システムの一連のテストを 実行しているさいは特にそうです ご視聴ありがとうございます
-
-
5:45 - Use XCTSkipUnless to bypass a test on devices other than iPad
func testExample() throws { /// Example usage: skip test if device is not an iPad try XCTSkipUnless(UIDevice.current.userInterfaceIdiom == .pad, "Pointer interaction tests are for iPad only") // test... }
-
5:58 - Use guard+XCTSkip to bypass a test on an older OS version
func testExample() throws { /// Example usage: skip test if OS version is older than iOS 13.4 guard #available(iOS 13.4, *) else { throw XCTSkip("Pointer interaction tests can only run on iOS 13.4+") // test... }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。