Xcode:TEST vs DEBUG预处理器宏

ma1*_*w28 35 debugging xcode unit-testing buildconfiguration

在使用单元测试创​​建新项目时,Xcode将构建配置设置为Test for Test方案(与Run方案相同).

我应该区分Run(Command-R)和Test(Command-U)方案吗?

即,我应该创建一个名为Test的新构建配置,向它添加预处理器宏TEST = 1,并将其用作测试方案的构建配置吗?或者,我应该将Run&Test作为Debug进行保存吗?

我来自Ruby/Rails背景,您通常拥有测试,开发和生产环境.在我看来,Debug就像开发一样,Release就像生产一样,但是我们错过了一个测试,这就是我认为添加Test可能有意义的原因.

评论?意见?建议?

我特意问这个,因为我想为Test编译一些东西:

#ifdef TEST
// Do something when I test.
#endif
Run Code Online (Sandbox Code Playgroud)

如果我也为Debug编译它,我认为这不重要.所以,我真的可以做到:

#ifdef DEBUG
// Do something when I run or test.
#endif
Run Code Online (Sandbox Code Playgroud)

但是,我真的只打算在现在进行测试.所以,这就是为什么我认为我应该区分调试和测试,但我想知道为什么Xcode默认不为你做那个?Apple认为你不应该区分它们吗?

Rob*_*ert 30

预处理器宏不起作用,您需要在运行时检查环境.

static BOOL isRunningTests(void)
{
    NSDictionary* environment = [[NSProcessInfo processInfo] environment];
    return (environment[@"XCTestConfigurationFilePath"] != nil);
}
Run Code Online (Sandbox Code Playgroud)

(针对Xcode 7.3更新)

  • 此环境变量未在 Xcode 7.3.1 中设置 (2认同)

Dav*_*vid 28

您可以考虑添加新的构建配置.

在xcode 4中,单击左侧导航器上的项目.

在主窗口中,单击您的项目,然后选择"信息"选项卡.

单击"+"按钮添加新配置(如果您愿意,可以将您的"测试"称为"测试").

现在,单击目标,然后转到构建设置选项卡.

搜索"预处理器宏"

在这里,您可以为新的构建配置添加预处理器宏.

只需双击新的"测试"配置,然后添加TESTING = 1.

最后,编辑您的构建方案.选择方案的测试选项.应该有一个"Build Configuration"下拉菜单.选择"测试"配置.

  • 如果您希望预处理器宏不仅可以在测试代码中使用,而且还可以在常规应用程序中使用,那么这是迄今为止最好的方法.比使用辅助方法的其他解决方案更清洁.仍然可以在Xcode6中完美运行 (3认同)
  • 如果您正在使用Cocoapods,请确保在创建新的构建配置后运行`pod install`. (3认同)

ma1*_*w28 24

我没有创建测试构建配置,而是:

  1. 创建了一个Tests-Prefix.pch文件:

    #define TEST 1
    #import <SenTestingKit/SenTestingKit.h>
    #import "CocoaPlant-Prefix.pch"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在测试目标的构建设置的前缀标题字段中输入其路径.

  3. 将以下代码添加到我创建的调用文件的顶部MyAppDefines.h,导入MyApp-Prefix.pch:

    #ifdef TEST
    #define TEST_CLASS NSClassFromString(@"AppDelegateTests") // any test class
    #define BUNDLE [NSBundle bundleForClass:TEST_CLASS]
    #define APP_NAME @"Tests"
    #else
    #define BUNDLE [NSBundle mainBundle]
    #define APP_NAME [[BUNDLE infoDictionary] objectForKey:(NSString *)kCFBundleNameKey]
    #endif
    
    Run Code Online (Sandbox Code Playgroud)

这允许我使用BUNDLE我的意思,[NSBundle mainBundle]并在运行测试时使其工作.

导入SenTestingKit Tests-Prefix.pch还可以加快SenTestingKit Framework的编译速度,并允许我#import <SenTestingKit/SenTestingKit.h>从所有测试文件的顶部省略.

  • 将#define TEST 1添加到我的单元测试目标预处理器宏会在执行单元测试代码中设置宏,但不会在正在进行单元测试的应用程序的代码中.知道我怎么能做到这一点? (13认同)
  • 面对与@shawnwall相同的问题:编译应用程序时,TEST变量不在编译器的上下文中.它只是在编译测试用例本身时. (3认同)
  • 你们有没有想过这个?有同样的问题. (2认同)

foc*_*ess 16

我决定在代码本身中添加一个环境变量检查,而不是使用Robert提出的isRunningTests()建议.

  1. 编辑当前的Scheme(产品/方案/编辑方案)或Command + <
  2. 单击"测试配置"
  3. 单击Arguments取消选中"使用Run操作的参数和环境变量"
  4. 展开"环境变量"部分,并添加值为YES的变量TESTING
  5. 将其添加到您的代码中,并在需要时调用:
 + (BOOL) isTesting
    {
        NSDictionary* environment = [[NSProcessInfo processInfo] environment];
        return [environment objectForKey:@"TESTING"] != nil;
    }
Run Code Online (Sandbox Code Playgroud)

完成后,屏幕应如下所示.

屏幕应如下所示

在测试模式或应用程序模式下运行时,上面的代码将找到TESTING环境变量.此代码在您的应用程序中,而不是单元测试文件.您可以使用

#ifdef DEBUG
...
#endif
Run Code Online (Sandbox Code Playgroud)

防止代码在生产中执行.


Hou*_*man 5

Robert在SWIFT 3.0中的回答:

func isRunningTests() -> Bool {
    let environment = ProcessInfo().environment
    return (environment["XCInjectBundleInto"] != nil);
}
Run Code Online (Sandbox Code Playgroud)


uca*_*tit 5

如果您创建一个测试构建配置,然后将目标的“其他 Swift 标志”属性设置为“-DTEST”,它将定义一个可以在您的 Swift 代码中工作的 TEST 宏。确保在 App 目标的构建设置中设置它,以便您可以在 App 的 Swift 代码中使用它。

DEBUG 和 TEST 的其他 Swift 标志设置

然后使用这个集合,你可以像这样测试你的代码:

func testMacro() {
   #if !TEST 
       // skipping over this block of code for unit tests
   #endif
}
Run Code Online (Sandbox Code Playgroud)