Unit Testing Bundle TargetのHost ApplicationをNoneにしてアプリを起動せずにユニットテストを実行する

終わり。以下メモ。


SchemeのTestで遊んでいた昼下がり、新規ProjectでTestを実行したらシミュレーター2つ立ち上がってビックリした。Intel MacBookなのでとてつもなくファンが回った。stack overflowに同じ事例があって解決した。今日はTestの内容。

開発環境

> xcodebuild -version
Xcode 14.1
Build version 14B47b

モチベーション

XcodeではCmd+UでActiveなSchemeのTestを実行できる。その際にユニットテストだけ実行する場合はシミュレーターを立ち上がらせたくない、みたいな気持ちになって調べたらSchemeに紐づく全てのTargetの "Hosting Application" をNoneにすればシミュレーターを立ち上げずにTestが実行されることが分かった。実際に試して期待通りに動作することを確認した。

これでユニットテストを実行する時はシミュレーター立ち上がらせなくて良くなった。めでたし。…ではTest自体はどこで行われている?気になったので調べた。とりあえずログを比較するところからやっていく。

ログ: Hosting Applicationに任意のApp Targetを指定

Hosting Applicationに任意のApp Targetを指定してTestを実行させた。

選択中のシミュレーターの機種名が表示されていて、シミュレーターが起動してアプリがインストールされて起動する。

ログ: Hosting ApplicationをNoneに指定

Hosting ApplicationをNoneに指定してTestを実行させた。

選択中のシミュレーターの機種名が表示されていて、シミュレーターは起動するだけ。どうやらアプリとは別のプロセスらしきもので実行されていそう。

xcresultを見る

もう少し深追いする。ログで折りたたまれていた箇所に記載されているxcresultファイルを見てみる。

Finder上でダブルクリックするとXcode上で開いてくれる。

各テストケースの実行時間などが列挙されていて、どのように実行されたかは書かれていない。xcresultはそういうものなのだろう、と理解。 結局Hosting ApplicationをNoneに指定した場合にテストがどこで実行されたか、ということの明確な答えは得られなかった。ログを見る感じ、指定したシミュレーター上でアプリを介さずに動かしてそうな気配を感じる。

参考