20

Xcode で自動化された UIAutomation テストのセットアップに成功した人はいますか?

Xcode プロジェクトで、準備したすべての UIAutomation スクリプトを実行するターゲットを設定しようとしています。現在、このターゲットの唯一のビルド フェーズは、このRun Scriptブロックです。

TEMPLATE="/Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/PlugIns/AutomationInstrument.bundle/Contents/Resources/Automation.tracetemplate"
MY_APP="/Users/Me/Library/Application Support/iPhone Simulator/6.0/Applications/564ED15A-A435-422B-82C4-5AE7DBBC27DD/MyApp.app"
RESULTS="/Users/Me/Projects/MyApp/Tests/UI/Traces/Automation.trace"
SCRIPT="/Users/Me/Projects/MyApp/Tests/UI/SomeTest.js"
instruments -t $TEMPLATE $MY_APP -e UIASCRIPT $SCRIPT -e UIARESULTSPATH $RESULTS

このターゲットをビルドすると、数秒後に成功しますが、スクリプトは実際には実行されませんでした。ビルド ログに次のエラーが表示されます。

instruments[7222:707] Failed to load Mobile Device Locator plugin
instruments[7222:707] Failed to load Simulator Local Device Locator plugin
instruments[7222:707] Automation Instrument ran into an exception while trying to run the script.  UIATargetHasGoneAWOLException
+0000 Fail: An error occurred while trying to run the script.
Instruments Trace Complete (Duration : 1.077379s; Output : /Users/Me/Projects/MyApp/Tests/UI/Traces/Automation.trace)

私のjavascriptと実行スクリプトはどちらも正しいと確信しています.bashでまったく同じinstrumentsコマンドを実行すると、期待どおりに動作するからです。これは Xcode のバグでしょうか?

4

6 に答える 6

4

私はついにこの問題の解決策を見つけました。Xcode が実行スクリプトを限られた権限で実行しているようです。インストルメント コマンドが失敗する原因は完全にはわかりませんが、使用suしてユーザーに変更すると修正されます。

su $USER -l -c <instruments command>

明らかに、これはパスワードを要求しますが、スクリプトとして実行しているときはパスワードを入力できません。のパスワードを指定する方法が見つかりませんでしたがsu、root として実行する場合は指定する必要はありません。幸いなsudoことに、パイプ経由でパスワードを受け入れることができます。

echo <password> | sudo -S su $USER -l -c <instruments command>

パスワードをハードコーディングしたくない場合 (常に悪い考えです)、AppleScript を使用してパスワードを要求することができます。

結果のスクリプトを以下に投稿しました。それをプロジェクトの *.sh ファイルにコピーし、スクリプトの実行からそのスクリプトを実行します。

#!/bin/bash

# This script should run all (currently only one) tests, independently from
# where it is called from (terminal, or Xcode Run Script).

# REQUIREMENTS: This script has to be located in the same folder as all the
# UIAutomation tests. Additionally, a *.tracetemplate file has to be present
# in the same folder. This can be created with Instruments (Save as template...)

# The following variables have to be configured:
EXECUTABLE="TestApp.app"

# Optional. If not set, you will be prompted for the password.
#PASSWORD="password"

# Find the test folder (this script has to be located in the same folder).
ROOT="$( cd -P "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

# Prepare all the required args for instruments.
TEMPLATE=`find $ROOT -name '*.tracetemplate'`
EXECUTABLE=`find ~/Library/Application\ Support/iPhone\ Simulator | grep "${EXECUTABLE}$"`
SCRIPTS=`find $ROOT -name '*.js'`

# Prepare traces folder
TRACES="${ROOT}/Traces/`date +%Y-%m-%d_%H-%M-%S`"
mkdir -p "$TRACES"

# Get the name of the user we should use to run Instruments.
# Currently this is done, by getting the owner of the folder containing this script.
USERNAME=`ls -l "${ROOT}/.." | grep \`basename "$ROOT"\` | awk '{print $3}'`

# Bring simulator window to front. Depending on the localization, the name is different.
osascript -e 'try
    tell application "iOS Simulator" to activate
on error
    tell application "iOS-Simulator" to activate
end try'

# Prepare an Apple Script that promts for the password.
PASS_SCRIPT="tell application \"System Events\"
activate
display dialog \"Password for user $USER:\" default answer \"\" with hidden answer
text returned of the result
end tell"

