Xcode项目如何以编程方式检测目标或如何使用env变量

时间:2011-08-06 03:53:00

标签: objective-c configuration xcode4 integration-testing

我想做一个应用程序测试,解析一些json,存储到核心数据,并读出一些对象。

我的代码如何知道它是作为测试或正常运行的一部分运行的?只是某种方式知道“我们是否在测试目标中”?因为应用程序启动它现在启动了一堆请求,用服务器中的信息填充我的coredata。我不希望它在我的测试中这样做。我想启动应用程序,从文件中读取HARDCODED json并使用与coredata相同的方法存储它,并验证结果。

如果有人可以解释如何在每个目标的基础上传递特定的键值对,可以从应用程序中读取,我会更高兴。

5 个答案:

答案 0 :(得分:34)

没关系......想出你在“方案”中设置了它。

例如,如果您希望TARGET = TEST在测试期间可用而TARGET = RUN在运行期间显示,则只需在Scheme>中设置它即可。环境变量>名称/值。

然后,您可以从您的应用中执行以下操作:

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

使用预处理器宏的构建设置DID不适用于我b / c我的测试目标(用于应用程序/集成测试)取决于我的主(非测试)目标,因此主要目标是首先构建的,这是运行的,并且你最终得到了主目标预处理器宏,即使你是在你运行的目标中定义的宏之后。如果我在这里遗漏了某些东西,请随时解释。

答案 1 :(得分:10)

如果“测试目标”是指您的单元测试(即Product > Test⌘U),则可以向目标添加预处理器宏并在代码中检查该宏。这允许类似以下内容:

#ifdef TEST
  // Load the hard-coded data.
#else
  // Load data from the server.
#endif

要执行此操作,请在项目导航器中单击项目文件,选择测试目标,单击Build Settings选项卡,搜索“宏”,双击Preprocessor Macros选项,然后添加一个!

答案 2 :(得分:6)

有两种情况需要处理:

  1. 如果选择了某个目标,例如Tests,则运行一些代码,
  2. 有条件#import某些目标的某些文件,例如Tests
  3. 测试目标的目标代码:

    ProjectName-Prefix.pch文件中创建一个宏,如下所示:

    #define IsTestTarget [[[[NSProcessInfo processInfo] environment][@"XCInjectBundle"] pathExtension] isEqualToString:@"xctest"]
    

    然后在应用中的任意位置调用它:

    if (IsTestTarget) {
        //Do something specific for test target;
    } else {
        //Otherwise do something else
    }
    

    条件#import

    选择#import目标后,若要Tests某些文件,您需要向Preprocessor Macro目标添加Test并将其用作:

    #ifdef APPTESTS
        #import "TestSpecificFile.h"
    #else
        #import "SomeOtherFile.h"
    #endif 
    

    以下是添加Preprocessor Macro的方法:

    enter image description here

答案 3 :(得分:5)

您可以使用以下功能。

+(BOOL)  isRunningTests
{
    NSDictionary* environment = [[NSProcessInfo processInfo] environment];
    NSString* injectBundle = environment[@"XCInjectBundle"];
    return [[injectBundle pathExtension] isEqualToString:@"xctest"];
}

答案 4 :(得分:0)

通常在单元测试中,程序员使用模拟类和功能。 您可以为测试目标创建一个目标成员资格的类。

@interface MockClass : NSObject

@end

Target Membership Screenshot

然后在应用程序代码中,您可以使用NSClassFromString函数检查类是否存在(对于未包含在类的目标成员资格中的目标,将返回Nil,在本例中为非测试目标。

if (NSClassFromString(@"MockClass")) {
    //Test Target
} else {
    //App Target
}

你可以诅咒它的功能

BOOL isUnitTest(){
    return NSClassFromString(@"MockClass") != Nil;
}