branch10480’s blog

Topics that I've learned.

iOSアプリ開発自動テストの教科書 を読んでいく 〜 22 〜

XCUIApplicationについて

XCUIApplicationはテスト対象となるアプリのプロキシ

これにより以下について確認可能になる。

  1. 複数アプリの操作
  2. アプリの起動 / 終了
  3. アプリの状態を確認

複数アプリの操作

引数なしで XCUIApplication をインスタンス化した場合、Xcodeの「Target Application」で指定しているアプリが対象のアプリになる。

let app = XCUIApplication()

Bundle Identifier を指定すれば対象のアプリを指定できる。

let app = XCUIApplication(bundleIdentifier: "hoge.com")

これにより、テスト対象を変更したり、複数のアプリを起動して使える機能についてのテストが実行できる。

■ 使用例

import XCTest
import UIKit

class SampleTestCases: XCTestCase {
    func testExample() {
        // デフォルトアプリ起動
        let app = XCUIApplication()
        app.launch()

        // もう一方のアプリを起動
        let otherApp = XCUIApplication(bundleIdentifier: "hoge.com")
        otherApp.launch()

        otherApp.buttons["sync_button"].tap()

        // デフォルトアプリをフォアグラウンドに
        app.activate()

        app.buttons["sync_ok_button"].tap()
    }
}

アプリの起動終了に関わるメソッド

宣言 用途
func launch() アプリインスタンスを終了して新しく起動する
var launchArguments: [String] 指定した値をアプリに渡す
var launchEnvironment: [String: String] 指定した環境変数をアプリに渡す
func activate() 既存のアプリインスタンスがある場合、そちらを再び起動する(フォアグラウンドになる)
func terminate() アプリの終了

launchArgumentslaunchEnvironment はアプリ側にUIテストのための処理を加えるのに利用できる。

■ 使用例

import XCTest
import UIKit

class SampleTestCases: XCTestCase {
    func testExample() {
        let app = XCUIApplication()

        // 'a_pattern'という値をアプリに渡す
        app.launchArguments.append("a_pattern")
        app.launch()
    }
}

アプリ側の処理に分岐を加える。

if ProcessInfo.processInfo.arguments.contains(where: { arg in return arg == "a_pattern" }) {
    // a_patternの場合の処理 ...
}

> 次回に続く