XCUITest:概要、動作原理、およびiOS UIテスト

著者: IT Sectr 公開日: 2026-04-09 読了時間: 8 分

XCUITestは、iOS、iPadOS、macOSアプリケーションのUIテストのためのAppleのフレームワークであり、XCTestとXcodeに直接組み込まれています。タップ、テキスト入力、スワイプ、スクロール、ジェスチャーなど、ユーザーの操作をシミュレートし、インターフェース要素の内部状態にアクセスできます。Apple Developer Documentation、2025年によると、XCUIApplicationはすべてのUIテストのエントリポイントであり、画面要素の階層へのアクセスを提供します。

重要ポイント

  • XCUITestはXcodeに組み込まれたAppleのネイティブUIテストフレームワークです
  • ホワイトボックスアプローチにより、アクセシビリティ属性と要素階層へのアクセスを提供します
  • テストはXCTestと統合されたSwiftまたはObjective-Cで記述します
  • テストの記録はXcodeの内蔵レコーダーを通じて利用可能です
  • 実行は追加のサーバーなしでiOSシミュレーターまたは実機で行われます

XCUITestとは

XCUITestは、AppleがXcode 7(2015年)でリリースしたUIテストフレームワークです。これはUI Automation(UIA)に代わり、Appleプラットフォームでの自動インターフェーステストの標準ツールとなりました。XCUITestは、Appleの統一テストフレームワークであるXCTestに完全に統合されています。

XCTestユニットテストとの違い

クラスやメソッドレベルでロジックを検証するユニットテストとは異なり、XCUITestはアクションシミュレーションを通じてユーザーインターフェースをテストします。テストはアプリケーションとは別のプロセスで実行され、Accessibility APIを通じてアプリケーションと対話します。これにより、分離性と信頼性が確保されます。

ネイティブアプローチの利点

XCUITestは、サードパーティのサーバー(Appiumとは異なります)やデバイス操作用の追加ライブラリをインストールする必要がありません。必要なものはすべてXcodeにすでに含まれています。これにより、新しいiOSバージョンとの最高の互換性と、新しいジェスチャーやコントロールへの即時アクセスが保証されます。

XCUITestとXCTestのアーキテクチャ

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でUIテストを書く

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")。

swift
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にはネットワークリクエストの自動同期はありません。

swift
// タイムアウト付きで要素が表示されるのを待機
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の高度な機能

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を通じてネットワークリクエストのインターセプトをサポートします。これにより、アプリケーションコードを変更せずに、オフラインモードやモックされたサーバーレスポンスでアプリケーションをテストできます。

CI/CDにおけるXCUITest

XCUITestは、testフラグを指定したxcodebuildを通じてCI環境で実行されます。複数のシミュレーターでの並列実行には、Xcodeスキームで並列実行設定を行ったxcodebuild -testPlanを使用します。GitHub Actions、Bitrise、JenkinsにはXCUITestの組み込みサポートがあります。

CIの設定

CIには、コード署名、プロビジョニングプロファイル、および実行先(シミュレーターまたはデバイス)の設定が必要です。シミュレーターでのiOSテストには証明書は必要ありません。実機には、Xcode CloudまたはFastlaneを通じた自動署名が必要です。

bash
# 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によるアクセシビリティテスト

XCUITestはAppleのAccessibility APIと密接に関連しています。要素の検索はアクセシビリティ属性に基づいているからです。アクセシビリティテストは、要素を見つける方法であるだけでなく、障害を持つ人々に対するアプリケーションのアクセシビリティを検証する方法でもあります。XCUITestは、accessibilityLabel、traits、hintsをチェックできます。

VoiceOverの検証

VoiceOverは、視覚障害者向けのAppleのスクリーンリーダーです。XCUITestは次の項目をチェックできます:accessibilityLabel(要素が明確なテキストで説明されているか)、accessibilityTraits(要素のタイプが一致しているか:ボタン、見出し、画像)、accessibilityHint(アクションの結果に関するヒントを提供しているか)。これらのチェックはApp Store公開の必須要件であり、XCUITestは回帰テストの一環としてこれらを自動化します。

自動アクセシビリティチェック

Xcode 15以降、XCUITestはaccessibilityAuditタイプのXCTAttachmentを通じて組み込みのアクセシビリティチェックをサポートします。テストは、コントラスト不足の要素、ラベルのない画像、不適切なtraitsを自動的に報告します。これにより、手動のアクセシビリティインスペクターが不要になります。

swift
// 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のパフォーマンステスト

XCUITestは、XCTOSSignpostMetricとXCUIApplication.metricsを通じてUIパフォーマンスの測定をサポートします。アプリケーションの起動時間、ナビゲーション速度、ジェスチャー応答時間を測定できます。パフォーマンステストはベースライン測定で実行され、しきい値を超えると自動的に失敗します。これにより、リリースビルドでユーザーに届く前にパフォーマンスの低下を防ぐことができます。

