使用 Xcode 的单元测试框架,应用程序代码是不是可以确定它是不是作为单元测试运行?

Posted

技术标签:

【中文标题】使用 Xcode 的单元测试框架,应用程序代码是不是可以确定它是不是作为单元测试运行?【英文标题】:Using Xcode's unit-testing framework, can application code determine whether it is being run as unit test?使用 Xcode 的单元测试框架,应用程序代码是否可以确定它是否作为单元测试运行? 【发布时间】:2013-04-15 18:26:38 【问题描述】:

使用Xcode提供的内置测试框架,有没有办法让应用程序代码判断它是否正在由测试运行器运行,而不是作为应用程序运行?

换句话说,我想知道是否可以在应用程序代码中做这样的事情:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    // ...

    if (IsUnitTestRunning()) 
        [self useDefaultSettings];
        [self showDefaultViewController];
    
    else 
        [self restoreUserSettings];
        [self restoreUserInterface];
    

    // ...

我知道我可以创建一个新配置来定义一些预编译器宏并设置 Xcode 方案以在运行测试时构建和使用该配置,或者我可以在运行测试时将我的应用程序中的某种全局变量设置为 YES ,但我想知道 OCUnit 或 Xcode 中是否已经内置了一些东西来处理这个问题。

【问题讨论】:

【参考方案1】:

在 Macintosh 上,有一种方法可以在调试期间从 Xcode 传递一些选项,使其变为“int main(argc, argv)”。

我怀疑 ios 端也有类似的功能。您应该能够捕获通过“int main(argc, argv)”传入的选项。

这里是您在 Xcode 方面进行修改的地方:

另一个选项可能是查看通过“didFinishLaunchingWithOptions:”传入的选项字典,看看从 Xcode 启动与在设备或模拟器上启动它(不从 Xcode 启动)是否有什么不同。

【讨论】:

main() 中捕获内容和/或设置环境变量确实适用于 iOS。另请参阅此处的最佳答案:***.com/questions/7274711/…。 (我找不到任何方法来设置 options 字典的内容,但这并不是我真正想做的。)

以上是关于使用 Xcode 的单元测试框架,应用程序代码是不是可以确定它是不是作为单元测试运行?的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C 是不是有任何基于非 Xcode 的命令行单元测试工具?

实体框架是不是有内存提供程序?

我是不是需要在需要时手动将每个 *.m 文件添加到我的单元测试目标?

IOS-使用XCODE自带的单元测试UnitTest

iOS 单元测试- Xcode 7测试工具XCTest学习

iOS 应用程序的 Xcode 单元测试中的链接问题与嵌入式 C++ 代码