Jenkinsを使ったiOSアプリビルド自動化7 ビルドとテストの基礎

Jenkinsを使ってビルドを自動化することができました。この後、ビルドしたアプリをTestFlight経由でいつでも簡単にインストールできるようにしていきたいのですが、手順の都合から先にテストの自動化について確認しておきましょう。

継続的なテスト

SQLiteのテストコードは実に9000万行を超えているそうです。バグを早期に発見しつぶすためにテストは重要ですが、一方で開発が進むにつれて増大していくテストコードを、プログラマがコードをコミットする前に毎回全部実行するのは、時間がかかり非効率的です。
そこで、プログラマは自分のコミットに影響があると思われる部分(この見積もりは大事だけれど)のみコミット前にテストを実行し、後はコミットした後でJenkinsにテストさせていくようにして、バグの早期発見とスピードのバランスをとっていきましょう。

Xcode Pluginを使って実行できるテストの制限

最近では、標準のSenTestingKitの他にも様々なサードパーティのテストフレームワークがあります。JenkinsのXcode Pluginを使って自動的に実行できるテストには制限があり、基本的にはXcodeのUnit Testingの仕組み(すなわち、XcodeからCmd + Uで実行できる / ビルド設定のTest After Buildで実行できる)でテストを実行できるフレームワーク以外は実行できません。(自分でシェルスクリプトを書けば実行できるものもあります)
というのも、「Xcode Pluginがテストを実行をサポートしてくれる」わけではなく、「Xcodeの設定でビルド時にテストが実行されるようにしておくと、ビルド後にテストが実行される」だけの話だからです。

Test After Build

少しJenkinsから話がそれますが、まずはXcodeのビルドとテストの関係について確認しておきます。
目立たないところにあるので使った事がない人が多いと思いますが、そもそもXcodeには「ビルド後にテストを実行する」という設定項目があります。Build SettingsにあるTest After Buildというのがそれです。
これがXcodeのバグなのか仕様なのかわかりませんが、アプリのターゲットあるいはプロジェクトのビルド設定の方でTest After BuildをYESにしていざアプリをビルドしてみても、テストは実行されません。
どうやら、この項目は「そのターゲットがビルドされた後にテストを実行する」オプションのようです。通常のアプリビルドとテストはターゲットが別になっているので、テストターゲットの方のTest After BuildをYESにセットして、テストターゲットをビルドするとテストが実行されます。とはいえ、わざわざテストターゲットに切り替えてビルドするのでは、Cmd + Uを押してテストを手動で実行するのと変わりません。というか、手間が増えて余計に面倒になってます。
Xcode 4にはスキームという仕組みがあり、そこで通常のアプリのビルド用のターゲット、テスト用のターゲット等をまとめて管理できるので、Test After Buildの設定もそれに準じて動いてくれれば良いのですが、どうやらそういうわけではないようです。
なので、通常のアプリ開発フローの中でTest After Buildを実現したい場合は、少し不思議な設定ですがアプリケーション側のBuild PhasesのTarget Dependenciesの中にテスト用のターゲットを入れておき、テスト用ターゲットのTest After BuildをYES、Test Hostを空にすることで実現できるようです。
というわけで、このTest After Buildの仕組みを使ってJenkinsのジョブでテストを動かしてみましょう

参考リンク

Pocket

「Jenkinsを使ったiOSアプリビルド自動化7 ビルドとテストの基礎」への2件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です