[iOS] UI自動化テストフレームワークEarlGreyでテストを書いてみた(Swift版)

2016.03.13

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

1 はじめに

EarlGreyでは、テストコードをObjective-C/Swiftのどちらでも書くことができます。(ターゲットもどちらにでも対応できます) 前回は、テストコードをObjective-Cで書いたのですが、今回は、同プロジェクトに新しいテストスキームを追加してSwiftでテストを書いてみました。

前回のObjective-Cによるテスト、及びEarlGreyについては、下記をご参照ください。
[iOS] 明確で簡潔なテストを書くことができる iOS UI自動化テスト・フレームワークEarlGreyを試してみました。
[iOS] UI自動化テストフレームワークEarlGreyでテストを書いてみた(Objective-C版)

2 EarlGreyの組み込み

(1) テストの追加

メニューからEditor - Add target - iOS - Test - iOS Unit Testing Bundle を選択し、新しいユニットテストを追加します。

013

名前をSampleAppSwiftTestsとし、Language:をSwiftにしました。

014

(2) スキームの追加

前回と要領は同じですが、新たにSwiftテスト用のスキームを追加します。

New Schemeから、ターゲットは、SampleAppSwiftTestsとしています。

015

ここでは、名前をSampleAppSwiftTestsとしました。

016

Manage Schemesを開いて、今追加したSampleAppSwiftTestsSharedにチェックを入れます。

017

(3) Cocoapodによるインストール

新しいスキームを追加したので、改めてpod installが必要になります。

ここで一旦、Xcodeを終了し、Podfileを下記のように修正します。新たに作成したスキームに対してもEarlGreyを導入する感じです。

PROJECT_NAME = 'SampleApp'
TEST_TARGET = 'SampleAppTests'
SCHEME_FILE = 'SampleAppTests.xcscheme'
TEST_TARGET_SWIFT = 'SampleAppSwiftTests'
SCHEME_FILE_SWIFT = 'SampleAppSwiftTests.xcscheme'

xcodeproj PROJECT_NAME
target TEST_TARGET, :exclusive => true do
  pod 'EarlGrey'
end

xcodeproj PROJECT_NAME
target TEST_TARGET_SWIFT, :exclusive => true do
  pod 'EarlGrey'
end

post_install do |installer|
  load('configure_earlgrey_pods.rb')
  configure_for_earlgrey(installer, PROJECT_NAME, TEST_TARGET, SCHEME_FILE)
  configure_for_earlgrey(installer, PROJECT_NAME, TEST_TARGET_SWIFT, SCHEME_FILE_SWIFT)
end

このフォルダには、前回、configure_earlgrey_pods.rbをコピーしているので、このまま、pod installします。

configure_earlgrey_pods.rbが無い場合は、前回記事をご参照ください。
[iOS] UI自動化テストフレームワークEarlGreyでテストを書いてみた

$ pod install
Updating local specs repositories

CocoaPods 1.0.0.beta.5 is available.
To update use: `gem install cocoapods --pre`
[!] This is a test version we'd love you to try.

For more information see http://blog.cocoapods.org
and the CHANGELOG for this version http://git.io/BaH8pQ.

Analyzing dependencies
Downloading dependencies
Using EarlGrey (1.0.0)
Generating Pods project
Checking and Updating SampleApp for EarlGrey.
EarlGrey setup complete. You can use the Test Target : SampleAppTests for EarlGrey testing.
Checking and Updating SampleApp for EarlGrey.
Adding EarlGrey Framework Location as an Environment Variable 
EarlGrey setup complete. You can use the Test Target : SampleAppSwiftTests for EarlGrey testing.
Integrating client project
Sending stats
Sending stats
Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.

(4) ワークスペースを開く

pod installで生成されたSampleApp.xcworkspaceをXcodeで開くと、次のような構成になっています。 018

(5) Copy Phase の追加

SampleAooSwiftTestsBuild PhasesにもNew Copy Phaseを選択し、Phaseを1つ追加します。

