Accessing user defined variables passed in from xcodebuild command line
Asked Answered
P

4

24

I am running my xctests using xcodebuild and need to pass in some environment variables. In the example below ACCOUNT_ID and HOST_URL.

I tried passing in the variables as both environment variable and accessing them from the test using getenv ("ACCOUNT_ID") xcodebuild -project CalculatorTestClient.xcodeproj -scheme CalculatorTestClient -destination '%s' ACCOUNT_ID=%s HOST_URL=%s test"

And passing them in as user defaults and accessing them using [[NSUserDefaults standardUserDefaults] valueForKey:@"HOST_URL"]; xcodebuild -project CalculatorTestClient.xcodeproj -scheme CalculatorTestClient -destination '%s' ACCOUNT_ID=%s HOST_URL=%s test"

Neither approach worked for me. What is easiest way to pass user defined variables from commandline?

Polytheism answered 25/4, 2014 at 5:30 Comment(1)
It seems not to be easy. Have a look here: blog.manbolo.com/2013/05/17/passing-user-variable-to-xcodebuildRima
C
60

Similar to @Paul Young I was able to get this to work, with a couple of modifications to the Scheme. Here's my solution:

For the Scheme in Xcode (Xcode > Your Scheme > Edit Scheme > Test > Arguments tab > Environment Variables):

Name Value
ACCOUNT_ID $(ACCOUNT_ID)
HOST_URL $(HOST_URL)

In Code (Swift 3):

let accountID = ProcessInfo.processInfo.environment["ACCOUNT_ID"]!
let hostURL = ProcessInfo.processInfo.environment["HOST_URL"]!

On the command line:

$ xcodebuild -project YourProject.xcodeproj \
-scheme "Your Scheme" \
-sdk iphonesimulator \
-destination 'platform=iOS Simulator,name=iPhone 7,OS=10.2' \
-derivedDataPath './output' \
ACCOUNT_ID='An Account ID' \
HOST_URL='www.hosturl.com' \
test

For iOS, make sure to do modify the scheme with the following:

  1. Uncheck the Use the Run action's arguments and environment variables
  2. Change the drop down "Expand Variables Based On" to the Test target in the Test scheme.
Crumb answered 27/2, 2017 at 22:22 Comment(10)
Does this work for OSX only too? I would appreciate a working solution for iOS.Sauncho
My solution is for iOS. This is how I pass in variables to my iOS UI testsCrumb
I have so much love for you right now. It took me a while to find this. Thanks! Exactly what I needed.Chorea
this works. this should be accepted answer @PolytheismHoxsie
I have not been able to get this to work for iOS. Is ends up just putting "$(ACCOUNT_ID) into the value instead of the passed in valueAccordingly
@Accordingly I had the same issue because I was running test-without-building but if you build first then run the test - it worksCrinoid
might help to specifically call out that you need to set the environment variable for the Scheme > Test .. not Scheme > Run (which is displayed by default) .. then it will be picked up.Skaggs
@Accordingly I could make it work to get the environment variable when uncheck the "Use the Run action's arguments and environment variables" as well ad change the drop down "Expand Variables Based On" to the UITest target in the Test scheme.Harrison
@BrunoBieri 's comment make sense, this answer should be accepted.Ribband
I had to use a different name when specifying the var in the xcode scheme: ACCOUNT_ID = $(ACCNT_ID). Not happy about it, thoughStonge
T
8

What I did for my case is I used the xcodebuild build-for-testing command and create the xctestrun file then using xcodebuild test-without-building to run the test . in this case you can change the xctestrun file which has the environment variables in its plist before running your test .

so you need to run a script by using PlistBuddy to change your plist environment keys . for example to add a key :

/usr/libexec/PlistBuddy -c "add :APPNAME-TARGETNAME:EnvironmentVariables:KEYNAME string 'VALUE'" "(Path to XCTestRun file)"
Tympanum answered 11/12, 2017 at 22:35 Comment(1)
Quite like this: stackoverflow.com/a/50004139Harrison
A
2

So far I've only been able to get this approach to work:

$ ACCOUNT_ID=foo HOST_URL=bar xcodebuild -project CalculatorTestClient.xcodeproj -scheme CalculatorTestClient clean test

and accessed them via:

NSDictionary *environment = [[NSProcessInfo processInfo] environment];
NSString *accountID = [environment objectForKey:@"ACCOUNT_ID"];
NSString *hostUrl = [environment objectForKey:@"HOST_URL"];
Arciniega answered 11/1, 2015 at 7:41 Comment(2)
Just noticed that this only works for me when targeting OS X, not iOS.Arciniega
Yes, my comment notes that it only worked for me when targeting OS X, not iOS.Arciniega
N
0

Maybe can try:

TEST_RUNNER_VAR1=xxx TEST_RUNNER_VAR2=xxx xcodebuild ... test ...
Nonexistence answered 11/5, 2024 at 3:50 Comment(2)
Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.Darice
This is documented in the man page of xcodebuild.Divergent

© 2022 - 2025 — McMap. All rights reserved.