この記事は、ソフトウェアテスト Advent Calendar 2022の11日目の記事となります。
前日10日の記事は、@cvusk さんの「ソフトウェアテストの実行を効率化するPredictive Test Selectionの衝撃」でした。
概要
スマホアプリをAzure PiplinesでCI対応した後にビルドしたアプリが問題なく起動して動作するか簡単なE2EテストをAppiumを用いて実行する環境を作ってみました。
今回は、iOSアプリを対応したものでAndroidアプリやUnityのビルド後のアプリビルドの対応については後日やってみようかと。
※Unityなど3Dエンジンをもとに描画した画面ではAppiumはサポートされておらず、スクリーンショット撮影するとブラックスクリーンの画像が生成され、OpenCVの画像認識によるボタンクリック操作を実行しても反応しませんでした。
注意
本記事では、Azure PipelinesでのCI/CDやAppiumのE2Eテストツール関連について初心者向けへの解説は特にしません。
初めて知る方などは、過去に以下の記事にそれらの解説をまとめており、入門・初心者的な他の記事を参考に一度触ってから参考にされてください。
その他の知見
かれこれ2~3年前から触ってまして、過去の知見は以下になります。
仕組み
AppiumをAzure Pipelinesに組み込んだCI/CDについて、以下のワークフローで実装しました。
(※Azure Pipelinesからフローが流れているのは、CI開始の意味でもちろん全てAzure Pipelines環境内で起きている。)
まず、正常に.app
および.ipa
のアプリビルドされた後にAppiumを実行します。
AppiumによるE2Eテストが問題なければ、AppCenterにアプリデプロイするシンプルなフローとなります。
AppCenterTest
今回は、Azure Pipelinesに強引にAppium環境をインスコしたやり方となり、App CenterでAppiumテストできる設定があるようです。
今回使用するアプリのサンプルについて
今回使用したサンプルは、Xcodeのデフォルトで用意されているプロジェクトPage Based Application
を活用しました。
このサンプルは、左右のスワイプで次と前の画面に遷移できる作りで、画面上に表示されている文字の確認やボタンクリック以外のテスト操作も必要なケースを想定したいと思い使いました。
Azure Pipelines に Appium 環境を構築する
きっかけは、
の記事を見つけてやってみたものの、ここで解説されている.yml
だけではエラーになりました。
azure-pipelines.yml
上記の記事をもとに最新に対応してエラーなく、AppiumをAzure Pipelinesに組み込むだけの設定内容を以下のGistにまとめています。
iOSシミュレータ
もともと.ipa
ビルド向けに対応していたため、.app
ビルド(iOSシミュレーター)向けについてやったことがなく、こちらも調査して試してみました。
諸々ググったところ、関連する記事が少なかったりそれぞれ設定ばバラバラで苦戦しました。
今回は、以下の内容で.app
ビルドをやっています。
また、手元でXcode上でビルドするときとxcodebuildコマンドとで.app
がビルドされるパスが異なるので、初回は手動で.app
ファイルを探して扱いやすい場所にコピーしておくと管理しやすいと思い以下のようにしました。
- task: Xcode@5
inputs:
actions: 'clean build'
sdk: 'iphonesimulator'
configuration: 'Release'
xcWorkspacePath: './*.xcodeproj'
scheme: '$(XCODE_PROJECT_NAME)'
xcodeVersion: 'default'
destinationPlatformOption: 'iOS'
destinationTypeOption: 'simulators'
destinationSimulators: 'iPhone 13'
- script: |
echo "# ls -lt /Users/runner/Library/Developer/Xcode"
ls -lt /Users/runner/Library/Developer/Xcode/DerivedData/$(XCODE_PROJECT_NAME)-*/Build/Products/Release-iphonesimulator
echo "# mkdir $(agent.buildDirectory)/output/iphoneos/Release-iphonesimulator"
mkdir -p $(agent.buildDirectory)/output/iphoneos/Release-iphonesimulator
echo "# cp -r ~/build/Release-iphonesimulator/$(XCODE_PROJECT_NAME).app"
cp -r /Users/runner/Library/Developer/Xcode/DerivedData/$(XCODE_PROJECT_NAME)-*/Build/Products/Release-iphonesimulator/$(XCODE_PROJECT_NAME).app $(agent.buildDirectory)/output/iphoneos/Release-iphonesimulator/
displayName: "Check Path & Cp App"
Pytest
Pythonは、インスコできてもpytestは入っていないのでこれも手動でインスコしてからpytest
を実行、テストコードの中で状況を把握するためにテスト中のスクリーンショットを撮っているので、その画像データをPublishBuildArtifacts
するパスにコピーしています。
- script: |
echo "# pip3 install pytest"
pip3 install pytest
echo "# python3 -m pytest ./test/AppiumTest.py"
python3 -m pytest ./test/AppiumTest.py
echo "# cp screenshot image agent.buildDirectory/output"
cp ./test/screenshot_*.png $(agent.buildDirectory)/output
displayName: Install pytest & Pytest appium.
E2E Test Code
サンプルで作ったAppiumTest.py
の中身について、以下のGistにまとめています。
Appium Desktopは、クリック以外のスクロール/スワイプや長押しの操作が用意されていないようなので、下記リンク先のAPIリファレンスや各リポジトリを参考に各自でテストコードを調整する必要があります。
処理時間
上記のサンプルだけでも以下の結果で51分半ほどかかっているため、ガッツリ開発しているアプリのXcodeビルドが長かったり、FlutterやUnityなどのマルチプラットフォームビルドができる開発ツールだともっと時間がかかることが想像できます。
まとめ
実際に正常に終わってPublishBuildArtifacts
した成果物が以下の内容です。
これで、Azure PipelinesでAppiumが実行できる環境ができ、アプリデプロイ前にビルドしたアプリが正常に起動して最低限動作するか簡単に確認するE2Eテストをクラウド上で完結させることができました。
課題
E2Eテスト環境ができてこれで終わりではなく、次のような課題についてさらに対策が必要となります。
- バージョンやテストなど諸々のメンテナンス
- E2Eテスト結果の可視化
- CI/CDにかかる時間の最適化
- 属人化対策