5

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

  • 通过测试导航器 > (+) ,
  • 将测试类的扩展名更改为.mm,
  • XCTest 框架添加到项目中。

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

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

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

将 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 ***
4

2 回答 2

5

原来这是一个命令行 C++ 项目,显然 XCTest 目前不支持。测试来自 Objective-C(++) 项目的 C++ 代码工作得很好..

只是希望在(不久的)将来的某个时候能够更好地记录 XCTest。

于 2013-10-06T13:42:09.853 回答
3

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

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

-创建的文件:main.c

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

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

如果您现在运行测试(通过 Product>Test 菜单项或 ⌘U),那么测试将失败(它应该会失败)。为简洁起见,我不会介绍 TDD 循环,而只是列出需要添加到不在 Objective-C 类中的测试函数的文件和内容。

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

int bar();

如果你想使用 XCTest 来测试一个函数,它不能在 main.c 中,所以将它添加到一个名为bar.c的新 C 源文件中。重要提示:添加文件时,必须将其添加到目标 foofooTests。如果您不将它添加到 fooTests 那么在编译测试时链接器将找不到该函数。

int bar() {
    return 0;
}

在 fooTests.m 中,添加包含:

#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 代码重复该过程。

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

于 2014-01-12T13:48:24.823 回答