test - xcode appium
Ejecutando scripts UIAutomation desde Xcode (6)
Eche un vistazo a este tutorial que explica cómo realizar pruebas automatizadas de IU con Jenkins. Aunque también usa Jasmine en el tutorial. http://shaune.com.au/automated-ui-testing-for-ios-apps-uiautomation-jasmine-jenkins/ espero que esto ayude. Tiene un archivo de proyecto de ejemplo para que pueda descargarlo como plantilla. Espero que esto ayude.
¿Alguien logró configurar las pruebas automatizadas de automatización UIA en Xcode?
Estoy intentando configurar un objetivo en mi proyecto Xcode que debería ejecutar todos los scripts de UIAutomation que preparé. Actualmente, la única fase de compilación de este objetivo es este bloque de secuencia de comandos de ejecución :
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
Cuando construyo este objetivo, tiene éxito después de unos segundos, pero la secuencia de comandos no se ejecutó realmente. En el registro de compilación obtengo estos errores:
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)
Estoy bastante seguro de que mi javascript y mi script de ejecución son correctos, porque si ejecuto exactamente el mismo comando de instrumentos en bash, funciona como se esperaba. ¿Podría ser esto un error en Xcode?
En XCode: si carga el organizador (XCode-> Window-> Organizer)
Luego seleccione su máquina en dispositivos -> ''Habilitar modo de desarrollador''
Esto debería eliminar la necesidad de indicaciones con los instrumentos.
Finalmente encontré una solución para este problema. Parece que Xcode está ejecutando los scripts de ejecución con derechos limitados. No estoy del todo seguro, lo que hace que falle el comando de instrumentos, pero usar su
para cambiar a su usuario lo solucionará.
su $USER -l -c <instruments command>
Obviamente, esto le pedirá su contraseña, pero no puede ingresarla cuando se ejecuta como un script. No encontré una manera de especificar la contraseña para su
, sin embargo, si la ejecuta como root, no tiene que especificar una. Afortunadamente, sudo
puede aceptar una contraseña a través de la tubería:
echo <password> | sudo -S su $USER -l -c <instruments command>
Si no desea codificar su contraseña (siempre es una mala idea), puede usar algo de AppleScript para solicitar la contraseña.
Publiqué el script resultante a continuación. Copie eso a un archivo * .sh en su proyecto y ejecute ese script desde un script de ejecución.
#!/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
Parece que esto realmente podría ser un problema de Xcode; En cualquier caso, al menos una persona ha presentado un informe de Radar al respecto . Alguien en este otro hilo dice que puedes evitar esta excepción desconectando cualquier iDevices que esté actualmente conectado a la computadora, pero sospecho que no se aplica cuando intentas ejecutar el script como un destino de Xcode.
Yo sugeriría también presentar un informe de Radar ; Puede obtener más detalles sobre el tema de Apple, o al menos convencerlos de que muchas personas tienen el problema y deberían averiguar qué sucede.
Lo siento por una respuesta no muy útil (debería haber sido un comentario, pero los comentarios y los enlaces / formatos no se mezclan muy bien). Por favor, actualice esta pregunta con cualquier cosa que encuentre sobre el problema.
Tarde en el juego, pero tengo una solución que funciona para Xcode 5.1. No sé si eso es lo que rompió la solución anterior o no. Con la solución anterior todavía estaba recibiendo:
Failed to load Mobile Device Locator plugin, etc.
Sin embargo, esto funciona para la versión de lanzamiento de Xcode 5.1.
echo <password> | sudo -S -u username xcrun instruments
Observe que eliminé el comando sune innecesario y agregué el comando xcrun. El xcrun era la magia que se necesitaba.
Aquí está mi comando completo:
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"
Por cierto si escribes:
instruments -s devices
obtendrá una lista de todos los dispositivos compatibles que puede usar para la opción -w.
Editar: Para que esto funcione para diferentes personas que revisan el proyecto, reemplace lo siguiente:
echo <password> | sudo -S -u username xcrun instruments
con
sudo -u ${USER} xcrun instruments
Ya que solo estás haciendo un sudo para el mismo usuario, no se requiere contraseña.
Nota: esta no es una respuesta directa a la pregunta, pero es una solución alternativa al problema subyacente.
Mientras buscaba información detallada sobre la automatización de UIA, me topé con un marco de trabajo llamado Square (Mantenerlo funcional). Es un marco de pruebas de integración que permite muchas de las mismas características que la UIAutomation, pero lo bueno es que puedes escribir tus pruebas de integración en Objective-C.
Es muy fácil de configurar (a través de CocoaPods), también tienen buenos ejemplos, y lo mejor es que es muy fácil de configurar con su sistema de CI como Jenkins.
Eche un vistazo a: http://github.com/square/KIF