单元测试和 TDD、OCUnit 与 Google 工具箱

Posted

技术标签:

【中文标题】单元测试和 TDD、OCUnit 与 Google 工具箱【英文标题】:Unit testing and TDD, OCUnit vs Google Tool Box 【发布时间】:2009-12-14 17:34:44 【问题描述】:

我正在尝试在 OCUnit 和 Google Tool Box 之间进行选择,您有什么偏好,会推荐其中一个,为什么? 我很想听听您对这两种方法中的任何一种的体验。

我遇到的主要问题是测试方法中的崩溃管理(例如:BAD ACCESS) 他们都无法告诉我坠机发生在哪个班级!!!

使用 Google Tool Box,我可以看到正在运行的测试套件,但看不到测试用例(当您的测试套件有 50 个测试用例时,您应该怎么做?)

使用 OCUnit,我至少可以看到哪个测试套件中的哪个测试用例导致了崩溃。

这是我对 GTB 的信息:

Executed 0 tests, with 0 failures (0 unexpected) in 0.000 (0.000) seconds

Test Suite 'LogicTests' started at 2009-12-14 18:03:15 +0100

 /Users/admin/Documents/Tests/GTBTest/RunIPhoneUnitTest.sh: line 122:   688    Segmentation fault      "$TARGET_BUILD_DIR/$EXECUTABLE_PATH" -RegisterForSystemEvents

 Command /bin/sh failed with exit code 139

我可以看到它是导致崩溃的测试套件“LogicTests”,但仅此而已。

对于 OCunit,这里是相同错误的消息:

Test Suite 'LogicTests' started at 2009-12-14 17:51:26 +0100
Test Case '-[LogicTests testFail]' started.
/Developer/Tools/RunPlatformUnitTests.include: line 415:   536 Segmentation fault      "$THIN_TEST_RIG" "$OTHER_TEST_FLAGS" "$TEST_BUNDLE_PATH"

至少使用 OCUnit,我可以跟踪正在运行的测试用例并最终对其进行调试(但如果没有任何类和行号信息,这可能需要很长时间......)

你如何处理这些问题?

提前致谢。

PS:这里是重现问题的方法,很简单:

只需创建一个类,其方法在调用时会崩溃(在您执行 TDD 时会一直发生):

- (void) crashMethod 
 NSMutableArray *crashArray;
 [crashArray addObject:[NSObject new]];

然后创建一个调用这个方法的测试用例:

- (void) testFail 
    ClassToTest *test = [[ClassToTest alloc] init];
 [test crashMethod];
 [test release];
 

提前致谢, 文森特

【问题讨论】:

【参考方案1】:

我想我还是会选择 GTB..

对于 xCode 3.2 OCUnit,代码中不会显示错误和警告。 似乎这是一个已知问题: lhttp://osdir.com/ml/xcode-users/2009-10/msg00216.html

使用 GTB 可以正常工作。 我不敢相信,但似乎 GTB 与新版本的 xCode 集成比 OCUnit 更好......

单元测试的调试不需要任何东西,它从一开始就很好用。 (使用 xCode 你需要一堆设置: http://chanson.livejournal.com/119578.html

使用 GTB,您可以在设备上运行测试,并且拥有用于 UI 测试的工具(似乎您可以创建一个虚假的 UIView 层次结构,然后将其与运行时的内容进行比较)。我对 UI 自动测试(昂贵且难以维护)持怀疑态度,但这是一个不错的功能!

http://code.google.com/p/google-toolbox-for-mac/wiki/CodeVerificationAndUnitTesting

【讨论】:

@user142764:那你如何用 GTB 调试单元测试呢?您确定还需要自定义可执行文件吗? 不,这就是 GTB 的优点:因为您使用普通目标来运行测试,所以您可以调试它!只需编写一个测试,在里面放一个断点,然后从菜单中执行 Run->Debug 即可:您正在逐步调试您的测试。【参考方案2】:

顺便说一句,Google 工具箱现在会打印测试用例启动消息,以防有人想知道 ;-)

【讨论】:

以上是关于单元测试和 TDD、OCUnit 与 Google 工具箱的主要内容,如果未能解决你的问题,请参考以下文章

iOS 测试/规范 TDD/BDD 和集成与验收测试

TDD与单元测试[已结束]

使用 OCUnit 进行单元测试时的 NSBundle 返回(空)

饮食、睡眠和呼吸单元测试/TDD/BDD [关闭]

如何在单元测试(OCUnit)中访问 NSDocumentDirectory

OCUnit/XCode 单元测试的优秀测试运行器