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

jps*_*ain 29 configuration integration-testing objective-c xcode4

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

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

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

jps*_*ain 34

没关系......想通了你设置它的"方案".

例如,如果您希望TARGET = TEST在Test期间可用而TARGET = RUN在运行期间显示,只需在Scheme> Environment Variables> Name/Value中设置它即可.

然后从您的应用程序,你可以做:

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

使用预处理器宏的构建设置DID不适用于我b/c我的测试目标(用于应用程序/集成测试)取决于我的主(非测试)目标,因此首先构建主目标,然后运行,并结束即使您在运行的目标中定义的宏之后,也可以使用主目标预处理器宏.如果我在这里错过了什么,请随时解释一下.

  • 很棒的答案!次要添加:如果你使它成为`isTargetTest = YES`,那么你可以从`[[[[NSProcessInfo processInfo]环境] objectForKey:@"isTargetTest"]回读一个BOOL.BOOL可以直接在`if`语句中使用,而无需比较字符串 (4认同)
  • 这为我返回null (2认同)

Chr*_*ble 12

如果通过"测试目标"表示您的单元测试(即Product > Test?U),则可以向目标添加预处理器宏并在代码中检查该宏.这允许类似以下内容:

#ifdef TEST
  // Load the hard-coded data.
#else
  // Load data from the server.
#endif
Run Code Online (Sandbox Code Playgroud)

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


Yas*_* T. 6

有两种情况需要处理:

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

测试目标的目标代码:

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

#define IsTestTarget [[[[NSProcessInfo processInfo] environment][@"XCInjectBundle"] pathExtension] isEqualToString:@"xctest"]
Run Code Online (Sandbox Code Playgroud)

然后在应用程序中的任何位置调用它:

if (IsTestTarget) {
    //Do something specific for test target;
} else {
    //Otherwise do something else
}
Run Code Online (Sandbox Code Playgroud)

有条件的#import:

对于选择目标#import时的某些文件Tests,您需要将a添加Preprocessor MacroTest目标并将其用作:

#ifdef APPTESTS
    #import "TestSpecificFile.h"
#else
    #import "SomeOtherFile.h"
#endif 
Run Code Online (Sandbox Code Playgroud)

以下是如何添加Preprocessor Macro:

在此输入图像描述


muz*_*uzz 5

您可以使用以下功能.

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