DeNA Testing Blog

Make Testing Fun, Smart, and Delighting End-Users

テスト社内普及プロジェクト第2弾! Android UIテストハンズオンを実施しました

こんにちは。SWETグループの外山(@sumio_tym)です。

先日、社内のAndroidエンジニア向けにUIテストのハンズオンを開催しました。 本記事では、ハンズオンを開催するに至った経緯と、その内容を紹介します。

UIテストハンズオン開催の経緯

SWETでは、社内のエンジニアに自動テストのナレッジを普及させるための取り組みを継続しています。 2019年4月に開催したAndroidユニットテストのハンズオンもその一環でした。

当時のAndroidユニットテストのハンズオン参加者を対象としたアンケートで「次に開催してほしいハンズオン」について尋ねていました。 その結果、90%以上の参加者がUIテストハンズオンの開催を希望していたため、Android UIテスト1のハンズオンを開催することにしました。

ところで、Androidの公式ドキュメントで紹介されているテストピラミッドによると、UIテストの推奨割合はテスト全体の10%程度とされています。 本記事の読者の中には、10%のUIテストのためにハンズオンを開催する価値があるのか疑問に思う方もいらっしゃるかも知れません。

しかし私達は、エンジニアが自動テストを活用できるようになるには、 UIテストの特徴や使い方の理解は避けて通れないと考えています。 それらが理解できてはじめて、テストをどのアプローチで自動化するか判断できるようになるからです。

  • テストしようとしている内容はユニットテストとして実装できないか?
  • ユニットテストとして実装できない場合、自動化されたUIテストとして実装すべきか? 手動でテストした方が良いのではないか?

このような判断ができるようになることも念頭に置いて、UIテストハンズオンのカリキュラムを検討しました。

UIテストハンズオンの構成

昨年出版された「Androidテスト全書」は、 Android UIテストハンズオンの用途にはぴったりです。 とはいえ、出版されてからの1年間でAndroidのテストを取り巻く状況も変化してきています。

そこで今回のハンズオンでは「Androidテスト全書」をベースにしつつ、 Androidのテストを取り巻く最新トレンドを踏まえて、次の内容も盛り込むことにしました。

  • AndroidX Testに新しく導入されたActivityScenarioFragmentScenarioの使い方
  • Kotlinコルーチンによる非同期処理に対応する方法

私達SWETはテストの専門家集団として、 Androidテスト全書のUIテスト部分を執筆し、 それ以降もAndroid UIテストのナレッジを常にアップデートしてきました。 そのため、より現在のAndroid開発に適したものとなるよう、柔軟にカリキュラムをアレンジできました。

なお「Androidテスト全書」のUIテスト部分は4章から6章で構成されていますが、今回は次のような理由により4・5章のみをベースにしています。

  • ユニットテスト・UIテストのどちらで実装するかを含めた判断をするためには、UIテストの特徴や導入前の検討事項がまとまっている4章「UIテスト(概要編)」の理解が不可欠である
  • Androidエンジニアがテストを書くケースを考えると、Appium(6章)よりもEspresso(5章)の方が取り組みやすい

これらの内容を「基礎編」と「応用編」に分け、それぞれ2時間(合計4時間)で実施することにしました。

「基礎編」のカリキュラム

基礎編のカリキュラムは次の通りで、外山と田熊(@fgfgtkm)が作成しました。 前半の1時間が座学で、後半の1時間がハンズオンです。座学はほぼAndroidテスト全書の4章に沿った内容です。

セクション 参考にした資料
座学:UIテストの自動化を始める前に Androidテスト全書4.1章
座学:テストツール選択のポイント Androidテスト全書4.2章
座学:長くテストツールを利用し続けるには Androidテスト全書4.3章
ハンズオン:Page Objectデザインパターンを使ってテストを書いてみよう 外山のDroidKaigi 2019発表

基礎編では思い切って、EspressoのAPI説明を全て割愛することにしました。 UIテストを作るだけであれば、Android StudioのEspresso Test Recorderを使えば簡単に実現できるからです。

その点を踏まえると、Androidエンジニアにとっての「UIテストを書くための基礎」 としてより優先度が高いのは「EspressoのAPIを理解してテストを書けること」ではなく 「Page Objectデザインパターンを適用できること」であると考えました。

