以编程方式确定iOS项目中的当前目标(运行或测试)

fzf*_*fzf 16 testing ios

有没有办法以编程方式确定在开发iOS应用程序时是否在测试目标中运行代码与常规运行目标?

我有检查这个变量是否为零的黑客,因为它只在我的测试目标中,但这看起来非常h​​acky.

[[[NSProcessInfo processInfo] environment] objectForKey:@"XCInjectBundle"]
Run Code Online (Sandbox Code Playgroud)

小智 13

这些答案都没有真正帮助我.我希望我的应用程序知道我何时运行测试,其唯一目的是限制我的测试目标中的日志记录.当我没有记录一堆东西时,测试运行得更快.所以,我通过在我的方案的测试部分添加一个自定义参数来做到这一点:

Scheme截图

在我的应用程序代码中,我现在可以检查我是否正在测试:

- (void)logError:(NSError*)error{
    if([[[NSProcessInfo processInfo] arguments] containsObject:@"-FNTesting"])
        return;

    NSLog(@"LOG THE ERROR");
}
Run Code Online (Sandbox Code Playgroud)

感谢@cameronspickert成为我实际上可以找到如何使用自定义参数的唯一地方之一

http://cameronspickert.com/2014/02/18/custom-launch-arguments-and-environment-variables.html

  • 使用Host Application(现在是Xcode 7中的默认代码)测试代码后,接受的答案将不再有效.单元测试目标中的预处理器宏定义在应用程序代码中不可见(如AppDelegate).所以你必须求助于Launch Arguments或Environment Variables.我个人更喜欢env变种,因为`NSProcessInfo.processInfo().environment`是一个字典而不是来自`arguments`的数组. (2认同)

Apu*_*urv 10

您应该在目标设置中为"预处理器宏"定义适当的值.

在运行时,您可以用ifdef句子检查它.

  • 我可能会挑剔,但#ifdef永远不会检查/ runtime /; 这是一个预处理器命令. (10认同)