nana開発者ブログ

音楽SNSアプリ"nana"開発チームのブログです。

XCUITestとswift-snapshot-testingを共存させる際に気をつけたいこと

開発チームのiOSエンジニアをしている西山と申します!
前回の記事ではXCUITestについてご紹介させていただきましたが、
nanaではXCUITest以外にも、スナップショットテストを導入しています。

今回はXCUITestとスナップショットテストを共存させる時、 Bitriseで実行する際に気をつけたいことをご紹介いたします。

~ Targetは分割しよう~

UITestにはXCUITest、スナップショットテストにはswift-snapshot-testingを導入しています。

github.com

前提としてswift-snapshopt-testingはXCTestをベースとして作られているので、
新たにスナップショットテストを導入する際はあらかじめ、Targetを分割しておきましょう。

なぜかというと・・・
既存のユニットテストなどを実装しているTargetに新たにスナップショットテストを記載してしまうと、 すでにユニットテストなどでXCTestを導入している場合、
ユニットテストだけ実行したい、スナップショットテストだけを実行したいというシーンで困ってしまうためです。

参考までにnanaではテストに関連するTargetを以下のように分割しています。 f:id:nanamusic-tech:20210913215019p:plain

  • nanaTest ・・・ UnitTestを実行するTarget
  • NanaSnapShotTest・・・本記事で紹介したスナップショットテストを実行するTarget
  • NanaUITests・・・UITestを実行するTarget

余談

fastlaneを採用している場合は、scanのonly_testingコマンドで分割したスナップショットテスト用のtargetを実行することが可能となります。 docs.fastlane.tools 以下のようなsnapshot用のlaneを作ることができます。

lane :snapshot_test do
    scan(
      scheme: "nana",
      only_testing: ["SnapShotTests"],
      devices: ["iPhone 8"]
    )
  end

~ XCUITestのみを実行するschemeを定義しよう ~

前回ご紹介したXCUITestをBitrise上で複数端末実行するために、この二つのWorkflowを採用しています。

  • Xcode Build for testing for iOS
  • iOS Device Testing

このWorkflowでスナップショットテストを実行してしまうと、 こちらのissueにあるように、FirebaseTestLab側が、スナップショットテストの比較用画像のパスを参照できないため以下のようにエラーになってしまいます。 f:id:nanamusic-tech:20210906191827p:plain

「Xcode Build for testing for iOS」で実行したいのはXCUITestのみですので、 以下のようにXCUITestのみを実行するschemeを定義し、Bitrise上で実行するようにして下さい。 f:id:nanamusic-tech:20210830132013p:plain

以上、XCUITestとスナップショットテストを導入した際に気をつけたいポイントを記載しました。

さいごに

このようにスナップショットテスト/XCUITestを共存させる際にも、
実際に試行錯誤しないと見えてこない部分だったりあるので
これから導入を検討されてる方々の助けになればと思います。


nana musicでは、iOSのテストコードを一緒に書いてくれる/自動化を進めてくれる仲間を募集しております! 是非、ご応募をお待ちしております。

www.wantedly.com