gpt4 book ai didi

xcode5 - 如何从SenTestingKit/OCUnit迁移到XCTest?

转载 作者:行者123 更新时间:2023-12-03 07:55:08 24 4
gpt4 key购买 nike

我正在将项目从Xcode 4.6.3迁移到Xcode 5.0.2。该项目的单元测试是使用SenTestingKit / OCUnit开发的。现在,当我在Xcode 5中运行测试时,我从RunUnitTests脚本中得到了一个错误,告诉我

RunUnitTests is obsolete.



可能与Xcode 5发行说明中的​​此说明相关:

SenTestingKit and OCUnit are deprecated. Use the migrator to move to XCTest.



不幸的是,我无法找到更多关于这个神秘的“移民”的信息。我的google-fu可能再次缺少,所以我的主要问题是:如何将单元测试从SenTestingKit / OCUnit迁移到新的XCTest(带有或不带有“migrator”)?

第二个问题是万一迁移是一项复杂的业务:是否可以使Xcode 5运行仍基于SenTestingKit / OCUnit的单元测试?毕竟,这些只是被弃用,因此它们仍然应该存在并且可以正常工作。

最佳答案

感谢Shaggy Frog的回答,我们知道Xcode发行说明中提到的神秘的“迁移器”是通过选择“编辑>重构>转换为XCTest”启动的向导。我将分两部分来介绍有关使用该向导的经验。第一部分是对主要问题的不完整答案,第二部分是对次要问题的回答。

第1部分:如何从OCUnit迁移到XCTest

您需要意识到的第一件事是,要使向导正常工作,您需要选择一个单元测试目标。如果选择了主要目标,则向导不会列出任何要转换的目标。

一旦知道了这一点,便可以逐步完成向导,但就我而言,最终结果仍然是一个惊人的失败!该向导声称不需要更改源代码,仅需要更新构 build 置即可迁移到XCTest。最后,该向导甚至没有设法正确地做到这一点:它确实删除了对SenTestingKit框架的引用,但是没有对XCTest框架进行引用。

无论如何,以下是由于向导无法为我进行手动更改的列表。如果该向导更适合您,则您可能不需要做所有这些事情。

  • 从单元测试目标
  • 中删除“运行脚本”构建阶段
  • 将所有测试用例类的基类从SenTestCase更改为XCTestCase
  • 将导入的 header 从<SenTestingKit/SenTestingKit.h>更改为<XCTest/XCTest.h>
  • 在测试目标的Build Settings中,将Wrapper Extension从octest更改为xctest
  • 将所有断言宏从ST*重命名为XCT*(例如STAssertTrue变为XCTAssertTrue)
  • 上面的异常(exception):STAssertEquals需要重命名为XCTAssertEqual(请注意末尾缺少的“s”)。如果收到以下编译器警告,就会知道您已经忘记了这一点:warning: implicit declaration of function 'XCTAssertEquals' is invalid in C99
  • 新的XCTest断言宏不允许将nil作为失败描述传递。例如,XCTAssertNotNil(anObject, nil)是不可能的,必须将其更改为XCTAssertNotNil(anObject)。当您遇到以下编译器错误时,您将知道存在此问题:error: called object type 'NSString *' is not a function or function pointer
  • 如果确实需要传递失败描述,则新的XCTest断言宏需要格式说明符使用常量表达式,就像NSString类方法stringWithFormat:一样。当您遇到以下编译器错误时,您将知道存在此问题:error: expected ')'。一些示例:

  • NSString* formatSpecifier = @"%@";
    NSString* failureDescription = @"foo";
    // These are OK
    XCTAssertNotNil(anObject, @"foo")
    XCTAssertNotNil(anObject, @"%@", failureDescription)
    // These are not OK
    XCTAssertNotNil(anObject, failureDescription);
    XCTAssertNotNil(anObject, formatSpecifier, failureDescription);

    最后但并非最不重要的一点是,如后文所述,需要将对XCTest框架的引用添加到单元测试目标中。如果您遇到链接器错误(例如 Undefined symbols for architecture i386: "_OBJC_CLASS_$_XCTestCase", referenced from: foo),您就会知道已经忘记了这一点。

    Xcode 6更新:Xcode 6中不再需要针对XCTest的链接(实际上XCTest甚至不再列为可用框架)。而是将构 build 置CLANG_ENABLE_MODULES设置为YES(在UI中显示为“Enable Modules(C和Objective-C)”)。这将导致 clang在看到 #import <XCTest/XCTest.h>语句时自动链接到XCTest。详细信息在 "Modules" section of the clang documentation中可用。

    第2部分:如何在Xcode 5中运行OCUnit测试

    此时,我遇到了一个链接器错误,使我意识到我迁移到XCTest的任务失败了。原因:XCTest不是SDK 6.1的一部分,但我仍在使用基础SDK iOS 6.1构建项目( this SO answer解释了如何将SDK 6.1集成到Xcode 5中)。

    由于无法继续进行迁移,因此,目前的解决方案是保持基于SenTestingKit / OCUnit的单元测试,直到我有时间将应用程序升级到iOS7。这是我必须要做的使单元测试运行:
  • 从单元测试目标中删除“运行脚本”构建阶段。这是在选择单元测试目标时使Xcode通过“测试”操作(action + U)执行单元测试所需要的。
  • 但是,这并不是理想的选择,因为我不想仅仅为了执行单元测试而切换目标。相反,我想在选择主要目标时执行单元测试。因此,第二步是修改主要目标的Xcode方案,以便当我运行“Test”操作时,将改为执行单元测试目标的测试。

  • 最终的解决方案不像Xcode 4.x那样好,因为每次我运行主要目标的“运行”或“构建”操作时,单元测试都会自动执行。不幸的是,如果没有“运行脚本”构建阶段,我似乎无法使其正常工作。

    关于xcode5 - 如何从SenTestingKit/OCUnit迁移到XCTest?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20022512/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com