【iOS】FastlaneでUnitTest/UITestをいい感じに自動化してみた


はじめに

Fastlaneをプロジェクトに導入をする機会があって、いろいろ調べたので記事にしてみました。
Fastlaneをこれから使ってみたい、XCTestを自動化したいという方の参考になれば幸いです。

この記事で学べること

  • Fastalenの導入の方法
  • XCTest(UnitTest/UITest)を自動化する方法(前提としてプロジェクトにXCTestが導入されている必要がある)
  • Test自動化のための細かいオプション

Fastalen導入

Test自動化の前にFastlaneをプロジェクトに導入する必要があります。
プロジェクトのディレクトリに移動して、

bundle init

を実行すると、同ディレクトリにGemfileが生成されます。

Gemfileをテキストエディタなどで開いて、コメントアウトされている# gem "rails"の下に、

gem 'fastlane'

を書き足します。
ここまでは、エラーが起きて失敗したりすることはあまり無いと思います(自分は大丈夫でした)

次はインストールです。

bundle install --path vendor/bundle

このコマンドが結構厄介で、環境によっては権限周りのエラーを吐きます。
PCによって大丈夫だったり、ダメだったり色々です。とりあえず、エラーで検索すれば、解決できました。

ここまできたら次は、Fastalen導入です。

bundle exec fastlane init

1 - 4 の選択肢を提示されて、選ばされますが、どちらにせよ後で編集できるので、4番を選択します。
なんか色々聞かれますが、Enterですべてすっ飛ばします。

このコマンドが成功するとディレクトリにfastlaneというファイルが作られます。
その中に、FastfileAppfileがあるはずです。← 今回はこれ使いません。

XCTestの自動化

とりあえず、Fastlaneの導入が終わりましたので、こっから自動化する作業に入ります。

Scanfileを生成する

bundle exec fastlane scan init

とりあえずTest実行してみる

Scanfileが作られたら、とりあえず中身を何も変更しないデフォルトでも自動テストが動きます。

bundle exec fastlane scan  

これだけです。
UnitTestとUITestがプロジェクトに両方ある場合は、両方とも自動で実行されます。

ターミナルでテストが完了したことを確認し、
/fastlane/test_outputのディレクトリにreport.htmlが出力されていればテスト完了です。
テストの結果はこのHTMLファイルから確認できます。

こんな感じです。
test_result.png

プロジェクトにある全てのTestをとりあえず回したいという場合はここまででOKです。

Scanfileを使ってもっと便利にしてみる

デフォルトでもXCTest自動化という目的は達成ですが、せっかくScanfileを生成したので、もう少しカスタムしていきたいと思います。
自分が使ってみて便利だったカスタムは以下に記載しました。

devices(["iPhone 8"])

open_report(true)

clean(true)

only_testing(["Switf5UITestTrainUITests/Switf5UITestTrainUITests/testLogin"])

# skip_testing(["Switf5UITestTrainUITests/Switf5UITestTrainUITests/testLogin"])
key value type
devices テストを実行する端末を配列で指定可能 [String]
open_report テスト完了後にhtmlを開くかどうか
終わったタイミングが分かるので良い
Bool / default = false
clean clean build するかどうか Bool / default = false
only_testing 実行したいテストを1メソッド〜指定可能
フォルダ名/ファイル名/メソッド名 を配列で指定可能
めちゃ使える
[String]
skip_testing スキップしたいテストを1メソッド〜指定可能
フォルダ名/ファイル名/メソッド名 を配列で指定可能
[String]

パラメーターの仕様をもっと知りたい方はこちらのドキュメントに記載されているので読んでみてください。

参考にさせていただいた記事