LoginSignup
10
9

More than 5 years have passed since last update.

Command Line から iOS アプリのTestを実行する(2013/6)

Last updated at Posted at 2013-06-24

ググるとよく出てくる 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辺りです。

で、そこに下記のようなプログラムを置いておきます。

${SRCROOT}/scripts/run-tests.rb
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です。

10
9
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9