Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Accessing user defined variables passed in from xcodebuild command line

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?

like image 263
wherewouldibe Avatar asked Apr 25 '14 05:04

wherewouldibe


3 Answers

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.
like image 124
atgrubb Avatar answered Nov 15 '22 16:11

atgrubb


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)"
like image 24
Maryam Fekri Avatar answered Nov 15 '22 16:11

Maryam Fekri


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"];
like image 21
Paul Young Avatar answered Nov 15 '22 14:11

Paul Young