この記事は公開されてから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 を選択し、新しいユニットテストを追加します。
名前をSampleAppSwiftTestsとし、Language:をSwiftにしました。
(2) スキームの追加
前回と要領は同じですが、新たにSwiftテスト用のスキームを追加します。
New Schemeから、ターゲットは、SampleAppSwiftTestsとしています。
ここでは、名前をSampleAppSwiftTestsとしました。
Manage Schemesを開いて、今追加したSampleAppSwiftTestsのSharedにチェックを入れます。
(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で開くと、次のような構成になっています。
(5) Copy Phase の追加
SampleAooSwiftTestsのBuild PhasesにもNew Copy Phaseを選択し、Phaseを1つ追加します。
追加したPhaseは、次のように設定します。(ここでは、分かりやすいように名前をEarlGray Copy Filesとしました)
- Destination:
Absolute Path
- Path:
$(TEST_HOST)/..
- Copy files only when installing: Deselect
- Name:
Path to EarlGrey.Framework
withCode Sign on Copy
selected.
3 テストの作成
(1) EarlGrey.swift
EarlGrey.swift をダウンロードして、SampleAppSwiftTestsの中に置きます。
(2) ブリッジヘッダの作成
EarlGreyは、Objectice-Cで作成されているため、Swiftでテストコードを書く場合は、ブリッジヘッダが必要になります。 ブリッジヘッダを作成して内容を下記のように編集します。
#import <EarlGrey/EarlGrey.h>
ここまでで、SampleAppSwiftTestは、次のような構成になります。
(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/