Create a gist now

Instantly share code, notes, and snippets.

A slightly modified XcodeTest build script that works for projects with Kiwi installed via CocoaPods (that use workspaces).
#!/bin/bash
# Script to compile and run unit tests from the command line
# The scheme and target name of the main app
MAIN_APP_TARGET="$1"
# The scheme and target name of the unit tests
UNIT_TEST_TARGET="$2"
# The path to libXcodeTest.a, if not in current directory
PATH_TO_XCODE_TEST_LIB="$3"
# Output variable defaults to current directory of not specified
LINK_TO_XCODE_TEST_LIB=""
if [[ "${PATH_TO_XCODE_TEST_LIB}" != "" ]]; then
XCODE_TEST_ABS_LIB_PATH="${PWD}/${PATH_TO_XCODE_TEST_LIB}"
LINK_TO_XCODE_TEST_LIB="-lXcodeTest -L \"${XCODE_TEST_ABS_LIB_PATH}\""
else
CURRENT_PATH="${PWD}"
LINK_TO_XCODE_TEST_LIB="-lXcodeTest -L\"${CURRENT_PATH}\""
fi
# Calculate the variables to feed into the build
OUTPUT_DIR="/tmp/xcodetest/${MAIN_APP_TARGET}"
XCODE_TEST_PATH="${OUTPUT_DIR}/${UNIT_TEST_TARGET}.octest/${UNIT_TEST_TARGET}"
XCODE_TEST_LDFLAGS="-ObjC -framework SenTestingKit ${LINK_TO_XCODE_TEST_LIB} -F \"$\(SDKROOT\)/Developer/Library/Frameworks\""
# More reliable if the simulator is not already running
osascript -e 'tell app "iPhone Simulator" to quit'
# Build the unit tests bundle, so it can be fed into waxsim
echo "========================="
echo "Building unit test bundle"
echo "========================="
echo "xcodebuild -sdk iphonesimulator -scheme ${UNIT_TEST_TARGET} build CONFIGURATION_BUILD_DIR=\"${OUTPUT_DIR}\""
echo "========================="
xcodebuild -sdk iphonesimulator -workspace "${MAIN_APP_TARGET}.xcworkspace" -scheme "${UNIT_TEST_TARGET}" ONLY_ACTIVE_ARCH=NO build CONFIGURATION_BUILD_DIR="${OUTPUT_DIR}"
if [[ $? != 0 ]]; then
echo "Failed to build unit tests!"
exit $?
fi
# Build the main app, with libXcodeTest.a linked in
echo "==========================="
echo "Building app with xcodetest"
echo "==========================="
echo "xcodebuild -sdk iphonesimulator -scheme ${MAIN_APP_TARGET} build CONFIGURATION_BUILD_DIR=\"${OUTPUT_DIR}\" XCODE_TEST_LDFLAGS=\"${XCODE_TEST_LDFLAGS}\""
echo "==========================="
xcodebuild -sdk iphonesimulator -workspace "${MAIN_APP_TARGET}.xcworkspace" -scheme "${MAIN_APP_TARGET}" ONLY_ACTIVE_ARCH=NO build CONFIGURATION_BUILD_DIR="${OUTPUT_DIR}" XCODE_TEST_LDFLAGS="${XCODE_TEST_LDFLAGS}"
if [[ $? != 0 ]]; then
echo "Failed to build app!"
exit $?
fi
# Check that waxsim is installed, used to run the app in the simulator
which waxsim
if [[ $? != 0 ]]; then
echo "Could not find 'waxsim', make sure it is installed and try again"
exit $?
fi
# Warn users that it wont run the tests unless you tweak the linker settings
echo "================="
echo "If tests do not run, make sure you have included XCODE_TEST_LDFLAGS in your linker flags:"
echo " In xcconfigs: OTHER_LDFLAGS = \$(inherited) \$(XCODE_TEST_LDFLAGS)"
echo " In Xcode: set Other Linker Flags to include \$(XCODE_TEST_LDFLAGS)"
echo "================="
# Run the app in the simulator, will automatically load and run unit tests
OUT_FILE="${OUTPUT_DIR}/waxsim.out"
XCODE_TEST_PATH="${XCODE_TEST_PATH}" waxsim "${OUTPUT_DIR}/${MAIN_APP_TARGET}.app" -SenTest All > "${OUT_FILE}" 2>&1
cat "${OUT_FILE}"
osascript -e 'tell app "iPhone Simulator" to quit'
# if there was a failure, show what waxsim was hiding and crucially return with a non-zero exit code
grep -q ": error:" "$OUT_FILE"
success=`exec grep -c ": error:" $OUT_FILE`
if [[ $success != 0 ]]; then
echo "================="
echo "Unit Tests Failed"
echo "================="
exit 1
else
echo "================="
echo "Unit Tests Passed"
echo "================="
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment