33

当我在 XCode 5 中运行测试时,我的 OS X 应用程序的主窗口会在运行测试时出现在屏幕上几秒钟。为什么?即使我取消注释所有测试,它仍然会打开我的主窗口。

4

7 回答 7

39

您正在运行应用程序测试,而不是逻辑测试。这意味着将启动您的应用程序实例,然后运行单元测试。这允许您执行一些需要您的应用程序正在运行的集成测试。

是设置应用程序测试和逻辑测试的指南。

如果您想将其更改为逻辑测试(因此它运行得更快并且不需要先启动您的应用程序):

  1. 去为你的单元测试目标构建设置
  2. 搜索Bundle
  3. 移除 Bundle Loader 和测试主机

在此处输入图像描述

于 2013-10-07T08:29:18.883 回答
10

没错,您必须从构建设置中删除“Bundle Loader”和“Test Host”。

但是您必须将必要的实现文件添加到您的单元测试目标中。必要的文件是您要在单元测试用例中使用的文件。您需要这样做,因为在逻辑测试中 XCode 不会编译整个应用程序。所以你的一些文件会丢失。

如果您遗漏了一个文件,这是一条错误消息:

Undefined symbols for architecture i386:
  "_OBJC_CLASS_$_Module", referenced from:
      objc-class-ref in Lobic Network.o
      objc-class-ref in Logic_Unit.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

您可以通过选择实现文件并打开文件检查器来添加丢失的文件。将有一个名为“目标成员资格”的部分,您还可以将文件目标成员资格设置为您的单元测试。

于 2013-10-31T10:04:35.933 回答
9

使用 XCTest,应用程序文件不需要包含在 XCTest 目标中XCTest 包与应用程序链接,使这些文件在运行时可用。

要完成这项工作,请确保在应用程序目标中将编译器选项“默认隐藏符号”设置为NO 。

为了清楚起见,这是一个带有屏幕截图的博客文章:http: //zmcartor.github.io/code/2014/02/24/slim-xctest-targets

这种方法的优点是测试目标的构建速度要快得多。

于 2014-03-07T15:57:53.080 回答
4

在 XCode 7 中,删除Host Application对我不起作用。事实上,我使用以下内容来避免应用程序运行。

  1. 设置测试方案参数 在此处输入图像描述

  2. main.m

    static bool isRunningTests()
    {
        NSDictionary* environment = [[NSProcessInfo processInfo] environment];
        NSString* testEnabled = environment[@"TEST_ENABLED"];
        return [testEnabled isEqualToString:@"YES"];
    }
    
  3. 修改 main()

    int main(int argc, char * argv[]) {
        @autoreleasepool {
            if (isRunningTests()) {
                return UIApplicationMain(argc, argv, nil, nil);
            } else {
                return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
            }
        }
    }
    
于 2016-08-25T10:35:41.560 回答
3

如果测试是针对可以在桌面和移动设备上运行的代码,您可以在没有模拟器的情况下运行它们或将它们托管在您的应用程序中。

问题是您不能使用常规目标(桌面或 iOS)的方案选择器来运行测试。

以下在 Xcode6 中对我有用。

File > New Target...

从 OS X 类别中选择 Cocoa Testing Bundle。

在此处输入图像描述

注意None从目标下拉列表中进行选择。

指定新的测试目标

单击完成。如上所述将相关文件添加到新目标。

现在创建一个方案来运行测试。

单击右上角的方案选择器并选择New Scheme...,单击下拉列表并向下导航到新目标。现在您可以从方案选择器中选择方案,并使用 ⌘U 运行测试。

在此处输入图像描述

于 2015-01-29T09:42:22.417 回答
1

在 XCode5 上,应用程序确实启动了。此答案显示了如何在运行单元测试时更改其委托,以便立即退出:https ://stackoverflow.com/a/20588035/239408

于 2014-04-20T15:42:10.950 回答
1

我只是在这上面浪费了一个上午。

项目是在 XCode 4 中创建并使用 SenTesting。

尝试在 XCode 5/XCTTest 上迁移测试

有同样的问题 - 应用程序在模拟器中运行,并且在尝试一切后测试从未开始(从应用程序更改为逻辑测试,更改为 XCTest,删除 SenTesting)

放弃了创建一个干净的 XCode 5 项目。

添加了我所有的文件并且测试运行正常。

Storyboard 可能仍然存在问题,因为它们是使用 XCode 4 构建的。

激烈,但它有效,所以保留它作为最后的手段。

于 2013-11-07T15:30:32.633 回答