その考えを元に、ハンズオン部分はEspressoのAPIを知らなくても進められるような構成にしています。

  • Espresso Test Recorderでテストシナリオを記録する
  • 生成されたテストコードをActivityScenarioを使うように書き換える
  • Android Studioのリファクタ機能を使って、安全にPage Object化する

この構成にすることで、2時間という短時間で、 UIテスト未経験のAndroidエンジニアでも保守性の高いUIテストの書き方を習得できる内容になりました。

また、ハンズオン部分はスライドではなくGoogle Codelab形式で作成しました。

f:id:swet-blog:20190927124405p:plain
Google Codelab形式で作成した研修コンテンツのスクリーンショット

Google Codelab形式で作成することにより、今回参加できなかった方も独学でハンズオンを進められるようにしました。

「応用編」のカリキュラム

応用編のカリキュラムは次の通りで、田熊と鈴木穂高(@hoddy3190)が作成しました。 こちらは全てGoogle Codelab形式で作成しました。

セクション 参考にした資料
座学:ActivityScenarioFragmentScenarioを使ったActivity/Fragmentの起動 公式ドキュメント
Test your app's activities
Test your app's fragments
座学&ハンズオン:Espresso APIの基本 Androidテスト全書5.4章
座学:RecyclerViewを操作する Androidテスト全書5.7.1章
座学:カスタムViewActionの作成 Androidテスト全書5.7.1章・5.7.5章
座学:カスタムViewMatcherの作成 Androidテスト全書5.7.1章・5.7.5章
ハンズオン:RecyclerViewの操作する Androidテスト全書5.7.1章・5.7.5章
座学:画面更新の待ち合わせ Androidテスト全書5.5章
座学&ハンズオン:UI Automatorを使って明示的な待ち合わせ処理を行う Androidテスト全書5.5章
座学:IdlingResource Androidテスト全書5.5章
ハンズオン:IdlingResourceを使ったKotlinコルーチンの待ち合わせ Android Testing Codelab §7kotlinx.coroutines Issue 242
座学:その他の方法でコルーチンの待ち合わせをする 外山のDroidKaigi 2019発表DroidKaigi 2019アプリのCoroutinePlugin.kt

応用編では、受講者が次の2点を習得できるようにカリキュラムを検討しました。

  • ActivityScenarioFragmentScenarioを使ってActivityやFragmentをテストする方法
  • 基礎編で習得したEspresso Test RecorderではカバーできないUIテストを自動化する方法

前者のActivityScenarioFragmentScenarioは、AndroidX Testに新しく導入された、 ActivityやFragment単体をテストできる仕組みです。

特にFragmentScenarioFragment単体を起動してテストできる点が画期的です。 これを使えば特定のFragmentのUIテストを書きたいときの煩雑さが大幅に減りますので、 是非ともカリキュラムに組み込みたいと考えました。

後者は、Espresso Test Recorderを使わずにテストを書く場合に必要なEspresso APIの基本を説明しつつ、 ほとんどのアプリで必要になる次の2点を重点的に学ぶ内容にしました。

  • RecyclerViewの操作方法
  • 画面更新の完了を待ち合わせる方法

特に画面更新の待ち合わせについては、採用が増えてきているKotlinコルーチンを題材としており、 より実践的な内容になっています。

この構成にすることで、2時間という枠の中でEspresso APIの基本を押さえつつ、 Espresso UIテスト実装時に直面しがちな問題への対処法を学べるカリキュラムを実現できました。

ハンズオンの振り返りとその先

ハンズオン実施後に参加者アンケートを取った結果、各ハンズオンの総評は「基礎編」が平均4.8、 「応用編」が平均4.71と良いフィードバックをいただくことができました(5段階評価で5が良い・1が悪い)。

ハンズオンでスキルを身に付けたら次は実践です! 参加者を中心に各プロジェクトが自律的に自動テストを書くようになって、はじめてこの取り組みは成功したと言えます。

SWETでは、これからも各プロジェクトが自律的にテストを書けるようになるための取り組みを継続していきます。

最後に、SWETでは一緒に自動テストの普及に取り組んでくれるエンジニアを募集しています。 今回の取り組みに興味を持たれた方は、下記URLからのご連絡をお待ちしております!

募集職種: SWET (Software Engineer in Test) / テスト自動化エンジニア(Android Test)


  1. ここではアプリのUIを操作が発生するテスト全般のことを指しています。UI操作を伴うものであればend-to-endテストに限りません。