我怎么迁移SenTestingKit/OCUnit到XCTest?
题
我过程中的迁移我的项目从工业化4.6.3到低5.0.2开始.该项目的单元测试的开发与SenTestingKit/OCUnit.现在,当我正在运行测试模式5,我得到一个错误 RunUnitTests
脚本本告诉我
RunUnitTests是过时的。
可能是相关的是本说明的模式5版本说明:
SenTestingKit和OCUnit被废弃。使用迁移到移动到XCTest.
不幸的是,我没有能够找到更多关于这个神秘的"迁移".可能是我谷歌-fu是缺乏[再次],所以我的主要问题是:我怎么迁移单元的测试,从SenTestingKit/OCUnit新XCTest(有或没有"迁移")?
一个次要的问题,情况下移徙是一个复杂的业务:它是可能得到低5个运行单位测试中,仍然基于SenTestingKit/OCUnit?之后所有这些都仅仅是废弃,所以它们仍然应该是约和功能。
解决方案
感谢毛茸茸的青蛙的答案,我们知道神秘的"迁移"中提到的低版本说明是一个向导,发起了通过选择"编辑">"重构">"转换为XCTest".我要写关于我的经验这种导两个部分。第一部分是不完整的答复的主要问题,第二部分的答案,辅助的问题。
第1部分:如何迁移,从OCUnit到XCTest
第一件事情你需要知道的是,为向导工作,你需要 选择一个单元测试的目标.如果你有的主要目标选择,向导根本没有列出任何目标转换。
一旦我发现了这个,我能步骤通过的向导,但在我的情况的最终结果仍然是一个壮观的失败!向导权,没有来源的更改是必要的,只有建设需要更新迁移到XCTest.在结束,导甚至没有管理做是正确的:它的 有没有 除参考SenTestingKit框架,但它没有 不 放在一个参考XCTest框架。
不管怎样,下面是一个列表中的变化,我不得不手工作,因为向导的失败,使他们对我来说。如果导工作更好地为你,你可能不需要做所有这些事情。
- 删除"运行的脚本"构建阶段,从该单元的测试的目标
- 改变基类的所有测试的情况类
SenTestCase
要XCTestCase
- 改变的进口头
<SenTestingKit/SenTestingKit.h>
要<XCTest/XCTest.h>
- 在测试的目标是建立设置,改变包装纸的扩展从
octest
要xctest
. - 重命名的所有主张的宏
ST*
要XCT*
(例如STAssertTrue
变得XCTAssertTrue
) - 除上述:
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
.
模式6更新:联对XCTest不再需要的是在低6(事实上XCTest甚至不是列为一个提供了框架).而不是设置建设CLANG_ENABLE_MODULES为是(暴露在UI为"启用的模块(C的和目标-C)").这将引起 clang
自动链接的对XCTest时,看到一个 #import <XCTest/XCTest.h>
发言。详情可在 "模块"部分的文件铛.
第2部分:如何运行OCUnit试验在工业化5
在这一点上,我有个接头的错误,使我意识到我的任务迁移到XCTest失败了。其原因是:XCTest不是部分的SDK6.1,但我仍然建立自己的项目与基SDK iOS6.1(这样的回答 解释了如何将SDK6.1载5).
因为我无法继续移徙,我的解决方案的时刻,因此,要保持我的单元测试的基础上SenTestingKit/OCUnit,直到我找到的时间来提升我的应用程序iOS7.这是什么,我不得不这样做,以便获得该单元的测试,以运行:
- 删除"运行的脚本"构建阶段,从该单元的测试的目标。这是所有需要让模式的执行单位测试通过"测试"的行动(⌘ + U) 虽然该单元的测试的目标是选择.
- 这不是理想的,但是,因为我不想开关的目标只是执行单位测试。而不是我想要的执行单位测试 虽然主要目标是选择.第二步,因此修改的主要目标的工业化方案,以便当我运行"测试"的行动、单元测试的目标是测试的执行,而不是。
最终的解决方案是不如在模式4.x在该单元的测试都是自动执行的每一次,我跑的主要目标是"执行"或"建造"行动。不幸的是,似乎我不能让这个工作没有"运行的脚本"建立阶段。
其他提示
编辑->重构->转换为XCTest
OCUnit测试仍然可以工作,但是你可能会以及迁移。变化最终会相当小。