如何使用ios应用程序;“知道”;运行单元测试
我知道我可以使用如何使用ios应用程序;“知道”;运行单元测试,ios,objective-c,unit-testing,xcode5,xctest,Ios,Objective C,Unit Testing,Xcode5,Xctest,我知道我可以使用xcodebuild启动我的应用程序的单元测试,但我想知道是什么告诉应用程序在启动期间运行测试,是发送给应用程序的特殊参数,还是为了运行测试(使用XCTest)而对其进行了不同的编译?Xcode使用xtest和RunTargetUnitTests脚本(来自/Developer/Tools/RunTargetUnitTests)进行单元测试 xtest将dynamic library(测试工具包,它有单独的线程用于其作业)注入到二进制文件中,注入使dylib能够访问进程内存(它可以
xcodebuild
启动我的应用程序的单元测试,但我想知道是什么告诉应用程序在启动期间运行测试,是发送给应用程序的特殊参数,还是为了运行测试(使用XCTest)而对其进行了不同的编译?Xcode使用xtest
和RunTargetUnitTests
脚本(来自/Developer/Tools/RunTargetUnitTests
)进行单元测试
xtest
将dynamic library
(测试工具包,它有单独的线程用于其作业)注入到二进制文件中,注入使dylib
能够访问进程内存(它可以访问进程内存中的类/实例),并且它能够执行调用和进行单元测试。来自设备/模拟器的回调是从调试器接收的(没有单元测试的特殊技术)
简单地说:testscheme
的项目像往常一样编译,但是它链接了动态库,它会在进程内存中安装特洛伊木马,并进行测试
还有一些非常有用的信息:
RunUnitTests
接受环境变量,下面是一些有趣的变量
TEST\u HOST
-可执行文件的完整路径,可将
指定的单元测试包。对于应用程序,这必须是完整的
应用程序包装器中的应用程序路径。不要将此设置为帧
作品或图书馆
TEST\u-RIG
-要用作测试装备的可执行文件的完整路径
属于CPlusterig或otest的。可执行文件必须采用路径
将测试包作为其最终参数。其动态框架和路径
DYLD_库路径将配置为指向内置产品目录
在执行之前。如果使用的是默认设置之一,则不要设置此选项
试验台
也
BUNDLE\u LOADER
用作链接器选项,它指示链接器将测试动态库
链接到指定的二进制文件中
测试包目标模板在最后有一个shell脚本构建阶段,该阶段调用/Developer/Tools/RunUnitTests
。RunUnitTests查看通过其环境传递的构建设置,并根据这些信息确定如何在测试包中运行测试
如果您正在测试一个框架,RunUnitTests将运行适当的测试装备,并告诉它加载并运行捆绑包中的测试。因为您的测试包应该链接到您的框架,所以当测试装备加载您的包时,您的框架将被加载
如果您正在测试应用程序,则需要在其配置的构建设置中将该应用程序指定为测试包的测试主机和包加载程序。Bundle Loader设置告诉链接器将您的Bundle与加载它的应用程序链接起来,就像应用程序是一个框架一样,允许您从Bundle中引用应用程序中的类和其他符号,而不实际将它们包含在Bundle中。测试主机设置告诉RunUnitTests启动指定的应用程序,并将测试包注入其中以运行其测试
有关更多信息,请参见RunTargetUnitTests
/xctest
以下是RunTargetUnitTests
脚本
#!/bin/sh
#
# Copyright (c) 2005-2013 Apple Inc. All rights reserved.
#
# Copyright (c) 1997-2005, Sen:te (Sente SA). All rights reserved.
#
# Use of this source code is governed by the following license:
#
# Redistribution and use in source and binary forms, with or without modification,
# are permitted provided that the following conditions are met:
#
# (1) Redistributions of source code must retain the above copyright notice,
# this list of conditions and the following disclaimer.
#
# (2) Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL Sente SA OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
# OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# Note: this license is equivalent to the FreeBSD license.
#
# This notice may not be removed from this file.
if [ "${NATIVE_ARCH_ACTUAL}" = "" ]; then
NATIVE_ARCH_ACTUAL=`arch`
fi
if [ "${ARCHS}" = "" ]; then
ARCHS=`arch`
fi
if [ "${DEVELOPER_DIR}" = "" ]; then
DEVELOPER_DIR="${SYSTEM_DEVELOPER_DIR}"
fi
if [ "${OTEST}" = "" ]; then
OTEST="${DEVELOPER_DIR}/Tools/otest"
fi
if [ "${OTEST_TARGET}" = "" ]; then
OTEST_TARGET="${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}"
fi
RunTargetUnitTestsForArch() {
echo "${DEVELOPER_DIR}/Tools/RunTargetUnitTests:0: note: Starting tests for ${1}"
if [ "${DYLD_FRAMEWORK_PATH}" = "" ] ; then
DYLD_FRAMEWORK_PATH="${BUILT_PRODUCTS_DIR}:${DEVELOPER_DIR}/Library/Frameworks"
else
DYLD_FRAMEWORK_PATH="${BUILT_PRODUCTS_DIR}:${DEVELOPER_DIR}/Library/Frameworks:${DYLD_FRAMEWORK_PATH}"
fi
export DYLD_FRAMEWORK_PATH
echo "OTEST=${OTEST}"
arch -arch "${1}" "${OTEST}" "${OTEST_TARGET}"
unset DYLD_FRAMEWORK_PATH
echo "${DEVELOPER_DIR}/Tools/RunTargetUnitTests:0: note: Completed tests for ${1}"
}
SkipTargetUnitTestsForArch() {
echo "${DEVELOPER_DIR}/Tools/RunTargetUnitTests:0: note: Skipped tests for ${1}"
}
if [ "${TEST_AFTER_BUILD}" = "YES" ]; then
# Run the unit tests once per requested and supported architecture.
for TEST_ARCH in ${ARCHS}; do
case "${NATIVE_ARCH_ACTUAL}" in
i386)
if [ "${TEST_ARCH}" = "i386" ]; then
RunTargetUnitTestsForArch "${TEST_ARCH}"
else
SkipTargetUnitTestsForArch "${TEST_ARCH}"
fi
;;
x86_64)
if [ "${TEST_ARCH}" = "i386" -o "${TEST_ARCH}" = "x86_64" ]; then
RunTargetUnitTestsForArch "${TEST_ARCH}"
else
SkipTargetUnitTestsForArch "${TEST_ARCH}"
fi
;;
*)
RunTargetUnitTestsForArch "${TEST_ARCH}"
;;
esac
done
fi
#!/垃圾箱/垃圾箱
#
#版权所有(c)2005-2013苹果公司。保留所有权利。
#
#版权所有(c)1997-2005,Sen:te(Sente SA)。版权所有。
#
#此源代码的使用受以下许可证的约束:
#
#以源代码和二进制形式重新分发和使用,无论是否修改,
#如果满足以下条件,则允许:
#
#(1)源代码的重新分发必须保留上述版权声明,
#此条件列表和以下免责声明。
#
#(2)二进制形式的再分配必须复制上述版权声明,
#此条件列表和文档中的以下免责声明
#和/或分发时提供的其他材料。
#
#本软件由版权所有者和贡献者“按原样”提供
#以及任何明示或暗示的保证,包括但不限于
#对适销性和特定用途的适用性的保证不予承认。
#在任何情况下,Sente SA或出资人均不对任何直接、间接、附带、,
#特殊、惩戒性或后果性损害(包括但不限于采购
#替代商品或服务的损失;使用、数据或利润的损失;或业务中断)
#无论是何种原因造成的,以及基于任何责任理论,无论是在合同中,还是在严格责任中,
#或因使用本软件而产生的侵权行为(包括疏忽或其他),
#即使被告知可能发生此类损坏。
#
#注意:此许可证等同于FreeBSD许可证。
#
#此通知不能从此文件中删除。
如果[“${NATIVE_ARCH_ACTUAL}”=”;然后
本机_ARCH_实际值=`ARCH`
fi
如果[“${ARCHS}”=”;然后
拱门=‘拱门’`
fi
如果[“${DEVELOPER_DIR}”=”;然后
DEVELOPER\u DIR=“${SYSTEM\u DEVELOPER\u DIR}”
fi
如果[“${OTEST}”=”;然后
OTEST=“${DEVELOPER\u DIR}/Tools/OTEST”
fi
如果[“${OTEST_TARGET}”=”;然后
OTEST_TARGET=“${build_PRODUCTS_DIR}/${FULL_PRODUCTS_NAME}”
fi
RunTargetUnitTestsFarch(){
echo“${DEVELOPER\u DIR}/Tools/RunTargetUnitTests:0:注意:正在为${1}启动测试”
如果[“${DYLD_FRAMEWORK_PATH}”=”;则
DYLD_FRAMEWORK_PATH=“${builded_PRODUCTS_DIR}:${DEVELOPER_DIR}/Library/Frameworks”
其他的
DYLD_FRAMEWORK_PATH=“${builded_PRODUCTS_DIR}:${DEVELOPER_DIR}/Library/Frameworks:${DYLD_FRAMEWORK_PATH}”
fi
导出动态框架路径
回显“OTEST=${OTEST}”
arch-arch“${1}”“${OTEST}”“${OTEST_TARGET}”
未设置动态框架路径
echo“${DEVELOPER_DIR}/Tools/RunTargetUnitTests:0:注意:已完成对${1}的测试”
}
斯基普塔尔根
WaxSim \
-e DYLD_INSERT_LIBRARIES="$INJECTION_FRAMEWORK_PATH" \
-e XCInjectBundle="MyApp.octest" \
-e XCInjectBundleInto="MyApp.app/MyApp" \
MyApp.app \
-SenTest All
XCODE_PATH=$( xcode-select --print-path )
PLATFORM_PATH="$XCODE_PATH/Platforms/iPhoneSimulator.platform"
INJECTION_FRAMEWORK_PATH="$PLATFORM_PATH/Developer/Library/PrivateFrameworks/IDEBundleInjection.framework/IDEBundleInjection"