Espressoを試してみる

投稿者: | 2018年12月28日

Androidアプリにおける画面テスト自動化のフレームワークに、Espressoというものがあります。

中でもEspresso Test Recorderというツールは、表示されるウインドウに従ってテスト項目を決定していくだけでテストコードが書けてしまうということで、広く宣伝されています。

Android Studioのデフォルトプロジェクトである”Hello World!”アプリを使って、実際に試してみました。

 

まずAndroid Studioで新規Projectを立ち上げ、Empty Activityを使ってアプリを作成します。

するとデフォルト状態ではこのように、アプリを起動すると中央に”Hello World!”というテキストが表示される機能が実装されています。

ここのテキストをassertionするテストを作成してみます。

 

私が使っているAndroid Studio 3.1.3では、デフォルトでEspresso Test Recorderが内蔵されていました。

メニューバーの”Run”から”Record Espresso Test”を実行。

 

エミュレータを選択して起動すると、次のような画面が現れました。”Add Assertion”ボタンをクリックすると・・・

 

右側に実行画面イメージが、左側にassertionの設定画面が表示されました。右側の赤い四角はクリックする場所によって反応し表示されるもので、GUIで選択することが可能になっています。

左下に見えているテキストフィールドには、「正解値」として自動的に”Hello World!”が入力されています。もちろんここは必要に応じて変更可能ですが、今回はこれで正しいのでこのまま進みます。

さらにAssertionを追加したい場合は”Save and Add Another”ボタンを押しますが、今回はこれで終了するので、真ん中の”Save Assertion”ボタンをクリックします。

 

するとこのように、追加したAssertionが設定されました。”OK”ボタンを押して終了します。

 

テストクラスの名前を付けて完了。

 

プロジェクトの”androidTest”パッケージに先ほどのクラスファイルが作成されています。

ですが初期状態ではコンパイルエラー。ActivityTestRuleが解決されていません。

Cannot resolve symbol ‘ActivityTestRule’“。

 

これを解決するには、appフォルダに存在するbuild.gradleに、dependenciesとして次の記述が必要です。

androidTestImplementation ‘com.android.support.test:rules:1.0.2’

 

syncすると、どうやらMainActivityTestのエラーは解決されました。

 

MainActivityTestを右クリックし、”Run ‘MainActivityTest'”をクリックします。

 

今度はビルドに失敗してしまいました・・・。エラーの内容は次の通りです。

Conflict with dependency ‘com.android.support:support-annotations’ in project ‘:app’. Resolved versions for app (26.1.0) and test app (27.1.1) differ. See https://d.android.com/r/tools/test-apk-dependency-conflicts.html for details.

 

さらにbuild.gradleに追記が必要です。先ほどのエラーは、com.android.support:support-annotations’でバージョン26.1.0と27.1.1のコンフリクトが起きている、という内容らしいので、次のようにimplementationとして明示的に指定します。

implementation ‘com.android.support:support-annotations:27.1.1’

 

再びsyncし、MainActivityTestを実行。今度は上手くいったようです。

テストツールで見慣れたグリーンのバーが表示され、すべてのテストがパスしたことを示しています。

 

ただし、Espresso Test Recorderはまだまだ発展途上らしく、制限も多いため、多くの改善が必要であることが示唆されています。

 

今回のエラーの解消には、下記のサイトにお世話になりました。

https://forums.bignerdranch.com/t/cannot-resolve-symbol-activitytestrule-solved/14720

https://stackoverflow.com/questions/37821148/why-cannot-i-import-androidjunit4-and-activitytestrule-into-my-unit-test-class/50443155#50443155