ちょっと話題の記事

[Xcode 7] UI Testingを試してみる

2015.10.14

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

Xcode 7ではXCTest frameworkの新機能としてUI testing(以降、UIテスト)が実装されました。 UI操作をレコーディングしてテストコードを生成することで繰り返しUIテストが行える便利な機能です。 今回は簡易電卓アプリを作成し、簡単な計算のUIテストを行ってみます。

開発環境

開発環境は下記の通りです。

  • Xcode 7.0.1
  • iPhone 6s シミュレータ

テスト対象アプリ

今回は加算と減算のみ可能な簡易電卓アプリを用いてテストを行います。 アプリのソースコードはこちらにアップしました。

プロジェクト作成時の「Include UI Tests」

Xcode 7ではプロジェクト作成時に「Include UI Tests」というオプションが追加されました。 UIテストを試す場合は下記の通りチェックをつけましょう。

※もちろん、ここでチェックをつけなくても後からUIテストは作成できますので安心してください。ここではプロジェクト作成時にUIテストを含めて進めます。 Xcode_create_project_s

UI操作のレコーディング

レコーディングの際の注意点として、現在のマウスカーソルの場所にテストコードが生成されるので 対象のテストメソッドの中にカーソルを合わせておきましょう。

レコーディングは下記のように赤丸ボタンをクリックすることで開始します。 終了するときはもう一度ボタンをクリックします。

generate_ui_test_code_s

今回は10 + 9 - 2という簡単な計算をレコーディングしてみました。 結果下記のようなコードが生成されました。 ちゃんとボタンをタップする処理が行われていそうです。

    func testExample() {
        // Use recording to get started writing UI tests.
        // Use XCTAssert and related functions to verify your tests produce the correct results.
        
        // 以下レコーディングで生成されたコード
        let app = XCUIApplication()
        app.buttons["1"].tap()
        app.buttons["0"].tap()
        app.buttons["+"].tap()
        app.buttons["9"].tap()
        app.buttons["-"].tap()
        app.buttons["2"].tap()
        app.buttons["="].tap()
    }

検証コードの追加

レコーディングはできたのでその結果出力される計算結果が合っているか検証するコードを追加します。 ここで指定している"resultLabel"というのはIdentity inspector > Accessibility > Identifierで設定できるUIコンポーネントのIDです。 ここでは計算結果を表示するラベルを検索しやすくするために"resultLabel"というIDを付与しています。

    func testExample() {
        // Use recording to get started writing UI tests.
        // Use XCTAssert and related functions to verify your tests produce the correct results.
        
        // 以下レコーディングで生成されたコード
        let app = XCUIApplication()
        app.buttons["1"].tap()
        app.buttons["0"].tap()
        app.buttons["+"].tap()
        app.buttons["9"].tap()
        app.buttons["-"].tap()
        app.buttons["2"].tap()
        app.buttons["="].tap()
        
        // 結果ラベルの値を検証するコード
        XCTAssertEqual(app.staticTexts["resultLabel"].label, "17")
    }

UIテストの実行

ここまででテストコードができたのでテストを実行してみましょう。

まとめ

いかがでしたでしょうか。UI部分はアプリ開発において細かい部分で仕様が変わりやすくテストの自動化はしづらい面もあるかと思いますが Unit Testと併せて使えそうなところには使っていきたいですね。