1 of 23

FlankでE2Eテストの可能性を最大限に引き出す

April 20th, 2021

Android Test Online #1 - connpass

🙏 @mhidaka 🙏 @tahia910 🙏

2 of 23

Slides

Blog

3 of 23

Firebase Test Lab?

https://firebase.google.com/docs/test-lab

Supports:

  1. Android のインストルメンテーション テスト (Espresso)
  2. Android の Robo テスト(ノーコード)
  3. iOS と Android のゲームループ テスト
  4. iOS の XCTest

4 of 23

5 of 23

Spark プラン(無料)

Blaze プラン(従量制)

無料枠

仮想デバイス: 10件/日

物理デバイス : 5件/日

仮想デバイス: 60分/日

物理デバイス : 30分/日

追加料金

利用不可(上限)

仮想デバイス: $1/デバイス/時間

物理デバイス: $5/デバイス/時間

6 of 23

アプリのAPK+テスト用のAPKを事前に用意する:

./gradlew app:assembleDebug \ // -> app-debug-unaligned.apk� app:assembleDebugAndroidTest // -> app-debug-test-unaligned.apk

7 of 23

テスト実行時の制限

  1. テストは順次実行される�
  2. gcloud に依存
    1. Pythonに依存
    2. 多機能なため頻繁な更新がある

8 of 23

And here is coming Flank��そこでFlankの登場です

9 of 23

Flank

  • テストシャーディング(= 並列実行)
  • gcloudのYAML設定と互換性
  • コストレポート
  • 安定性テスト
  • HTMLレポート
  • JUnit XML

10 of 23

FlankのAndroidテスティング内部構造

11 of 23

どうやったらFlankが使える?

最新版のflank.jarをダウンロードしてコマンドラインから実行: �https://github.com/Flank/flank/releases/latest

12 of 23

Flank設定(テストを8並列で実行する場合)

gcloud:

app: ./app-debug.apk

test: ./app-debug-androidTest.apk

device:

- model: NexusLowRes

version: 28

flank:

max-test-shards: 8

13 of 23

Flank実行時の紹介

  • 実行ログ
  • gsutilコマンド

14 of 23

<- gcloud

Flank ->

15 of 23

16 of 23

Gradleでも利用可能 github.com/runningcode/fladle

17 of 23

18 of 23

シャーディングの課題

  • 依存があるテストの例
    • ユーザーAテスト1にログインしていて、
    • 同じユーザーAを使うテスト2を実行した場合、
    • テスト1に通知が出て、 テストが壊れてしまう 😭�
  • スケーラビリティが必要なテスト環境
    • たくさんのリクエストがあり並列性の高いdev環境�
  • Test Labでの待ち状態(“inconclusive” shards)
    • デバイス不足により発生する可能性がある

19 of 23

タイムアウトによる中断の原因

  1. それぞれのテスト�
  2. デバイス (設定ファイルのgcloud.timeout)
    • 物理デバイスでは最大45分
    • 仮想デバイスでは最大60分�
  3. Flank (設定ファイルのflank.run-timeout)
    • デフォルトは無限待ち�
  4. 利用しているCIの設定
    • 例: CircleCI 5時間でタイムアウト

20 of 23

Smart flank

flank:

# the amount of groups to split the test suite into� max-test-shards: 100

# the amount of time tests within a shard should take (分で)� shard-time: 120

smart-flank-gcs-path: ./last-JUnitReport.xml

  • Smart execution logs
  • 実際の実行は約8分30秒、プロビジョニングなどの手順は考慮されていません

10分

3分

3分

10分

3分

3分

Before:

After:

21 of 23

Add new features

  • FlankはKotlinで書かれているのでCoroutinesなどを使った拡張も容易 🙌�
  • 例:mercari/flank/pull/8

22 of 23

Feature request: 使いやすいHTMLレポートが欲しい

  • 日本語が含まれているとレポートが壊れてしまう
  • exceptionしか表示されない

23 of 23

ありがとうございました :)

もし興味があれば:

  • オートメーションとテストインフラを使った業務
  • FlankやKotlin Scriptといった面白い技術スタック
  • 仕事仲間を募集中:Software Engineer, Tool and Infrastructure

参考

  1. Running Android UI Test Suites on Firebase Test Lab
  2. Flank December 2018