ソフトウェア開発において、テストは非常に重要な要素です。ただ、モバイル アプリケーションは、サーバーや Web ベースのアプリケーションに比べてテストが難しいことがあります。Android や iOS の実機かシミュレーターでアプリを実行し、機能チェックを行わなければならないからです。

しかし、継続的インテグレーション (CI) ツールを使用すると、モバイル アプリケーションのテストを自動化できるので、テスト プロセスがより簡単で、効率的かつ一貫性の高いものになります。

この記事では、テストに対応したモバイル アプリケーションの設定方法の概要を紹介し、CI パイプラインによってビルドとテストのプロセスを自動化する方法をご紹介します。

テストを組み込んだモバイル アプリの作成方法

Android Studio と Xcode (iOS) はともに、新規プロジェクトの作成時に、テストに対応したモバイル アプリケーションを作成できます。どちらの IDE にも、テスト (より具体的には、単体テスト) を組み込んで実行する機能が用意されています。

Android Studio で Android アプリケーションを開発する場合、新規プロジェクトを作成すると、/src/test/java/ というディレクトリも一緒に作成されます。ここに、JUnit 4 テスト クラスの実装としてテストを記述します。この場合、build.gradle ファイルにいくつかの依存関係を構成する必要があります。テストを組み込んだ Android アプリの作成方法の詳細については、こちらの Google ガイドを参照してください。

Xcode で iOS アプリケーションを開発する場合、新規プロジェクトを作成すると、プロジェクト スキームに単体テストのスタブ メソッドを含んだテスト ターゲットが用意されます。このターゲット内にテストを記述し、メニューで [Product (プロダクト)]、[Test (テスト)] の順に選択すると、一連のテストを実行できます。テストの一部を実行するには、該当するテストを選択して [Product (プロダクト)]、[Perform Action (アクションを実行)]、[Run Test Methods (テスト メソッドを実行)] の順に選択します。詳細については、Apple のドキュメント「Using Unit Tests (単体テストの使用)」(英語) と「About Testing with Xcode」(英語) を参照してください。

こうしたプロジェクトは、モバイル アプリ向け CI ソリューションを利用すれば、単純な構成だけでビルドしてテストできるようになります。

モバイル アプリケーションのテストと自動化

モバイル アプリのテストの種類は複数あり、目的に応じてそれぞれ異なるテスト環境で実施されます。

  • 単体テスト - コードの一部を対象とする小規模なテスト。実機で行う必要はなく、ビルド マシン上でも実施できる。
  • 結合テスト - 実機が備える GPS などのネイティブ機能とのやり取りを伴う、上位レベルのテスト。実機またはシミュレーターで実施する必要がある。
  • 機能テストと UI テスト - アプリが適切に動作、機能することを確認するテスト (シーン ナビゲーションなど)。実機またはシミュレーターで実施する必要がある。
  • パフォーマンス テスト - アプリのパフォーマンス メトリクスを測定する負荷テスト。

CI パイプラインを構成すれば、新しいコードをリポジトリにコミットするたびに、コードのビルドから上述のテストの実行までのプロセスを自動で行えます。CI の実行環境は通常、クラウド上のサーバーかローカル マシン上であり、コードをビルドして事前に構成されたコマンドまたはタスクを実行します。

単体テストに使用できるフレームワークは、Android Studio の場合は JUnit、Xcode の場合は XCTest です。また、好みに応じて、直接ビルド マシン上で実行できる他の標準的な Java や ObjC/Swift のテスト フレームワークも使用できます。

実機かシミュレーターで実行する必要のある他のテストに関しては、Appiumのようなツールを使用すると、簡単に UI テストなどのアプリ テストを自動化できます。

では、これらのテストを CircleCI を使用して統合してみましょう。たとえば、CircleCI アプリケーションにプロジェクト リポジトリを追加し、config.yml ファイルの設定で、最新のコードをリポジトリからプル、ビルド、デプロイし、モバイル アプリケーションやそのテストを実行するステップを定義すれば、ビルドとテストのプロセスを統合して自動化できます。

設定ファイルの例を以下に示します。

# .circleci/config.yml
version: 2.1
jobs:
  build-and-test:
    macos:
      xcode: 11.3.0
    environment:
      FL_OUTPUT_DIR: output
      FASTLANE_LANE: test
    steps:
      - checkout
      - run: bundle install
      - run:
          name: Fastlane
          command: bundle exec fastlane $FASTLANE_LANE
      - store_artifacts:
          path: output
      - store_test_results:
          path: output/scan

