これまでのあらすじ
ひょんなことがきっかけで『iOSアプリ テスト自動化入門』を読みました。今年の3月20日くらいに出版された比較的新しい本なのですが、その直後にSwiftの出現とか冷戦の影響とかのせいでユニットテストを取り巻く状況は急速に変化してしまったようです。
同書の中で、ユニットテストにおけるフレームワークとしてXCTest、GHUnit、Kiwiの3つが紹介されていましたが、そんな最中(さなか)に新手のQuickが颯爽と登場。まーた新しいものつくって…。
序文
ところで話は変わりますが、昨日は朔旦冬至(さくたんとうじ)といって新しいことを始めるのにぴったりの日だったそうです。
なんか1日遅れているような気がしますが、ときには新しいこともしたいですしQuickにちょっと触ってみます。ちょっと触るだけだから。
ちなみに上記記事では「QuickはCocoaPodsからインストールできない」と書いてありますが、一応公式に「How to install Quick using beta CocoaPods」という情報がある通り、やってやれないことはないようです。
そんなわけで、今回はQuickをCocoaPods経由でプロジェクトに導入するまでの話を備忘録的に書いていきます。ところどころ躓きました。後半適当になります。
なお使用したXcodeのバージョンは6.1.1です。CocoaPodsのバージョンは0.35.0です。
プロジェクトの作成
まずXcodeを起動して、適当にプロジェクトを作ります。
今回はテスティングフレームワークを動かすことだけが目的で、べつにアプリを作りたいわけではないので、プロジェクトの種類はなんでもよいと思います。ちなみに僕はiOSのSingle View Applicationを選択し、プロジェクトを「Sample1223」と名付けました。
Bundlerの導入
せっかくですが、ここで一旦 Xcodeを終了させます。
「How to install Quick using beta CocoaPods」にとりあえずBundlerを入れろって書いてあったのでおとなしく入れます。
Bundlerってなんだろう。Rubyerの言うことは分からん。
Ruby - ツールを使いたいだけの人のための bundler 入門 (例: vagrant + veewee) - Qiita
ターミナルを起動して、gem install
コマンドを打ちます。
Gemfileの作成
続いて、.xcodeprojのあるディレクトリまでcd
で移動し、Gemfileを作ります*2。以後、特に断りがない限りはこのディレクトリで作業を行うものとします。
Gemfile
source 'https://rubygems.org' gem 'cocoapods', :git => 'https://github.com/CocoaPods/CocoaPods.git', :branch => 'swift' gem 'cocoapods-core', :git => 'https://github.com/CocoaPods/Core.git' gem 'xcodeproj', :git => 'https://github.com/CocoaPods/Xcodeproj.git' gem 'claide', :git => 'https://github.com/CocoaPods/CLAide.git'
gemインストール
bash
$ sudo bundle install
下記のメッセージが表示されたら成功。
Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.
Podfileの作成
続いて、NimbleとQuickを取得するようPodfileに書いてやります。このPodfileも、.xcodeprojのあるディレクトリに作ります。
bash
$ vi Podfile
Podfile
platform :ios, "8.0" source 'https://github.com/CocoaPods/Specs.git' pod 'Nimble', :git => "https://github.com/Quick/Nimble" pod 'Quick', :git => 'https://github.com/Quick/Quick', :tag => 'v0.2.1'
あとはEsc
からの:wq!
で上書き終了して、以下のコマンドを打つだけでOK。
bash
$ bundle exec pod install
実験、そしてまさかのエラー
Finderで.xcodeprojのあるディレクトリに行き、Xcodeで拡張子が.xcworkspaceの方を開きます。
Xcodeが勝手に作ったテスト用のソースSample1223Tests.swiftを以下のように書き換えてみました。
import Quick class Sample1223Tests: QuickSpec { }
すると、1行目のimport
でまさかのエラー。「No such module 'Quick'」と怒られてしまいました。
どうやら、テストコードからCocoaPodsで追加したライブラリをうまく参照できていないようです。
テストコードを書いてみる
というわけで、Developers.ioのこの記事から丸ごとパクった以下のコードで実験してみます。
import Quick import Nimble class Sample1223Tests : QuickSpec { override func spec() { it("is equal") { let value = 2 + 3 expect(value).to(equal(5)) } } }
Command
+u
で無事にテストができました。
めでたし。
と見せかけて、まだまだ続くよ
今回導入するQuickとNimbleはテストでしか使わないライブラリなので、Podfileを書き換えてSample1223Tests以外のビルドターゲットからはQuickやNimbleを呼べなくしてやります。targetに「Sample1223Tests」を指定するだけです。
Podfile
platform :ios, "8.0" target :Sample1223Tests, :exclusive => true do source 'https://github.com/CocoaPods/Specs.git' pod 'Nimble', :git => "https://github.com/Quick/Nimble" pod 'Quick', :git => 'https://github.com/Quick/Quick', :tag => 'v0.2.1' end
bash
$ bundle exec pod update
ところが、Podfileを修正してCommand
+u
したらまたしても謎のエラーが発生しました。
なんだこれは。
リンカエラーはさておき、まずはシェルスクリプト起動エラーからなんとかせねば。と思っていたら、GitHubで「diff: /../Podfile.lock: No such file or directory · Issue #2303 · CocoaPods/CocoaPods · GitHub」といういかにも関係ありそうな議論を見つけました。
diff: /../Podfile.lock: No such file or directory · Issue #2303 · CocoaPods/CocoaPods · GitHub
結局これを読んだところでなにひとつ解決しなかったわけですが。
試行錯誤
おそらく、target指定を行わないライブラリが1つ以上ないと、プロジェクトがConfiguration Fileを参照できなくてビルド時にコケるんじゃないか……とあたりをつけました。真偽のほどは分かりません。
そこで試しに、Podfileにtarget指定なしでAFNetworking を追加してみます(べつにAFNetworkingでなくてもよいのですが、定番中の定番なのでとりあえず)。
Podfile
platform :ios, "8.0" pod 'AFNetworking' target :Sample1223Tests, :exclusive => true do source 'https://github.com/CocoaPods/Specs.git' pod 'Nimble', :git => "https://github.com/Quick/Nimble" pod 'Quick', :git => 'https://github.com/Quick/Quick', :tag => 'v0.2.1' end
pod update
を実行。