019

追加したPhaseは、次のように設定します。(ここでは、分かりやすいように名前をEarlGray Copy Filesとしました)

  • Destination: Absolute Path
  • Path: $(TEST_HOST)/..
  • Copy files only when installing: Deselect
  • Name: Path to EarlGrey.Framework with Code Sign on Copy selected.

020

3 テストの作成

(1) EarlGrey.swift

EarlGrey.swift をダウンロードして、SampleAppSwiftTestsの中に置きます。

(2) ブリッジヘッダの作成

021

EarlGreyは、Objectice-Cで作成されているため、Swiftでテストコードを書く場合は、ブリッジヘッダが必要になります。 ブリッジヘッダを作成して内容を下記のように編集します。

#import <EarlGrey/EarlGrey.h>

ここまでで、SampleAppSwiftTestは、次のような構成になります。

022

(3) テストコード

いよいよ、Swiftでテストコードを記述します。 内容は、前回と全く同じです。ただ、言語をSwiftに変更しただけです。

当然といえば、当然ですが、かなり簡潔になりました。

import XCTest

class SampleAppSwiftTests: XCTestCase {

    func testLogin() {

        //*****************************************************
        // ログイン失敗
        //*****************************************************
        let user = "taro"
        var pass = "xxx"

        // ユーザ名の入力
        EarlGrey().selectElementWithMatcher(grey_accessibilityID("userTextField")).performAction(GREYActions.actionForTypeText(user))
        // パスワードの入力
        EarlGrey().selectElementWithMatcher(grey_accessibilityID("passwordTextField")).performAction(GREYActions.actionForTypeText(pass))
        // ログインボタンを押す
        EarlGrey().selectElementWithMatcher(grey_accessibilityID("loginButton")).performAction(grey_tap())
        // ERRORというテキストが表示されていることを確認する
        EarlGrey().selectElementWithMatcher(grey_text("ERROR")).assertWithMatcher(grey_sufficientlyVisible())

        // OKボタンを押して、アラートを閉じる
        EarlGrey().selectElementWithMatcher(grey_text("OK")).performAction(grey_tap())

        //*****************************************************
        // ログイン成功
        //*****************************************************
        pass = "123" // 正しいパスワードに変更
        // パスワードの修正
        EarlGrey().selectElementWithMatcher(grey_accessibilityID("passwordTextField"))
            .performAction(grey_clearText()).performAction(GREYActions.actionForTypeText(pass))
        // ログインボタンを押す
        EarlGrey().selectElementWithMatcher(grey_accessibilityID("loginButton")).performAction(grey_tap())
        // SUCCESSというテキストが表示されていることを確認する
        EarlGrey().selectElementWithMatcher(grey_text("SUCCESS")).assertWithMatcher(grey_sufficientlyVisible())
        // OKボタンを押して、アラートを閉じる
        EarlGrey().selectElementWithMatcher(grey_text("OK")).performAction(grey_tap())

    }
}

動作している様子については、前回と全く同じなので省略します。

4 最後に

今回は、Swiftでテストコードを書いてみましたが、EarlGreyの記述方法が、どんどん動作をつないでゆく感じなので、ドットだけで繋がっていけるSwiftの方が、見通しよく書ける感じがします。

連結が増えるとObjective-Cの[ ]は、やはりちょっと辛いです。

5 参考資料


[iOS] 明確で簡潔なテストを書くことができる iOS UI自動化テスト・フレームワークEarlGreyを試してみました。
[iOS] UI自動化テストフレームワークEarlGreyでテストを書いてみた
EarlGrey - iOS 向けの UI 機能テスト フレームワーク
https://github.com/google/EarlGrey
iOS UIテストフレームワーク EarlGrey のセットアップ
http://www.testingexcellence.com/earlgrey-open-source-test-automation-tool-for-ios/
https://kazucocoa.wordpress.com/2016/02/17/ios-test-ui-with-googleearlgrey/