XCUITestは、iOS、iPadOS、macOSアプリケーションのUIテストのためのAppleのフレームワークであり、XCTestとXcodeに直接組み込まれています。タップ、テキスト入力、スワイプ、スクロール、ジェスチャーなど、ユーザーの操作をシミュレートし、インターフェース要素の内部状態にアクセスできます。Apple Developer Documentation、2025年によると、XCUIApplicationはすべてのUIテストのエントリポイントであり、画面要素の階層へのアクセスを提供します。
重要ポイント
XCUITestは、AppleがXcode 7(2015年)でリリースしたUIテストフレームワークです。これはUI Automation(UIA)に代わり、Appleプラットフォームでの自動インターフェーステストの標準ツールとなりました。XCUITestは、Appleの統一テストフレームワークであるXCTestに完全に統合されています。
クラスやメソッドレベルでロジックを検証するユニットテストとは異なり、XCUITestはアクションシミュレーションを通じてユーザーインターフェースをテストします。テストはアプリケーションとは別のプロセスで実行され、Accessibility APIを通じてアプリケーションと対話します。これにより、分離性と信頼性が確保されます。
XCUITestは、サードパーティのサーバー(Appiumとは異なります)やデバイス操作用の追加ライブラリをインストールする必要がありません。必要なものはすべてXcodeにすでに含まれています。これにより、新しいiOSバージョンとの最高の互換性と、新しいジェスチャーやコントロールへの即時アクセスが保証されます。
XCUITestのアーキテクチャは、2つの主要なクラスに基づいています。XCUIApplication(起動されたテスト対象アプリケーション)とXCUIElement(インターフェース要素)です。XCTestテストランナーは、setUp、テストメソッド、tearDownというテストライフサイクルを管理します。XCUITestは、アクセシビリティブリッジを介してアプリケーションを制御する別のプロセスとして実行されます。
各UI要素はXCUIElementオブジェクトで表現され、状態(exists、isHittable、label、value)の問い合わせやアクション(tap、pressForDuration、swipeUp、typeText)のメソッドを含みます。要素はクエリチェーン(app.buttons[].staticTexts[].tables[])を通じて階層に編成されます。これにより、画面上の任意の要素を柔軟に見つけることができます。
XCUITestは、要素を識別するためにアクセシビリティ属性を使用します。accessibilityIdentifier(プログラム上の識別子)とaccessibilityLabel(VoiceOver用の説明)です。アプリケーションコードでaccessibilityIdentifierを設定することをお勧めします。これにより、ローカライゼーションやレイアウトに関係なくテストが安定します。
XCUITestテストは、XCTest構文を使用してSwiftで記述します。各テストクラスはXCTestCaseを継承し、testで始まるメソッドを含みます。setUpメソッドでは必要な設定でアプリケーションを起動し、tearDownではクリーンアップとセッションの終了を行います。
典型的なテスト:要素を見つける→アクションを実行する→結果を検証する。要素の検索は、XCUIElementQueryの子クエリ(app.buttons["loginButton"]、app.textFields["email"])を通じて行います。アクション:.tap()、.typeText("text")、.swipeUp()。検証:XCTAssertTrue(element.exists)またはXCTAssertEqual(element.label, "expected")。
import XCTest
class LoginTests: XCTestCase {
let app = XCUIApplication()
override func setUp() {
continueAfterFailure = false
app.launch()
}
func testLoginWithValidCredentials() {
let emailField = app.textFields["emailInput"]
emailField.tap()
emailField.typeText("user@test.com")
let passwordField = app.secureTextFields["passwordInput"]
passwordField.tap()
passwordField.typeText("password123")
app.buttons["loginButton"].tap()
let homeLabel = app.staticTexts["homeTitle"]
XCTAssertTrue(homeLabel.exists)
}
}
XCUITestは、XCTWaiterとNSPredicate述語を通じて明示的な待機をサポートします。たとえば、5秒以内に要素が表示されるのを待つ:XCTWaiter().wait(for: [expectation], timeout: 5)。Detoxとは異なり、XCUITestにはネットワークリクエストの自動同期はありません。
// タイムアウト付きで要素が表示されるのを待機
let expectedElement = app.staticTexts["welcomeMessage"]
let existsPredicate = NSPredicate(format: "exists == true")
let expectation = XCTNSNotificationExpectation(object: expectedElement)
let result = XCTWaiter().wait(
for: [expectation], timeout: 5
)
XCTAssertEqual(result, .completed)
XCUITestは、マルチタッチジェスチャー、プッシュ通知、Deep Links、SFSafariViewController、アプリ間連携など、複雑なシナリオのテストをサポートします。Siriインテントも、Siri Remoteシミュレーションを使用してXCUITestでテストできます。
XCUITestは、tap、doubleTap、pressForDuration、swipeUp/Down/Left/Right、pinch、rotate、twoFingerTapなど、すべての一般的なジェスチャーをサポートします。複雑なシナリオには、カスタム座標と持続時間を持つXCUIGestureを使用します。これにより、描画やドラッグ&ドロップなどのカスタムジェスチャーをテストできます。
Xcode 12以降、XCUITestはXCTestExpectationとURLProtocolを通じてネットワークリクエストのインターセプトをサポートします。これにより、アプリケーションコードを変更せずに、オフラインモードやモックされたサーバーレスポンスでアプリケーションをテストできます。
XCUITestは、testフラグを指定したxcodebuildを通じてCI環境で実行されます。複数のシミュレーターでの並列実行には、Xcodeスキームで並列実行設定を行ったxcodebuild -testPlanを使用します。GitHub Actions、Bitrise、JenkinsにはXCUITestの組み込みサポートがあります。
CIには、コード署名、プロビジョニングプロファイル、および実行先(シミュレーターまたはデバイス)の設定が必要です。シミュレーターでのiOSテストには証明書は必要ありません。実機には、Xcode CloudまたはFastlaneを通じた自動署名が必要です。
# xcodebuild経由でシミュレーター上でXCUITestを実行
xcodebuild test \
-project MyApp.xcodeproj \
-scheme MyApp \
-destination 'platform=iOS Simulator,name=iPhone 15,OS=17.5' \
-resultBundlePath ./TestResults \
-parallel-testing-enabled YES \
-parallel-testing-worker-count 4
XCUITestはAppleのAccessibility APIと密接に関連しています。要素の検索はアクセシビリティ属性に基づいているからです。アクセシビリティテストは、要素を見つける方法であるだけでなく、障害を持つ人々に対するアプリケーションのアクセシビリティを検証する方法でもあります。XCUITestは、accessibilityLabel、traits、hintsをチェックできます。
VoiceOverは、視覚障害者向けのAppleのスクリーンリーダーです。XCUITestは次の項目をチェックできます:accessibilityLabel(要素が明確なテキストで説明されているか)、accessibilityTraits(要素のタイプが一致しているか:ボタン、見出し、画像)、accessibilityHint(アクションの結果に関するヒントを提供しているか)。これらのチェックはApp Store公開の必須要件であり、XCUITestは回帰テストの一環としてこれらを自動化します。
Xcode 15以降、XCUITestはaccessibilityAuditタイプのXCTAttachmentを通じて組み込みのアクセシビリティチェックをサポートします。テストは、コントラスト不足の要素、ラベルのない画像、不適切なtraitsを自動的に報告します。これにより、手動のアクセシビリティインスペクターが不要になります。
// XCUITestでのアクセシビリティ監査
func testAccessibilityAudit() {
let app = XCUIApplication()
app.launch()
let audit = XCTAttachment(accessibilityAudit: app)
add(audit)
// 特定の要素をチェック
let button = app.buttons["submitButton"]
XCTAssertTrue(button.label.count > 0)
XCTAssertTrue(button.isAccessibilityElement)
}
XCUITestは、XCTOSSignpostMetricとXCUIApplication.metricsを通じてUIパフォーマンスの測定をサポートします。アプリケーションの起動時間、ナビゲーション速度、ジェスチャー応答時間を測定できます。パフォーマンステストはベースライン測定で実行され、しきい値を超えると自動的に失敗します。これにより、リリースビルドでユーザーに届く前にパフォーマンスの低下を防ぐことができます。
ベースラインは、テストの基準実行時間です。Xcodeは、特定のデバイスモデルとiOSバージョンにおける各テストのベースラインを記憶します。新しい実行がベースラインを指定された割合(デフォルト10%)超えると、テストは失敗と見なされます。ベースラインを更新するには、テストレポートのEdit Baselineコマンドを使用します。iOSバージョンの更新時やCIファームのデバイスモデル変更時には、ベースラインを再計算することが重要です。
XCUITestテストの安定性を監視するには、フラグ(continueAfterFailure:最初の失敗後もテストを続行するかどうか)と、リトライ設定付きのXcodeテスト計画を使用します。失敗したテストの自動再起動(リトライ)を設定することをお勧めします。アニメーションのタイミングやネットワーク遅延に関連する不安定なテストには、最大3回の試行が推奨されます。
XCUITestは、springboardとlaunchArgumentsを通じてプッシュ通知とDeep Linksのテストをサポートします。プッシュ通知には、-UNUserNotificationCenterパラメーターを指定したXCUIApplication().launchArgumentsと、XCTestを通じた送信を使用します。Deep Linksは、カスタムスキームを使用したopen URLでテストされます。XCUITestはシステムダイアログをインターセプトし、アプリケーションが正しい画面で開いたかを確認します。通知応答シナリオのテストには、XCUIApplication().springboardを使用し、iOS通知センターの通知バナーをタップする操作をシミュレートします。これらのシナリオは、ディープリンクやプッシュキャンペーンを使用するアプリケーションにとって重要であり、外部呼び出しの正しい処理を検証する必要があります。
詳細なパフォーマンスプロファイリングのために、XCUITestはInstrumentsと統合します。テスト中、XCTMetricを通じてTime Profiler、Core Animation、またはLeaksのプロファイリングを起動できます。プロファイリング結果はレポートに保存され、Xcodeで分析できます。これは、アプリケーションの起動時間、画面間のナビゲーション、アニメーションパフォーマンス(iOSアプリケーションの典型的なボトルネック)を最適化するのに特に役立ちます。
よくある質問
XCTestは、ユニットテストやパフォーマンステストを含む、すべてのタイプのAppleテストのための汎用フレームワークです。XCUITestは、UIテストのためにXCTest上に構築された拡張機能で、インターフェースと対話するためのXCUIApplication、XCUIElement、XCUIElementQueryクラスを追加します。
はい、XCUITestはSwiftとObjective-Cの両方をサポートしています。ただし、AppleのドキュメントやサンプルのほとんどはSwiftで記述されています。Objective-Cプロジェクトは追加設定なしでXCUITestを使用できます。フレームワークは@import XCTestで利用可能です。
XCUITestはAppleのAccessibility APIを使用します。要素は、accessibilityIdentifier、accessibilityLabel、タイプ(button、textField、staticText)、または階層内の位置によって見つけられます。アプリケーションコードでアクセシビリティ属性が正確に設定されるほど、テストは安定します。
はい、XcodeにはUIテストの内蔵レコーダーが含まれています。録画モードでテストを実行すると、Xcodeはインターフェースとのすべての対話をキャプチャし、Swiftコードを生成します。録画されたコードは、検証の追加、Page Objectsへの抽出、パラメーター化などによって洗練できます。
実機で実行するには、デバイスをMacに接続し、Apple Developer Programに追加し、プロビジョニングプロファイルを設定し、開発証明書でアプリケーションに署名し、xcodebuildでデバイスを実行先として選択する必要があります。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。