Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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

mokemokechicken
お気楽極楽会社員です。気ままに投稿しています。
sprocket
"Sprocket(スプロケット)は、Webサイトにおけるコンバージョン(購入・入会・資料請求・問合せ等)を増やしたい企業様向けに、自社開発のWeb接客ツールの導入及びコンバージョン改善コンサルティングを行っている会社です。 "
https://www.sprocket.bz/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away