I have an iOS application, and I want to put it in continuous integration. The strategy I'm using to do that is trying to run the tests from the command line.
I'm trying to do it using the following script:
TRACETEMPLATE="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Instruments/PlugIns/AutomationInstrument.bundle/Contents/Resources/Automation.tracetemplate"
instruments -t $TRACETEMPLATE build/Release-iphonesimulator/MyApp.app -e UIACSCRIPT "UnitTests/SomeTest.js"
SomeTest.js is a simple javascript file that I can run in Instrumentation inside Xcode and it works. I build my application using:
xcodebuild -alltargets -sdk iphonesimulator5.1
and this generates the MyApp.app. I can run the application from Xcode in the simulator just fine, however, when I try to run by the instruments, I get a box saying that there is an unknown error and in the command line it prints:
2012-05-15 15:32:59.928 instruments[17548:1d03] Recording cancelled : At least one target failed to launch; aborting run
Instruments Trace Error : Failed to start trace.
Can anyone give me any help/suggestions about what might be happening and how can I fix this?
Also, it always open the iPad simulator? Can I make it that it opens any simulator I want?
I was getting this same error and nearly pulled my hair out trying to solve it. The error messages are completely unhelpful.
What ended up being the problem for me was the .app file that I was pointing to. Once I found the "right" .app file that was deeply buried in the 5.1 Simulator folder, I was able to finally run UIAutomation tests from the command line with Xcode 4.3.
The path to the .app that worked for me:
~/Library/Application\ Support/iPhone\ Simulator/5.1/Applications/{string-of-numbers-and-letters}/MyApp.app/
Here is the full command I'm using to run UIAutomation tests from the command line with Xcode 4.3:
instruments -t /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/Instruments/PlugIns/AutomationInstrument.bundle/Contents/Resources/Automation.tracetemplate ~/Library/Application\ Support/iPhone\ Simulator/5.1/Applications/{string-of-numbers-and-letters}/MyApp.app/ -e UIASCRIPT /Path/To/TestFile.js
Hope this helps someone else, as the documentation out there for this is extremely lacking.
Update
Note that as of Xcode 4.5.2, the automation template location has changed from that on my original answer:
/Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/PlugIns/AutomationInstrument.bundle/Contents/Resources/Automation.tracetemplate
The correct location of the Automation.tracetemplate, as of Xcode 4.5.2, is /Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/PlugIns/AutomationInstrument.bundle/Contents/Resources/Automation.tracetemplate
The paths for the command line invocation of UIAutomation has changed slightly over the past couple of years. I have written a few bash shell scripts that work together which can launch your UIAutomation test file in a way that works with Xcode 4.4.1.
See this gist: https://gist.github.com/3605692#comments
In a nutshell, the key command ends up being:
instruments -t $INSTRUMENTS_TEMPLATE $APP_PATH -e UIASCRIPT $SCRIPT_PATH -e UIARESULTSPATH $RESULTS_PATH
My scripts show the variable substitutions needed. The other benefit is that iOS simulator apps have often changing GUID as part of their path. My script will find them, so you don't have to hard code the temporary GUID in your builds / scripts / command line invocations.
sorry, my english is very bad.
As the easiest way to run this script from Teamtsity? Each assembly - the numbers and letters are different.
Not the easiest way:
clean the simulator prior to assembly
find the folder with the program, and it contains these numbers and letters, written in the variable.
This variable, such as writing the script.
Maybe there's a way easier to take from these numbers?
The Build Configuration should be debug than Release. That was the reason for the error in my case.
You can change Build Configuration in 'Edit Schemes' and by choosing the Profile tab. Verify that build tab also is in debug mode.
I did the ps command to see which processes are running. I found that instruments was still running. I then did killall instruments and that killed the instruments process. I then did my instruments command and it worked perfect after that.
Related
While I'm running UITests on Simulator with Xcode 7, it's failed when invoking XCUIApplication().launch() with App accessibility isn't loaded
this is a known bug in Xcode bot, usually happens on large server code bases. It's already been filed by Apple Developers (myself as well), and they're 'fixing' it.
Hope this helps.
If you run tests inside CI system under your control, you could possibly reset simulators before running the UI tests. That way the bug is workarounded.
You could reset simulators from command line with following command:
xcrun simctl list | awk -F "[()]" '{ for (i=2; i<NF; i+=2) print $i }' | grep '^[-A-Z0-9]*$' | xargs -I uuid xcrun simctl erase uuid
As pointed in this SO thread you could also use(however I didn't try it):
xcrun simctl erase all
Restarting the device got rid of this issue for me. (I was using a real device not a simulator)
I got this error following a crash in the test app in CI. In my case, I successfully reproduced the issue locally, then it was easy to see that it crashes (a crash alert appears) and to investigate and fix the error.
In my case the alert was also written to stderr, but on the CI it was not redirected to the logs. If I couldn't repro locally, my next step was to find a way to redirect stderr & stdout to logs.
I want to build, run and publish iOS7 app using the command line tool. I am not getting any good sources for it. Can someone help me out with a good tutorial which will help me in writing a shell script to build my xcode project through command line and not through xcode build option.
Apple has a well documented tutorial on this :
https://developer.apple.com/library/ios/technotes/tn2339/_index.html
The build command goes like this :
xcodebuild -scheme MyiOSApp build
Is there a way to see the xcodebuild command that Xode uses for building?
I have created a library file with Xcodebuild command from Terminal. But there are some differences between the files generated from terminal and Xcode UI.
I use this behavior to switch to the log when building starts.
.
In the log you can find all the commands Xcode is executing.
I have used this below command to run automation template using instruments.
instruments -t /Applications/xcode5.0.2/Xcode.app/Contents/Applications/Instruments.app/Contents/PlugIns/AutomationInstrument.bundle/Contents/Resources/Automation.tracetemplate ~/Library/Application\ Support/iPhone\ Simulator/7.1/Applications/93F12976-0667-4180-904A-95ECA172C78C/myapp.app -e UIASCRIPT /Users/myUserName/Desktop/TestScript.js
This command is able to open the simulator and my app in the simulator but, its not running the TestScript.js file, because when this file is loaded into instruments its adding up escape sequences in my code, which is ruining my code and not allowing to run the script.
did anybody face this issue before?
Or any body has any suggestion on running instruments using terminal.
I know starting from Xcode 4.2 it is possible to run UIAutomation scripts through command line. I've tried this and is working perfectly fine for me in simulator. I'd like to know how to get this run in an actual device.I searched and got the command for running on device as,
instruments -w <device_id> -t /Developer/Platforms/iPhoneOS.platform/Developer/Library/Instruments/PlugIns/AutomationInstrument.bundle/Contents/Resources/Automation.tracetemplate
application -e UIASCRIPT
script -e UIARESULTSPATH <results path>
What exactly should I give in the application, is it the path to ipa or something else?
Advance Thanks
You need to give it the path to the .ipa file. It actualy only needs the app name so you can just pass in the app name.
Very Important : The app needs to be installed on the device, Instruments will not install the app on the device, it will only run a installed app on the device