运行unittes时不要启动模拟器

Vic*_*nin 40 xcode ios jenkins

一些背景:

我有iOS应用程序,目标配置为运行unitTests.我在我的MacBook上运行构建自动化工具jenkins,它自动构建此应用程序并运行所有测试(使用命令行xcodebuild工具).

一切都运行良好的Xcode 4.这个构建自动化工具在不同的用户下运行,并运行所有这些测试.

我最近切换到Xcode 5,它开始失败,因为它无法启动模拟器.

问题

我有一个方案UnitTests配置为运行测试(逻辑测试).AI使用以下两种方法之一运行这些测试:

  • 在Xcode中命令U.

  • 或者命令行"/ usr/bin/xcodebuild -scheme UnitTests -sdk iphonesimulator -configuration Release clean build TEST_AFTER_BUILD = YES"

在这两种情况下,它都会尝试启动模拟器.但是,根据我的理解,它并不需要它.无论如何,它运行在顶级x86上,它看起来不像在Simulator上安装任何应用程序.

有没有办法摆脱这个讨厌的模拟器启动(因为它打破了我的构建自动化)?

更新1

似乎找到了非常相似的问题,但无法使其正常工作: 在Xcode 4中运行逻辑测试而不启动模拟器

更新2

我找到了非常相关和有趣的问题/答案:Apple CI/Xcode Service和Jenkins

rus*_*ord 27

使用xCode 7和xCtool.

xctool能够在没有模拟器的情况下执行单元测试.

要使这个工作,

1.更新目标设置以在没有主机应用的情况下运行

选择项目 - >然后测试目标 - >将主机应用程序设置为无.

在此输入图像描述

2.如果没有,请安装xctool.

brew install xctool
Run Code Online (Sandbox Code Playgroud)

3.使用带xctool的终端运行测试.

xctool -workspace yourWorkspace.xcworkspace -scheme yourScheme run-tests -sdk iphonesimulator
Run Code Online (Sandbox Code Playgroud)

  • 您可能会遇到测试包中不可用类的链接器错误,解决它们以使其正常工作。 (2认同)

Sal*_*ule 16

您可以创建Mac OSX单元测试而不是iOS单元测试.这要求您不要在单元测试中包含任何iOS特定库.您可以通过以下方式执行此操作:

  1. 选择项目 - >目标下拉菜单 - >"添加目标..."
  2. 选择"Mac OSX" - >"其他" - >"Cocoa Unit Testing Bundle"
  3. 像普通项目一样创建测试包

您现在可以将单元测试中的源添加到iOS测试中,而无需启动模拟器.

  • 这就是我现在正在移动的方向.但是,iOS和OS X并不完全相同的操作系统(特别是考虑到框架之间的所有差异) (2认同)

rfr*_*lli 14

我向苹果工程师提出了同样的问题.不幸的是,似乎你无法实现这一点并同时与iOS保持联系.有一些技巧可以检查是否测试.您可以将此代码段放在AppDelegate.h或其他全局类中,以表示不加载根视图控制器并防止任何wierdo ui破坏您的单元测试:

static BOOL isTesting() {
    BOOL isTesting = !isEmpty([[[NSProcessInfo processInfo] environment] objectForKey:@"XCInjectBundle"]);
    return isTesting;
}
Run Code Online (Sandbox Code Playgroud)

我还有一位苹果工程师证实这是一张合法的支票.并且在信用到期时给予信用,这来自:以编程方式确定iOS项目中的当前目标(运行或测试)

编辑: 我也有这个成功,它更直接:

static BOOL isTesting() {
    return [[[NSProcessInfo processInfo] processName] isEqualToString:@"xctest"];
}
Run Code Online (Sandbox Code Playgroud)


Lim*_*Red 7

osx 测试目标可能会成为一个巨大的麻烦,因为您必须自己管理要包含哪个源文件。放在@testable import YourAppNameXCTest 文件之上会更方便。因此,只需阻止您的应用程序在 XCTest 运行时启动即可。

在你的 AppDelegate 中输入:(Swift 3 解决方案)

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
{
    if ProcessInfo.processInfo.environment["XCInjectBundleInto"] != nil {
        return false
    } 

...
Run Code Online (Sandbox Code Playgroud)

这不会阻止模拟器启动,但会节省你很多时间。


归档时间:

查看次数:

19931 次

最近记录:

7 年 前