CircleCI では Fastlane の使用をお勧めしています。ビルド、テスト、デプロイ プロセスのセットアップと自動化が簡単になるのに加えて、iOS アプリケーションと Android アプリケーションの両方に対応しているからです。CircleCI での Fastlane の使用方法についての詳細は、「Fastlane を使用した Flutter アプリのビルドとデプロイ」(英語) を参照してください。

さらに、CircleCI Orbs を使用すると、モバイル テスト自動化がひときわ簡単になります。Orb とは、ジョブやコマンドなどの構成要素をまとめた共有可能なパッケージです。時間をかけて各種サービスとの統合方法を調べジョブやコマンドを指定しなくても、Orb を CI パイプラインに直接追加すればサービスを使用できます。豊富な種類の Orb が、Orb カタログにまとめられています。

モバイル アプリのセキュリティ上の懸念事項

CI は、モバイル開発プロセスに含まれるテストを簡素化するだけでなく、重大なセキュリティ上の懸念事項も軽減できます。

CI で対処できる潜在的なセキュリティ問題の例をいくつか挙げてみましょう。

  • 認証情報と認証 - チームや組織では、アカウントのパスワードやアクセス権限の保持者を管理者だけに限定することが重要です。そうすることで、非公開証明書によるコード署名や API キーを使用したビルドのアップロードなど、注意を要するコマンドやタスクの実行が CI サーバーに限定されます。
  • データ暗号化 - ユーザーの個人情報やパスワードは慎重に扱う必要があります。コード変更のたびに、デバイスや Web 上でこのようなデータが常に暗号化されているかどうかをテストすることで、ユーザーを保護できます。
  • バグの再発 - 過去に修正済みのバグや問題の再発を防ぐ方法としてお勧めなのは、自動テストを作成して、ビルドのたびにそのシナリオをチェックすることです。
  • エラー処理 - モバイル アプリのクラッシュやメモリ バッファーの容量制限は、少なくともユーザー エクスペリエンスの低下、最悪の場合はセキュリティ侵害の原因になります。適切にエラー処理が行われることをテストで確認すれば、このような問題を軽減できます。
  • デバイスの機能とアクセス許可 - マイクやカメラなど、アプリで使用するデバイス機能が適切な方法かつ適切なアプリ シーンでのみ使用される (ユーザーが意図したタイミングでのみ使用され、それ以外のコンテキストでは使用されない) ことを確かめるうえでテストが役立ちます。これは、ユーザーが保存した写真やファイルへのアクセス許可をアプリが取得する場合にも当てはまります。

CI を通じたモバイル アプリのデプロイ

モバイル アプリのテストが完了し、いよいよリリースという段階でも、CI は活躍します。アプリ ストアにアプリを直接パブリッシュできるのです。

手順を大まかに言いえば、CI タスクで最新バージョンのコードを確認し、そのバージョン番号をインクリメントして、リリース用にプロジェクト ソースをビルドし、パッケージ化されたアプリを Google Play ストアまたは Apple App Store に直接アップロードする、という流れになります。

この方法を取る場合、Git のブランチを利用するのがお勧めです。そのとき、リリース ブランチを開発ブランチとは別に指定しておき、コードが開発ブランチからリリース ブランチにマージされたときにだけ、CI でビルドがストアにアップロードされるようにします。

CircleCI と Fastlane を組み合わせて使用すると、モバイル アプリケーションのデプロイを簡単に構成できます。iOS アプリケーションの場合、CircleCI から App Store Connect にアクセスできるので、リリース バージョンのアプリをビルドしてアップロードするように Fastlane でステップを構成します。Fastlane では、snapshot と frameit の各アクションを使用して、メタデータの処理中にフレーム付きのスクリーンショットを生成することもできます。

モバイル アプリをデプロイするための構成手順について詳しくは、iOS 編Android 編の CircleCI ドキュメントをそれぞれ参照してください。

モバイル開発をはじめましょう

ここまで、CI を使用したモバイル アプリ テストの自動化手順を簡単に説明してきました。テストの自動化は必ずしも難しくないことがおわかりになったと思います。今すぐモバイル アプリ プロジェクトを開始して、最初からテストと CI を組み込んでみるのはいかがでしょうか。

CircleCI を使用すると、アプリのテストとデプロイを簡単に自動化できます。ちなみに、CircleCI の利用開始にあたって、費用は一切かかりません。また、プロジェクトがオープン ソースの場合は、毎月ビルド クレジットが無料で付与される特別プランにお申込みいただけます。

最後に、CircleCI によるモバイル アプリ テストの自動化を進めるうえで役立つリソースをいくつか紹介します。

モバイル アプリのテストと自動化をぜひ成功させてください!