メルカリiOSのUIテスト自動化をまるっとご紹介します!

こんにちは、メルカリの自動化&品質保証グループ(Automation & QA Group:通称AQA)の 根本 征 です。

私は普段、テスト自動化・CI / CD改善・その他社内の生産性を上げるための自動化を行っています。

今回はiOSのUIテスト自動化について、最近の改善をまとめてご紹介したいと思います。

ざっくり言うと

  • HTMLレポートに出力し、失敗原因を見やすくするようにしました
  • リトライ実行するためのfastlaneプラグインを作りました
  • テスト実行環境をJenkinsからCircleCIに移行しました
  • Slack Commandを使って、簡単に実行できるようにしました

これまでのiOSのUIテスト自動化

AQA(旧QA-SET)では去年から、JP版アプリ(iOS / Android)のUIテスト自動化に取り組んでいます。

去年のMercari Tech Conf 2017では、ブース展示をして紹介させてもらいました。

tech.mercari.com

iOSはXCUITest(XCTest UITest)というApple公式のテストフレームワークを使い、Swiftで実装しました。

ローカルのMac上でSimulatorを使いテストを実行させ、Jenkinsで管理をしていました。

また、BluepillというOSSを利用し、テストの並列実行・リトライ実行を可能にしました。

GitHub – linkedin/bluepill: Bluepill is a reliable iOS testing tool that runs UI tests using multiple simulators on a single machine

これによって実行時間の短縮・実行の安定化をすることができました。

しかし、運用していく中で様々な課題が出てきました。

  • テストが失敗した時に、どこで失敗したかが分かりにくい
  • 実行環境のメンテナンス・不安定

これらの課題を解決するために、下記の改善を行いました。

HTMLレポートに出力し、失敗原因を見やすくするようにしました

BluepillではJSONまたはJUnit形式でしかテスト結果のアウトプットができず、また失敗時のスクリーンショットを簡単に参照することができません。

そのためUIテストでは、どの部分でテストが失敗したかがわかりにくかった問題があります。

そのため、BluepillをやめてXCTestHTMLReportを利用し、HTMLレポートを出力させるようにしました。

GitHub – TitouanVanBelle/XCTestHTMLReport: Xcode-like HTML report for Unit and UI Tests

Xcode上で表示されるようなUIで、どの部分でテストが失敗したか、スクリーンショット付きで確認することができます。

f:id:tadashi-nemoto0713:20180717180233p:plain

リトライ実行するためのfastlaneプラグインを作りました

先ほど、Bluepillをやめたお話をしましたが、Bluepillには失敗したテストをリトライすることができる機能があります。

リトライ機能はUIテストの不安定さの対策として必要な機能でしたので、別途fastlaneプラグインを作成し、対応しました。

GitHub – gmgchow/fastlane-plugin-retry: A Fastlane plugin that automatically retries failed XCUITest test cases and generates a .plist report

リトライ回数やデバイスを指定して、テスト実行をさせることが可能です。

bundle exec fastlane run_tests_with_retry 
tries:3 
devices:"platform=iOS Simulator,name=iPhone 8,OS=11.4"

テスト実行環境をJenkinsからCircleCIに移行しました

これまではオンプレミスでテスト実行環境を用意していましたが、Xcode・macOS・Jenkinsバージョンアップなどのメンテナンスが必要になります。

また、テスト実行環境が起因でテストが不安になることが何度かありました。

この課題を解決するため、CircleCIに移行し、クラウド上で実行させるようにしました。

Jobは下記のように設定しました。

uitest:
<<: *machine_macos
steps:
- checkout
- *step_restore_bundler_cache
- run: bundle install
- *step_save_bundler_cache
- *step_install_xchtmlreport
- run: bundle exec fastlane uitest_with_retry
- *step_store_test_output_artifacts
- *step_slack_result_with_html_report

このJobを定期実行したい場合にはCircleCIのWorkflowを利用します。

workflows:
version: 2
nightly_uitest:
triggers:
- schedule:
cron: "0 15 * * *" # 0AM JST
filters:
branches:
only: master
jobs:
- uitest

これによって実行環境をある程度クラウドに任せることができます。

構築も簡単なため、これからUIテスト自動化にチャレンジしたい方は是非参考にしていただけたらと思います。

Slack Commandを使って、簡単に実行できるようにしました

CircleCIでは、Jenkinsのようにコンソール画面からJobをトリガーすることはできません。

そのため今回は、移行したのと同時にSlack Command経由で上記のJobをトリガーさせるようにしました。

f:id:tadashi-nemoto0713:20180806161805j:plain:w500

以前紹介したAndroidビルドのSlack Commandと仕組みは同じです。

tech.mercari.com

まとめ

上記の改善によってだいぶ問題は解決されたのですが、実行時間の短縮が現在一番課題になっています。

これはXcode 10からParallel Testsが可能になるため、これを期待しても良いかもしれません。

What's New in Testing – WWDC 2018 – Videos – Apple Developer

このような改善ができたのも、UIテスト自動化に取り組む人が増えた のが一番大きいと考えています。

UIテスト自動化は、他のレイヤーのテストと比べると不安定かつメンテナンスコストがかかります。

最初は私1人でメンテナンスを行なっていましたが、最近は複数人でメンテナンス・改善することができるようになりました。

また、QAエンジニアの中でも新しい機能に対してUIテストを実装したり、定期実行されるテストのレポートをチェックする人が増えています。

引き続き、開発スピードと品質を両立していくために、テスト自動化を推進していきたいと思います。

  • X
  • Facebook
  • linkedin
  • このエントリーをはてなブックマークに追加