gpt4 book ai didi

ios - ios应用程序 "knows"如何运行单元测试

转载 作者:行者123 更新时间:2023-12-02 02:47:13 28 4
gpt4 key购买 nike

我知道我可以使用 xcodebuild 启动应用程序的单元测试,但我想知道什么告诉应用程序在启动期间运行测试,它是发送给应用程序的特殊参数还是它为了运行测试(使用 XCTest)进行不同的编译?

最佳答案

Xcode 使用 xctestRunTargetUnitTests 脚本(来自 /Developer/Tools/RunTargetUnitTests)进行单元测试。

xctest动态库(测试套件,其工作具有单独的线程)注入(inject)到您的二进制文件中,注入(inject)使dylib可以访问您的进程内存(它可以访问进程内存中的类/实例),并且能够执行调用并进行单元测试。从调试器接收来自设备/模拟器的回调(没有用于单元测试的特殊技术)。

简单地说:带有测试方案的项目照常编译,但它链接了动态库,该动态库将木马您的进程内存,并进行测试。

还有非常有用的信息:

RunUnitTests 接受ENVIRONMENT 变量,以下是其中一些有趣的

TEST_HOST - 要“注入(inject)”的可执行文件的完整路径指定的单元测试包。对于申请,这必须是完整的应用程序在其包装器内的路径。不要为框架设置此项作品或图书馆。

TEST_RIG - 用作测试装备的可执行文件的完整路径CPlusTestRig 或 otest。可执行文件必须采用路径将测试包作为其最终参数。它的 DYLD_FRAMEWORK_PATH 和DYLD_LIBRARY_PATH 将配置为指向 BUILT_PRODUCTS_DIR在执行之前。如果您使用的是默认值之一,请不要设置此项测试设备。

还有
BUNDLE_LOADER 用作链接器选项,指示链接器将测试动态库链接到指定的二进制文件中。

测试包目标模板在最后有一个调用 /Developer/Tools/RunUnitTests 的 shell 脚本构建阶段。 RunUnitTests 查看通过其环境传递的build设置,并根据该信息确定如何在测试包中运行测试。

如果您正在测试框架,RunUnitTests 将运行适当的测试装备并告诉它加载并运行 bundle 中的测试。由于您的测试包应该链接到您的框架,因此当测试装备加载您的包时,您的框架将被加载。

如果您正在测试应用程序,则需要在其配置的build设置中将该应用程序指定为测试包的测试主机和包加载器。 Bundle Loader 设置告诉链接器将您的包链接到加载它的应用程序,就好像应用程序是一个框架一样,允许您从包中引用应用程序中的类和其他符号,而无需实际将它们包含在包中。测试主机设置告诉 RunUnitTests 启动指定的应用程序并将测试包注入(inject)其中以运行其测试。

有关详细信息,请参阅 RunTargetUnitTests/xctestman

https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man1/RunTargetUnitTests.1.html#//apple_ref/doc/man/1/RunTargetUnitTests

https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man1/xctest.1.html

这是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`fiif [ "${ARCHS}" = "" ]; then    ARCHS=`arch`fiif [ "${DEVELOPER_DIR}" = "" ]; then    DEVELOPER_DIR="${SYSTEM_DEVELOPER_DIR}"fi if [ "${OTEST}" = "" ]; then    OTEST="${DEVELOPER_DIR}/Tools/otest"fiif [ "${OTEST_TARGET}" = "" ]; then    OTEST_TARGET="${BUILT_PRODUCTS_DIR}/${FULL_PRODUCT_NAME}"fiRunTargetUnitTestsForArch() {    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    donefi

关于ios - ios应用程序 "knows"如何运行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24934083/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com