将XCTest单元测试添加到现有应用程序不起作用

时间:2013-10-03 09:46:14

标签: c++ xcode unit-testing xctest

我已将测试(XCTests)添加到Xcode 5中的现有C ++命令行应用程序

  • via Test Navigator> (+)
  • 将测试类的扩展名更改为.mm
  • XCTest框架添加到项目中。

所有编译都很好。现在运行测试只会给我一个“测试失败”消息,控制台中没有任何内容,导航器中既没有绿灯也没有红灯(即没有执行测试)。

从一个全新的Xcode 5项目开始,并将测试类的扩展名更改为.mm只是工作正常,所以我认为它不仅仅是在XCTest中缺乏对Objective-C ++的支持。

即使在现有C ++项目中添加了普通的vanilla测试目标,测试也会在运行之前失败。

在将XCTests添加到现有(Objective-)C ++目标时需要注意什么?

更新#1

使用Xcode 5.0.2(在10.8.5上)xctest现在在同一场景中崩溃

*** NSTask: Task create for path '/Users/XXX/Library/Developer/Xcode/DerivedData/RM_Next_Gen-gpihzjouhxvifqcslmywktktizer/Build/Products/Debug/YYY Tests.xctest/Contents/MacOS/YYY Tests' failed: 22, "Invalid argument".  Terminating temporary process.
objc[3478]: GC: forcing GC OFF because OBJC_DISABLE_GC is set
*** multi-threaded process forked ***

2 个答案:

答案 0 :(得分:4)

原来这是一个命令行C ++项目,显然目前XCTest不支持。从Objective-C(++)项目测试C ++代码就可以了。

希望在(近)未来的某个时刻更好地记录XCTest。

答案 1 :(得分:3)

我找不到任何关于使用XCTest来测试非Objective C(C / C ++)代码的文档。我想测试命令行C项目,我担心你的答案表明Xcode不支持这样做。我是XCTest和TDD的新手,但我认为其他人可能会欣赏我发现的东西。

我创建了一个新项目>命令行工具,基于C.项目称为 foo ; Xcode默认也会调用目标 foo

- 创建的文件:main.c

转到Test Navigator>添加测试目标(+)>新的测试目标。调用目标 fooTests 。 Xcode将在其中创建此目标和示例测试(所有文件都在名为fooTests.m的文件中)。示例测试将被称为testExample,它将包含以下测试函数:

- (void)testExample
{
    XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__);
}

如果您现在运行测试(从产品>测试菜单项或⌘U),测试将失败(它应该)。为了简洁起见,我不会完成TDD循环,只需列出需要添加到不在Objective-C类中的测试函数的文件和内容。

假设我们有一个我们想要测试的函数,名为 bar(),并从main.c调用。转到项目文件资源管理器并添加一个名为bar.h的新头文件。添加函数原型:

int bar();

如果要使用XCTest测试函数,则不能在main.c中,因此将其添加到名为 bar.c 的新C源文件中。重要提示:添加文件时,必须将其添加到目标foo fooTests 。如果你没有将它添加到fooTests,那么在编译测试时,链接器将找不到该函数。

int bar() {
    return 0;
}

在fooTests.m中,添加include:

#include "bar.h"

您现在可以在测试中引用bar.h中包含的任何函数。现在创建2个单元测试,一个将失败,另一个将通过。

删除方法testExample并替换为以下代码:

- (void)testBarWillFail
{
    int rc = bar();
    XCTAssertTrue(rc == -1, @"Expected rc==-1, rc==%d", rc);
}

- (void)testBarWillPass
{
    int rc = bar();
    XCTAssertTrue(rc == 0, @"Expected rc==0, rc==%d", rc);
}

运行测试将在调试窗口中生成以下内容:

Test Suite 'All tests' finished at 2014-01-12 13:38:45 +0000.
Executed 2 tests, with 1 failure (0 unexpected) in 0.000 

在“问题导航器”窗格中,您将看到:

file: /foo/fooTests/fooTests.m: test failure: -[fooTests testBarWillFail] failed: ((rc == -1) is true) failed - Expected rc==-1, rc==0

这一切都符合预期!使用您要测试的所有其他C代码重复此过程。

如果有人知道更好的方法,那么我很高兴听到它!