ハイライト
XCTest
XCTSkipAPI (Xcode 11.4 で導入) を使用すると、実行時条件が満たされない場合にテストが明示的なスキップ結果を返すことができ、Xcode と CI はドキュメント スキップの場所、理由、およびデバイス ディメンションの結果を報告します。
主要内容
統合テストは多くの場合、ランタイム環境に依存します。この機能は iPad でのみ有効になっているため、1 つのテストは iPad でのみ機能する可能性があります。別のテストでは、iOS 13.4 でのみ利用可能な API を呼び出す可能性があります。さらに別のテストは、時々メンテナンスされるサーバーに依存する可能性があります。これらの条件はコンパイル時に判断するのが難しく、テストを実行するときにのみ知ることができます。
この状況に対処するのはこれまで困難を伴いました。直接returnテストは合格したと表示され、コードが検証されたことがレポートに示されます。強制的に障害を発生させると、環境上の制限が製品の問題として扱われ、トラブルシューティングの時間が無駄になります。XCTSkipXCTest に 3 番目の結果 (合格、失敗、スキップ) を追加しました。
セッションの例としては、Play Garden という小さなアプリがあります。新しいポインタのインタラクション テストが追加されますが、ポインタのインタラクションは iOS 13.4 以降でのみ利用可能であり、このアプリは iPad でのみこのインタラクションを有効にします。テスト方法は、システムのバージョンとデバイスの種類を確認することから始まります。条件が満たされない場合、テストは合格または不合格を装う代わりにスキップをスローします。
この結果は、Xcode の複数のエントリに表示されます。スキップ コメントはソース コードの横に表示され、テスト ナビゲーターはスキップされたテストをフィルター処理でき、テスト レポートにはファイル、行番号、および理由がリストされます。 CI 内の 3 台のデバイスで同じテストを実行すると、レポートには 1 台の iPad が合格し、他のデバイスがスキップされたことが同時に表示されます。これは、漠然とした緑色の結果よりも実際のテスト カバレッジに近いものになります。
詳細
1. 実行時の前提条件をテスト結果に変換する
(00:14) 問題はセッションの開始時に定義されます。デバイスの種類、システムのバージョン、外部サービスのステータスなど、一部のテストの依存関係は簡単に模擬できません。XCTSkipテスト作成者は実行時に「今回は実行されません」と宣言し、このステータスをテスト結果に書き込みます。
(01:20) この API は Xcode 11.4 で導入されました。テストは合格、失敗、または明示的なスキップとしてマークされるようになりました。 Xcode はこれらのテストを専用のスキップ アイコンで区別し、テスト スイートが実際に検証した内容をレポートで説明できるようにします。
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...
}
キーポイント:
testExample()としてマークされていますthrowsスキップすると、XCTest によって認識される結果がスローされて現在のテストが中断されるためです。 -XCTSkipUnlessその表現は、falseテストはスキップされます。 -UIDevice.current.userInterfaceIdiom == .padトランスクリプトにおける iPad 専用のポインター操作シーンに対応します。- 理由文字列は Xcode および CI レポートに入力され、チーム メンバーはスキップの理由を確認できます。
2. 使用するguardシステムのバージョン要件を処理する
(02:19) Play Garden のポインター インタラクション テストにはシステム バージョン条件もあります。ポインター インタラクションは iOS 13.4 で導入されました。テスト対象の API が存在しないため、古いシステムでこのテストを実行しても意味がありません。
(05:52) セッションは直接スローを示していますXCTSkip構造体の書き方。に適しており、guard前提条件を組み合わせて使用して、後続のテスト ロジックをブロックします。
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...
}
キーポイント:
#available(iOS 13.4, *)テストエントリにシステムバージョン要件を書き込みます。 -throw XCTSkip(...)スキップ結果は直接返されるため、テストレポートでは古いシステム環境を誤って失敗として報告することはありません。 -reason には、スキップ条件と最小システム バージョンを指定します。- 後続のテスト コードは前提条件を満たす環境でのみ実行され、アサーションの失敗は実際の製品の問題を表す可能性が高くなります。
3. 理解するXCTSkipIfそしてXCTSkipUnless
(05:25) API レベルには 2 つのスロー関数があります。XCTSkipIfそしてXCTSkipUnless。パラメータは同じですが、違いはトリガー条件にあります。
try XCTSkipUnless(UIDevice.current.userInterfaceIdiom == .pad,
"Pointer interaction tests are for iPad only")
キーポイント:
XCTSkipIfその表現は、trueタイムスキップ。 -XCTSkipUnlessその表現は、falseタイムスキップ。- どちらもテスト メソッドの最初に記述し、最初に実行条件を記述し、次に実際のアサーションを入力するのに適しています。
- どの関数を選択するかは、条件式が自然に聞こえるかどうかによって決まります。
4. Xcode と CI でのビュースキップ
(03:22) 古いデバイスでテストが実行されると、Xcode は緑色のパス アイコンを灰色のスキップ アイコンに置き換え、ソース コード内のスキップの場所と理由をマークします。
(03:37) テスト ナビゲーターにはスキップされたステータスが表示され、下部のボタンを使用してフィルタリングして、スキップされたテストのみを表示できます。テスト レポートには、展開後のファイル、行番号、および理由が表示されます。 Xcode 12 の新しいアシスタント ボタンでは、二次エディタを開いてレポートとソース コードを並べて表示できます。
(04:34) CI レポートではデバイスの寸法が維持されます。この例では、同じテストが 3 つのデバイスで実行されます。 1 台の iPad が通過し、他のデバイスはスキップします。各デバイスの結果を展開すると、対応するスキップ位置とその理由が表示されます。
try XCTSkipUnless(UIDevice.current.userInterfaceIdiom == .pad,
"Pointer interaction tests are for iPad only")
キーポイント:
- 同じテストでも、宛先が異なると異なる結果が得られる場合があります。
- スキップ理由は CI トラブルシューティング資料の一部であり、ローカル マシンに戻って、実行されなかった理由を推測する必要はありません。
- 合格、不合格、およびスキップの統計が分離されているため、テスト カバレッジが実際の実行状況に近くなります。
- この種の情報は、プル リクエストや夜間テストの結果バンドル分析プロセスに組み込むのに適しています。
重要ポイント
- **対処方法: デバイスの機能に基づいて UI テストをスキップします。 ** 実行する価値がある理由: セッションの iPad ポインター操作の例は、デバイス タイプが実行時の条件であることを示しています。開始方法: テストメソッドの最初に使用します。
XCTSkipUnless(UIDevice.current.userInterfaceIdiom == .pad, "...")保護は iPad の対話型テストにのみ適しています。 - **対処方法: 最小システム バージョンをテスト エントリに書き込みます。 ** 実行する価値がある理由: 古いシステムにテスト対象の API が不足している場合、失敗の結果がトラブルシューティングの誤解を招く可能性があります。開始方法: 使用する
guard #available(...) else { throw XCTSkip(...) }新しい API に依存するテストをラップします。 - **対処方法: スキップされたテストを CI レポートで追跡します。 ** 実行する価値がある理由: 同じテストでも異なるデバイスで合格とスキップが発生する可能性があり、セッションではデバイスの寸法結果が表示されます。開始方法: 結果バンドルを保持し、スキップされたフィルターを押して、スキップされた数、位置、および理由を確認します。
- **やるべきこと: 統合テストの前提条件チェックを作成します。 ** 実行する価値がある理由: 外部サーバーのメンテナンス、ハードウェア機能の不足、異常なアカウント ステータスはすべて実行時の状態です。開始方法: テストの最初の段落にチェックを入れ、条件が満たされない場合はチェックを入れます。
XCTSkip、条件が満たされた後にアサーションを実行します。 - **対処法: スキップの理由をトラブルシューティング可能なテキストとして書き込みます。 ** 実行する価値がある理由: Xcode ソース コードのコメント、テスト ナビゲーター、テスト レポート、および CI 拡張項目はすべて理由を表示します。開始方法: 最小システム バージョン、ターゲット デバイス、サービス ステータスなどの条件とアクションの手がかりを含む文字列を使用します。
関連セッション
- 失敗するテストを書く — XCTest および UI テストが失敗した場合に、診断結果バンドルのコンテキストを残す方法について説明します。
- UI テストでの中断とアラートの処理 — ランタイム テストの条件管理に隣接して、UI テストでのシステム ポップアップと予期されるアラートを処理します。
- テスト結果をより速く取得する - CI テスト フィードバックの次のステップとして、テスト計画、タイムアウト、実行時間の許容値、および並列化を導入します。
- XCTIssue によるテスト失敗のトリアージ - XCTIssue を使用して構造化された失敗を記録し、スキップと連携してテスト結果のセマンティクスを改善します。
- XCTest でアニメーション ヒットを排除する — XCTest を使用してアニメーションとスクロールの遅延を測定し、品質回帰検出における XCTest の別の種類の実践を示します。
コメント
GitHub Issues · utterances