什么是对Objective-C代码进行单元测试的最佳方法?

333

有哪些用于单元测试Objective-C代码的框架?我想要一个与Apple Xcode很好集成的框架。


据我所知,这里的一些答案已经过时了。现在苹果公司有 XCTest 可以帮助你解决这个问题。我认为大多数答案需要更新。 - mfaani
17个回答

317

Xcode包含XCTest,它类似于OCUnit,是一个Objective-C单元测试框架,并且完全支持作为项目构建过程的一部分运行基于XCTest的单元测试。关于Xcode的单元测试支持,请参阅Xcode概述:使用单元测试

回到Xcode 2的时代,我写了一系列关于如何使用Xcode单元测试执行一些常见任务的博客文章:

尽管使用的是OCUnit而不是XCTest,但概念大致相同。

最后,我还写了一些有关如何为Cocoa用户界面编写测试的文章;由于Cocoa的结构相对简单,因此在大多数情况下,您不必旋转事件循环或执行任何其他操作。

这使得你不仅可以对模型级别的代码进行测试驱动开发,还可以对控制器级别甚至视图级别的代码进行测试驱动开发。


5
彼得·霍西也在12月份加利福尼亚州莱克福雷斯特的Cocoaheads会议上做了一次关于Cocoa单元测试的精彩演讲。以下是演讲视频链接:http://vimeo.com/2725498。 - Grant Limberg
1
大约一年前,当我开始学习iOS编程时,我发现OCUnit有一个严重的缺陷——我无法在模拟器或设备上运行它。虽然我没有再次核实过,但可能已经有所改变,但出于这个原因,我一直在使用GHUnit。 - drekka
1
这个主题有没有官方的苹果开发者视频?我看了2011年和2010年的WWDC,但没有找到...奇怪,因为测试很重要,不是吗? - Robert
4
Xcode单元测试指南链接已经移至Xcode单元测试指南,请注意更新。 - Steven Green
5
Xcode 5现在具有XCTest,它是否仍包括OCUnit?您会使用XCode 5的信息更新您的答案。 - BrightIntelDusk
如果您有足够的声望,应该能够更新它。Xcode 5继续包括OCUnit,我们在Xcode 6或Xcode 7中删除了它。但是我们有一个转换器,框架背后的概念仍然相同,至少我的一些博客文章(写于Xcode 2和3天)仍然存在。 - Chris Hanson

50

请查看由Gabriel Handford创建的GHUnit

"GHUnit的目标包括:

在XCode中运行单元测试,允许您充分利用XCode调试器。简单的图形界面帮助您可视化测试结果,并显示堆栈跟踪信息。能够作为框架(供Cocoa应用程序使用)进行安装,具有简单(或是不那么简单)的目标设置;或者可以轻松地打包到您的iPhone项目中。"


5
支持 GHUnit!我是 iPhone 开发的新手,可以诚实地说,相比起 OCUnit 和 GTM 的绝对噩梦和轻微的头痛,GHUnit 可以毫不费力地运行(指南很完美)。GHUnit 在可用性和易用性方面胜出! - Tim Reddy
3
请注意,此答案和相关评论是一段时间之前编写的。现在,Xcode对基于OCUnit的测试提供了更好的支持,使得设置测试并在调试器中运行它们变得非常容易。 - Kristopher Johnson
1
该项目已被弃用。 - BigHeadCreations

18

13

12

我知道这是一个老问题了,但如果你更喜欢BDD风格的测试(rspec、Jasmine等)而不是xUnit测试(Test::Unit、JSUnit、JUnit等),那么你可以考虑查看Cedar。Cedar将BDD风格的测试带到了Objective-C中,现在这种语言支持闭包。

我们在Pivotal Labs很高兴地为我们的iOS项目使用Cedar,并且我们正在积极地改进它。欢迎在cedar-discuss@googlegroups.com提出任何反馈或建议。


12
请注意,Google Toolbox for Mac(GTM)项目仅扩展/增强了苹果的SenTestingKit框架(本身基于OCUnit)。正如项目网站上所说:
GTM有几个增强功能,可让您进行UI单元测试、自动绑定单元测试、日志跟踪以及iPhone上的单元测试,以及用于对代码进行静态和动态测试的工具。
请注意以下关于用户界面测试的评论:
GTM对用户界面单元测试有广泛的支持。它支持测试几乎所有标准Cocoa / UIKit UI对象的成像和/或内部状态,并使您能够轻松地将此支持扩展到您自己的UI对象。
请参阅其“Code Verification and Unit Testing”页面,了解如何使用它的说明。

12
我得出结论,GHUnit是针对Objective-C最先进的测试框架。在我的博客上,我对测试框架进行了汇总。它在部署(iPhone、模拟器或Mac OS原生)和断言能力方面是最灵活的。因为它基于GTM,所以它继承了GTM相比SenTestingKit的所有优点,还添加了许多其他功能。另一个额外的好处是它正在被积极维护。
我进行了整合OCMock到GHUnit的努力,效果很好!你可以在GitHub上获取代码。

10

我建议使用覆盖率工具来查看哪些部分的代码已经被单元测试覆盖,哪些还没有。基本的行和分支代码覆盖率可以使用 GCOV 工具生成。如果你想生成漂亮的 HTML 覆盖率报告,可以使用 LCOVZCOV


7

7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接