この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
1 はじめに
先月2月16日、「Google テストブログ」で公開された、EarlGreyは、明確で簡潔なテストを書くことができるiOS UI自動化テスト・フレームワークです。
Google Testing Blog
EarlGrey - iOS 向けの UI 機能テスト フレームワーク
同ブログで紹介されていた、EarlGreyの主な機能は、次のとおりです。
(1) 強力な組み込みの同期
テストはUIと対話する前のアニメーションや、ネットワーク接続などのイベントを自動的に待機します。 この際、特にスリープなどを書く必要がないため、テストコードはシンプルになります。
(2) 可視性のチェック
すべての操作はユーザーの可視範囲で発生します。 例えば、画像の背後にあるボタンをタップしようとすると、テストは失敗します。
(3) 柔軟な設計
要素の選択、相互作用、アサーション、同期について、コンポーネントが拡張できるように設計されています。
EarlGreyは、既にApacheライセンスでオープンソースとして、GitHubに公開されています。
https://github.com/google/EarlGrey
2 デモの実行
とりあえず、GitHubのリポジトリには、デモが含まれていましたので、それを実行してみました。
README.mdには、依存関係をダウンロードしてEarlGreyをコンパイルするところまで説明されていましたが、実は、EarlGreyは、わざわざ環境構築しなくても、Cocoapodsで簡単に取り込めるようになっているため、今回は、この方法でやってみました。
(1) ダウンロード
下記のコマンドでリポジトリをダウンロードします。
$ git clone https://github.com/google/EarlGrey.git
リポジトリのトップに入るとDemoというフォルダを確認できます。
$ cd EarlGrey/
$ ls -la
total 136
drwxr-xr-x 18 hirauchishinichi staff 612 3 12 09:07 .
drwxr-xr-x 5 hirauchishinichi staff 170 3 12 09:07 ..
drwxr-xr-x 13 hirauchishinichi staff 442 3 12 09:07 .git
-rw-r--r-- 1 hirauchishinichi staff 23 3 12 09:07 .gitignore
-rw-r--r-- 1 hirauchishinichi staff 1273 3 12 09:07 .travis.yml
-rw-r--r-- 1 hirauchishinichi staff 144 3 12 09:07 CHANGELOG.md
-rw-r--r-- 1 hirauchishinichi staff 4207 3 12 09:07 CONTRIBUTING.md
drwxr-xr-x 3 hirauchishinichi staff 102 3 12 09:07 Demo
drwxr-xr-x 16 hirauchishinichi staff 544 3 12 09:07 EarlGrey
-rw-r--r-- 1 hirauchishinichi staff 1253 3 12 09:07 EarlGrey-Info.plist
-rw-r--r-- 1 hirauchishinichi staff 833 3 12 09:07 EarlGrey.pch
-rw-r--r-- 1 hirauchishinichi staff 2514 3 12 09:07 EarlGrey.podspec.json
drwxr-xr-x 4 hirauchishinichi staff 136 3 12 09:07 EarlGrey.xcodeproj
-rw-r--r-- 1 hirauchishinichi staff 29977 3 12 09:07 LICENSE
-rw-r--r-- 1 hirauchishinichi staff 4072 3 12 09:07 README.md
drwxr-xr-x 5 hirauchishinichi staff 170 3 12 09:07 Scripts
drwxr-xr-x 4 hirauchishinichi staff 136 3 12 09:07 Tests
drwxr-xr-x 10 hirauchishinichi staff 340 3 12 09:07 docs
(2) Cocoapods
Demoの中のEarlGreyExampleまで降ります。
$ cd Demo/EarlGreyExample/
そこには、Podfileとconfigure_earlgrey_pods.rbがあります。
EarlGreyをCocoapodsでセットアップするとき、この2つのファイルが必要になります。
$ ls -la
total 120
drwxr-xr-x 14 hirauchishinichi staff 476 3 12 09:21 .
drwxr-xr-x 3 hirauchishinichi staff 102 3 12 09:21 ..
-rw-r--r-- 1 hirauchishinichi staff 56 3 12 09:21 .gitignore
drwxr-xr-x 4 hirauchishinichi staff 136 3 12 09:21 EarlGreyExample
drwxr-xr-x 4 hirauchishinichi staff 136 3 12 09:21 EarlGreyExample.xcodeproj
drwxr-xr-x 5 hirauchishinichi staff 170 3 12 09:21 EarlGreyExampleSwift
drwxr-xr-x 6 hirauchishinichi staff 204 3 12 09:21 EarlGreyExampleSwiftTests
drwxr-xr-x 3 hirauchishinichi staff 102 3 12 09:21 EarlGreyExampleTests
drwxr-xr-x 6 hirauchishinichi staff 204 3 12 09:21 Images.xcassets
-rw-r--r-- 1 hirauchishinichi staff 29977 3 12 09:21 LICENSE
-rw-r--r-- 1 hirauchishinichi staff 2014 3 12 09:21 LaunchScreen.xib
-rw-r--r-- 1 hirauchishinichi staff 1499 3 12 09:21 Podfile
-rw-r--r-- 1 hirauchishinichi staff 602 3 12 09:21 README.md
-rw-r--r-- 1 hirauchishinichi staff 9106 3 12 09:21 configure_earlgrey_pods.rb
Podfileの中を見ると、projectとかinherit!のコマンドが書かれていますが、これは、CocoaPods 1.0.0 beta releasesのものですので、もしお使いのCocoapodsが最新Stableの0.39.0などの場合、この行を削除しないとpod installできません。
platform :ios, '8.0'
source 'https://github.com/CocoaPods/Specs.git'
PROJECT_NAME = 'EarlGreyExample'
TEST_TARGET = 'EarlGreyExampleTests'
SCHEME_FILE = 'EarlGreyExampleTests.xcscheme'
TEST_TARGET_SWIFT = 'EarlGreyExampleSwiftTests'
SCHEME_FILE_SWIFT = 'EarlGreyExampleSwiftTests.xcscheme'
target TEST_TARGET do
project PROJECT_NAME
inherit! :search_paths
pod 'EarlGrey'
end
target TEST_TARGET_SWIFT do
project PROJECT_NAME
inherit! :search_paths
pod 'EarlGrey'
end
post_install do |installer|
load('configure_earlgrey_pods.rb')
# For each test target, you need to call the EarlGrey script's edit method once.
# For the 'EarlGreyExampleTests' target.
configure_for_earlgrey(installer, PROJECT_NAME, TEST_TARGET, SCHEME_FILE)
# For the 'EarlGreyExampleSwiftTests' target.
configure_for_earlgrey(installer, PROJECT_NAME, TEST_TARGET_SWIFT, SCHEME_FILE_SWIFT)
end
pod installを実行します。Cocoapodsは0.39.0を使用するため、Podfileの先の行は削除しました。
$ pod --version
0.39.0
$ pod install
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
Installing EarlGrey (1.0.0)
Generating Pods project
Checking and Updating EarlGreyExample for EarlGrey.
Adding EarlGrey Framework Location as an Environment Variable
EarlGrey setup complete. You can use the Test Target : EarlGreyExampleTests for EarlGrey testing.
Checking and Updating EarlGreyExample for EarlGrey.
Adding EarlGrey Framework Location as an Environment Variable
EarlGrey setup complete. You can use the Test Target : EarlGreyExampleSwiftTests for EarlGrey testing.
Integrating client project
[!] Please close any current Xcode sessions and use `EarlGreyExample.xcworkspace` for this project from now on.
Sending stats
Sending stats
Pod installation complete! There is 1 dependency from the Podfile and 1 total pod installed.
(3) Xcode
pod installで作成された、ワークスペース(EarlGreyExample.xcworkspace)をXcodeで開くと、次のようにPodsプロジェクトの中に、EarlGrey.frameworkが入っていることを確認できます。
また、次の3つのスキームが定義されていることを確認できます。
- EralGrayExampleSwift [テストのターゲット(Swift)]
- EralGrayExampleTests [Objectiv-Cによるテスト]
- EralGrayExampleSwiftTests [Swiftによるテスト]
まずは、スキームをEralGrayExampleSwift(テスト対象のターゲット)にセットして、動作を確認してみます。
(4) テスト
いよいよ、テスト実行です。
スキームをEralGrayExampleTests(Objectiv-Cによるテスト)に変更して、⌘+Uでテスト実行します。
動作している様子は、次の通りです。
3 オブジェクトの識別
テストのコードをざっと見てみると、操作対象のコントロールをgrey_accessibilityID(@"名前?")のような感じで指定しているようです。
[[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"ClickMe")]
performAction:grey_tap()];
この「ClickMe」は、何を指定しているのか?ということで、ターゲットの方を見てみると、次のようになっていました。。
let clickMe = createButton("ClickMe")
accessibilityIdentifierとaccessibilityLabelに、それが設定されています。 どうやら、この識別子の指定が必要なようです。
func createButton(title: String) -> UIButton {
let button = UIButton(type: UIButtonType.System) as UIButton
button.frame = CGRectMake(0, 0, 100, 100)
button.backgroundColor = UIColor.greenColor()
button.setTitle(title, forState: UIControlState.Normal)
button.addTarget(self, action: "buttonAction:",
forControlEvents: UIControlEvents.TouchUpInside)
button.accessibilityIdentifier = title
button.accessibilityLabel = title
button.translatesAutoresizingMaskIntoConstraints = false
return button;
}
4 最後に
とりあえず、今回は、デモを動作させるところまで試してみました。
既存のプロジェクトにCocoapodsで簡単に取り込め、Objective-CでもSwiftでもテストコードが書けるようなので、これから、色々触ってみたいと思います。
5 参考資料
[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/