# If the password is not set directly in this script, show the password prompt window.
if [ -z "$PASSWORD" ]; then
    PASSWORD=`osascript -e "$PASS_SCRIPT"`
fi

# Run all the tests.
for SCRIPT in $SCRIPTS; do
    echo -e "\nRunning test script $SCRIPT"
    COMMAND="instruments -t \"$TEMPLATE\" \"$EXECUTABLE\" -e UIASCRIPT \"$SCRIPT\""
    COMMAND="echo '$PASSWORD' | sudo -S su $USER -l -c '$COMMAND'"
    echo "$COMMAND"
    eval $COMMAND > results.log

    SCRIPTNAME=`basename "$SCRIPT"`
    TRACENAME=`echo "$SCRIPTNAME" | sed 's_\.js$_.trace_g'`
    mv *.trace "${TRACES}/${TRACENAME}"

    if [ `grep " Fail: " results.log | wc -l` -gt 0 ]; then
        echo "Test ${SCRIPTNAME} failed. See trace for details."
        open "${TRACES}/${TRACENAME}"
        exit 1
        break
    fi

done

rm results.log
于 2013-01-04T17:05:48.307 に答える
1

注: これは質問に対する直接的な回答ではありませんが、根本的な問題に対する別の解決策です。

UIAutomation に関する詳細な情報を検索しているときに、KIF (Keep itfunctional) と呼ばれる Square のフレームワークに出くわしました。これは、UIAutomation と同じ機能の多くを可能にする統合テスト フレームワークですが、Objective-C で統合テストを書くだけでよいという点が優れています。

(CocoaPods を使用して) セットアップが非常に簡単で、良い例もあり、Jenkins のような CI システムで簡単にセットアップできることが最も良い点です。

見てください:http://github.com/square/KIF

于 2013-02-02T09:45:45.717 に答える
1

ゲームには遅れていますが、Xcode 5.1 で動作するソリューションがあります。それが上記の解決策を破ったかどうかはわかりません。古いソリューションでは、私はまだ得ていました:

Failed to load Mobile Device Locator plugin, etc.

ただし、これは Xcode 5.1 のリリース バージョンでは機能します。

echo <password> | sudo -S -u username xcrun instruments

不要な su コマンドを削除し、xcrun コマンドを追加したことに注意してください。xcrun は必要な魔法でした。

これが私の完全なコマンドです:

echo <password> | sudo -S -u username xcrun instruments\ 
  -w "iPhone Retina (3.5-inch) - Simulator - iOS 7.1"\
  -D "${PROJECT_DIR}/TestResults/Traces/Traces.trace"\
  -t "${DEVELOPER_DIR}/Instruments.app/Contents/PlugIns/AutomationInstrument.bundle/Contents/Resources/Automation.tracetemplate"\
  "${BUILT_PRODUCTS_DIR}/MyApp.app"\
  -e UIARESULTSPATH "${PROJECT_DIR}/TestResults"\
  -e UIASCRIPT "${PROJECT_DIR}/UITests/main.js"

ちなみに、次のように入力すると:

instruments -s devices

-w オプションで使用できる、サポートされているすべてのデバイスのリストが表示されます。

編集:プロジェクトをチェックアウトしているさまざまな人々に対してこれを機能させるには、次を置き換えます。

echo <password> | sudo -S -u username xcrun instruments

sudo -u ${USER} xcrun instruments

同じユーザーに対して sudo を実行しているだけなので、パスワードは必要ありません。

于 2014-03-19T18:42:53.357 に答える
0

XCode - オーガナイザーをロードした場合 (XCode->Window->Organizer)

次に、デバイスの下でマシンを選択します->「開発者モードを有効にする」

これにより、インストゥルメントを使用したプロンプトの必要がなくなります。

于 2014-05-24T20:41:39.690 に答える
0

Jenkins を使用して自動化された UI テストを行う方法を説明するこのチュートリアルをご覧ください。ただし、チュートリアルではジャスミンも使用しています。http://shaune.com.au/automated-ui-testing-for-ios-apps-uiautomation-jasmine-jenkins/これがお役に立てば幸いです。サンプル プロジェクト ファイルが含まれているので、テンプレートとしてダウンロードできます。お役に立てれば。

于 2012-12-25T07:18:55.073 に答える