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

时间:2013-01-11 04:31:27

标签: ios testing

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

我有检查这个变量是否为零的黑客,因为它只在我的测试目标中,但这看起来很糟糕。

[[[NSProcessInfo processInfo] environment] objectForKey:@"XCInjectBundle"]

9 个答案:

答案 0 :(得分:13)

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

Scheme Screenshot

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

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

    NSLog(@"LOG THE ERROR");
}

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

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

答案 1 :(得分:10)

您应该在目标设置中为“预处理器宏”定义正确的值。

在运行时,您可以使用ifdef句子进行检查。

答案 2 :(得分:4)

现在我们只需用一行代码检查一下" UITesting "。

[[[NSProcessInfo processInfo] arguments] containsObject:@"-ui_testing"]
仅在测试应用时才会出现

-ui_testing

答案 3 :(得分:3)

谢谢!它有助于。这是关于swift的一些例子:

func isRunningTests() -> Bool {

    var arguments = NSProcessInfo.processInfo().arguments as! [String]
    println("arguments ===\(arguments)")

    let testArgs = arguments.filter({ $0 == "-FNTesting" })
    if !testArgs.isEmpty {
        return true
    }

     return false
}

答案 4 :(得分:3)

在Xcode 7.3上测试

NSProcessInfo上创建一个类别。

@implementation NSProcessInfo (RunningTests)

- (BOOL)ag_isRunningTests {
  return ([self.environment objectForKey:@"XCTestConfigurationFilePath"] != nil);
}

@end

答案 5 :(得分:2)

在Xcode 6中,您可以检查环境变量中XPC_SERVICE_NAME的值,以查看模拟器是否正在运行测试或直接运行应用程序。

直接运行变量时会有类似UIKitApplication:com.twitter.FabricSampleApp[0xb9f8]

的内容

运行单元测试时,它将如下所示:com.apple.xpc.launchd.oneshot.0x10000008.xctest

+ (BOOL)isRunningUnitTests {
    NSString *XPCServiceName = [NSProcessInfo processInfo].environment[@"XPC_SERVICE_NAME"];
    BOOL isTesting = ([XPCServiceName rangeOfString:@"xctest"].location != NSNotFound);

    return isTesting;
}

答案 6 :(得分:1)

谢谢@ steven-hepting,你的回答帮助我指出了解决问题的正确方向。

但是当您在单元测试中使用“主机应用程序”时,“XPC_SERVICE_NAME”将返回与正常应用程序启动相同的字符串(显然)。所以你的检查并不总是有效。这就是为什么我还要检查TestBundleLocation。使用Xcode 7.2(7C68)进行测试。

+ (BOOL)isRunningUnitTests {
    NSDictionary<NSString *, NSString *> *env = [NSProcessInfo processInfo].environment;

    // Library tests
    NSString *envValue = env[@"XPC_SERVICE_NAME"];
    BOOL isTesting = (envValue && [envValue rangeOfString:@"xctest"].location != NSNotFound);
    if (isTesting) {
        return YES;
    }

    // App tests
    // XPC_SERVICE_NAME will return the same string as normal app start when unit test is executed using "Host Application"
    // --> check for "TestBundleLocation" instead
    envValue = env[@"TestBundleLocation"];
    isTesting = (envValue && [envValue rangeOfString:@"xctest"].location != NSNotFound);
    return isTesting;
}

答案 7 :(得分:0)

在项目设置中,在“信息”选项卡上,创建一个新配置(除了默认的“调试”和“发布”)。然后,您将能够在每个配置的基础上在目标设置(在“构建设置”选项卡上)中定义不同的预处理器宏。 XCode已经使用它为Debug配置添加“DEBUG = 1”,这允许您在代码中使用“#ifdef DEBUG”。 您可以通过这种方式添加任何其他您喜欢的宏,例如“TESTING = 1”。

答案 8 :(得分:0)

这对我有用

  #if Debug_MyTarget_Shortcut_name
    //My_Target_Codes
  #else
    //My_Other_Target_Codes
  #endif

在构建设置中 - &gt;自定义标志,您应该为目标添加您的快捷方式名称