ベースラインの設定

ベースラインは、テストの基準実行時間です。Xcodeは、特定のデバイスモデルとiOSバージョンにおける各テストのベースラインを記憶します。新しい実行がベースラインを指定された割合(デフォルト10%)超えると、テストは失敗と見なされます。ベースラインを更新するには、テストレポートのEdit Baselineコマンドを使用します。iOSバージョンの更新時やCIファームのデバイスモデル変更時には、ベースラインを再計算することが重要です。

テスト安定性の監視

XCUITestテストの安定性を監視するには、フラグ(continueAfterFailure:最初の失敗後もテストを続行するかどうか)と、リトライ設定付きのXcodeテスト計画を使用します。失敗したテストの自動再起動(リトライ)を設定することをお勧めします。アニメーションのタイミングやネットワーク遅延に関連する不安定なテストには、最大3回の試行が推奨されます。

プッシュ通知とDeep Linksのテスト

XCUITestは、springboardとlaunchArgumentsを通じてプッシュ通知とDeep Linksのテストをサポートします。プッシュ通知には、-UNUserNotificationCenterパラメーターを指定したXCUIApplication().launchArgumentsと、XCTestを通じた送信を使用します。Deep Linksは、カスタムスキームを使用したopen URLでテストされます。XCUITestはシステムダイアログをインターセプトし、アプリケーションが正しい画面で開いたかを確認します。通知応答シナリオのテストには、XCUIApplication().springboardを使用し、iOS通知センターの通知バナーをタップする操作をシミュレートします。これらのシナリオは、ディープリンクやプッシュキャンペーンを使用するアプリケーションにとって重要であり、外部呼び出しの正しい処理を検証する必要があります。

Instrumentsとの統合

詳細なパフォーマンスプロファイリングのために、XCUITestはInstrumentsと統合します。テスト中、XCTMetricを通じてTime Profiler、Core Animation、またはLeaksのプロファイリングを起動できます。プロファイリング結果はレポートに保存され、Xcodeで分析できます。これは、アプリケーションの起動時間、画面間のナビゲーション、アニメーションパフォーマンス(iOSアプリケーションの典型的なボトルネック)を最適化するのに特に役立ちます。

よくある質問

XCUITestとXCTestの違いは何ですか?

XCTestは、ユニットテストやパフォーマンステストを含む、すべてのタイプのAppleテストのための汎用フレームワークです。XCUITestは、UIテストのためにXCTest上に構築された拡張機能で、インターフェースと対話するためのXCUIApplication、XCUIElement、XCUIElementQueryクラスを追加します。

XCUITestはObjective-Cで使用できますか?

はい、XCUITestはSwiftとObjective-Cの両方をサポートしています。ただし、AppleのドキュメントやサンプルのほとんどはSwiftで記述されています。Objective-Cプロジェクトは追加設定なしでXCUITestを使用できます。フレームワークは@import XCTestで利用可能です。

XCUITestはどのように画面上の要素を見つけますか?

XCUITestはAppleのAccessibility APIを使用します。要素は、accessibilityIdentifier、accessibilityLabel、タイプ(button、textField、staticText)、または階層内の位置によって見つけられます。アプリケーションコードでアクセシビリティ属性が正確に設定されるほど、テストは安定します。

XCUITestはテストの記録をサポートしていますか?

はい、XcodeにはUIテストの内蔵レコーダーが含まれています。録画モードでテストを実行すると、Xcodeはインターフェースとのすべての対話をキャプチャし、Swiftコードを生成します。録画されたコードは、検証の追加、Page Objectsへの抽出、パラメーター化などによって洗練できます。

実機でXCUITestを実行するには?

実機で実行するには、デバイスをMacに接続し、Apple Developer Programに追加し、プロビジョニングプロファイルを設定し、開発証明書でアプリケーションに署名し、xcodebuildでデバイスを実行先として選択する必要があります。

まとめ

  • XCUITestは、iOS、iPadOS、macOSアプリケーション向けのAppleのネイティブUIテストフレームワークです
  • Xcodeとの統合により、テストの記録、並列実行、組み込みレポートが提供されます
  • XCUIApplicationとXCUIElementは、アプリケーションと対話するための主要なクラスです
  • アクセシビリティ属性は信頼性の高いロケーターとして使用され、レイアウト変更に強いです
  • 待機はXCTWaiterとNSPredicateを通じて実装されます(自動同期はありません)
  • CI/CDは、シミュレーターでの並列実行を含むxcodebuildを通じてサポートされています
  • 高度なシナリオには、マルチタッチ、Siri Intents、ネットワークリクエストのインターセプト、Deep Linksが含まれます

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください