XCUITestのバージョン差異の動作チェックをGitHub ActionsとBitriseで用意してみた話

iOSのテスティングフレームワークであるXCTestでUIテストを実装すること(以後、XCUITestと呼びます)がありますが、このXCUITestの挙動はバージョンによって変わることがあります。

最近見かけた事例は、次のようなものです。

iOS13でおきた事例(のうちの1つ)

表示されている画面上にUILabelが1つとUIButtonが1つある場合、それぞれのUI要素の数をチェックしたとします。

let app = XCUIApplication()
let buttonCount = app.buttons.count // UIButton
let labelCount = app.staticTexts.count // UILabel

XCTAssertEqual(1, buttonCount) // このアサーションはiOS12、13ともに通る
XCTAssertEqual(1, labelCount)  // (1) ここが変わる

(1)にあるUILabelの数がiOS13だとUIButtonの数も含めた値になっています。
つまり、次のような感じになっています。

- 実行環境がiOS12系:labelCount が1つとカウントされる
- 実行環境がiOS13系:labelCountが2つとカウントされる

そこで、このようなことが起きたことに気づけるようにCI/CDサービスを活用してチェックするようにしてみました。

チェックする組み合わせ内容とCI/CDサービス

今回のような事象含め、気付けるようにするためにXcodeの複数バージョンとiOSの複数バージョンを組み合わせてチェックすることにしました。

- Xcode複数バージョン x iOS複数バージョン(iOSシミュレーター、実機)

そこで「GitHub Actions」と「Bitrise」を活用してチェックすることにしました。
GitHub Actionsは無料の場合は、最大同時macOSジョブは5になります。

Bitriseは、OSSの場合だとビルド実行時間は最大45分になります。


マトリックスビルドをおこなうことができる「GitHub Actions」だけで完結させたかったのですが、次のアドレスにあるように利用できるXcodeのバージョンが11系のみなこともありBitriseも併用することにしました。

また実機での確認を考えると、デバイスファームを活用しようと思っていました。
そこでBitriseを使って、Firebase Test Labを利用することにしました。
※Bitriseは今のところFirebase Test Labを無料で利用することができます。

次にそれぞれのCI/CDサービスの利用方法についてかんたんに説明しておきます。

GitHub Actionsの利用

GitHub Actionsではマトリックスビルドを利用することができます。
GitHub Actionsのymlには、次のようにmatrixを指定しています。

jobs:
 build:
   runs-on: ${{ matrix.os }}
   strategy:
     matrix:
       xcode: [ '11.2.1', '11.3.1', 'latest' ]
       os: [ macOS-latest ]

これによりmacOS(の用意されている最新)で複数のXcodeのバージョンを指定しています。
xcodeのkeyで指定しているlatestは独自の値で、この値のときには最新のバージョンを探して利用するようにしています。

これにより、現時点では次のバージョンで動作確認をしています。

- Xcode11.2.1 x iOS13.2
- Xcode11.3.1 x iOS13.3
- Xcode11.4 beta(現時点) x iOS13.4

Bitriseの利用

Bitriseでは次にあるようにFirebase Test Labでのテストの実行をかんたんに利用することができます。


Bitriseでは2つのアプリを登録し、それぞれのアプリにワークフローを2つ用意しています。
Firebase Test Labのステップ([BETA] iOS Device Testing)では次のように2端末分指定しています。
※ ステップのサンプルにはiOS13系がありませんが、Firebase Test Labで利用できます。
※ 2端末を指定すると、直列実行をおこなうため実行時間が少し長くなる点に注意してください。

iphone11,13.3,ja_JP,portrait
iphonexr,13.2,ja_JP,portrait

Bitriseでは、次の4パターンの実行をおこなっています。

 - アプリ1のワークフロー1:Xcode10.3 x iOS12.1とiOS12.3
 - アプリ1のワークフロー2:Xcode11.4 x iOS12.1とiOS12.3
 - アプリ2のワークフロー1:Xcode10.3 x iOS13.2とiOS13.3
 - アプリ2のワークフロー2:Xcode11.4 x iOS13.2とiOS13.3

おわりに

これらのCI/CDサービスの結果は、badageを使って表示をしています。
現時点では、以下の画像のようにiOS12系でテストが失敗しています。

これは上述したUILabelとUIButtonのカウントの差です。
コード上では、最新のバージョンを(あえて)正として書いています。
そのため、iOS12系がテストが失敗したままになっています。

スクリーンショット 2020-02-29 15.42.00

今後はさらにUIテストを追加しつつ、新しいバージョンが出たらこれで試すようにしていこうと思います。
できれば、新しいバージョンがでたときの実行は自動化できればなとは思ってはいます。


この記事が気に入ったらサポートをしてみませんか?