ググるとよく出てくる RunPlatformUnitTests
を書き換える方法はどうも上手くいかず、
私の環境だと Segmentation Fault
が出て解決できませんでした。
これから書く方法で、一応JenkinsでTestとReportの収集までできたのでメモしておきます。
環境メモ
- Mac OS X 10.8.4
- Xcode 4.6.3
概要
基本的には下記を参考にしています。
http://stackoverflow.com/questions/5403991/xcode-4-run-tests-from-the-command-line-xcodebuild/10823483#10823483
ただ、Schemeとか作らなくてもいけたので、色々シチュエーションによって違うのかもしれません。
# 私の場合はSchemeの変更が gitignore されていて都合が悪かったです。。
# とりあえず、無くても動いたのでShceme追加無しでやっています。
コマンドラインでTestを実行する
準備Install
Testや開発を実行するMacで ios-sim をInstallしておきます。
brew install ios-sim
テストされるProjectの設定変更
Xcodeで
「Targets=テストターゲット」 → 「Build Phases」 → 「Run Script」
で、
# Run the unit tests in this test bundle.
"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests"
となっているのを↓
/usr/bin/ruby ${SRCROOT}/scripts/run-tests.rb
に変更します。SRCROOT は XCode ProjectのRoot辺りです。
で、そこに下記のようなプログラムを置いておきます。
if ENV['SL_RUN_UNIT_TESTS'] then
launcher_path = "ios-sim"
test_bundle_path= File.join(ENV['BUILT_PRODUCTS_DIR'], "#{ENV['PRODUCT_NAME']}.#{ENV['WRAPPER_EXTENSION']}")
environment = {
'DYLD_INSERT_LIBRARIES' => "/../../Library/PrivateFrameworks/IDEBundleInjection.framework/IDEBundleInjection",
'XCInjectBundle' => test_bundle_path,
'XCInjectBundleInto' => ENV["TEST_HOST"]
}
environment_args = environment.collect { |key, value| "--setenv #{key}=\"#{value}\""}.join(" ")
app_test_host = File.dirname(ENV["TEST_HOST"])
system("#{launcher_path} launch \"#{app_test_host}\" #{environment_args} --args -SenTest All #{test_bundle_path}")
else
puts "SL_RUN_UNIT_TESTS not set - Did not run unit tests!"
end
Xcodeで Cmd
+U
で Testを実行してみて実行できればここまでの設定はOKです。
コマンドラインで実行してみる
プロジェクトのDIRで下記が実行できるかテストしてみます。
TEST_TARGET=<MyTestTarget>
/usr/bin/xcodebuild -sdk iphonesimulator -target $TEST_TARGET -configuration Debug clean build SL_RUN_UNIT_TESTS=YES
ちなみに上記の TEST_TARGET は Xcode の Targets に出てくる文字列です。
テストレポートの結果を集めなくて良ければ、
ここまでの対応でJenkinsのXcode Pluginで簡単に設定&実行できるようになったはずです。
Test結果のReportを作成する
このままだと report XML が作成されないので、
https://github.com/ciryon/OCUnit2JUnit
を導入します。
ただ、既存のSystem Ruby(1.8.7)では使えなかったので、
rbenv などで 1.9系などが入っている前提とします。
Install ocunit2junit
gem install ocunit2junit
Run Test & Report
先ほどの テスト実行をPIPEでocunit2junitに渡せば良いだけです。
Jenkins だと、Pluginとか使わずに Shell スクリプトとして実行することになるでしょう(他に方法あるのかな・・?)。
例えばこんな感じでOKです。
TEST_TARGET=<MyTestTarget>
source ~/.rbenv/rbenv.sh # rbenv 前提なので、rbenvを有効にする何かを実行します
/usr/bin/xcodebuild -sdk iphonesimulator -target $TEST_TARGET -configuration Debug clean build SL_RUN_UNIT_TESTS=YES 2>&1 | ocunit2junit
こうすると、ocunit2junit がtest-reports/
以下に XMLファイルを作成するので、Jenkinsで集めればOKです。