【问题标题】:Adding XCTest unit tests to existing app doesn't work将 XCTest 单元测试添加到现有应用程序不起作用
【发布时间】:2013-10-09 23:00:05
【问题描述】:

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

  • 通过 Test Navigator > (+)
  • 将测试类的扩展名改为.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 ***

【问题讨论】:

    标签: c++ xcode unit-testing xctest


    【解决方案1】:

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

    只是希望在(不久的)将来的某个时候能够提供更好的 XCTest 文档。

    【讨论】:

      【解决方案2】:

      我找不到任何有关使用 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 源文件中。重要提示:添加文件时,必须将其添加到目标 foo fooTests。如果你不将它添加到 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 代码重复该过程。

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

      【讨论】:

      • 我的问题不在于如何进行 TDD 或编写单元测试...如前所述,Xcode 不会执行测试用例(如果他们会失败)
      • 你不应该在你的测试目标中链接你的测试代码。相反,测试包在运行时注入到您的主目标包中。
      • "如果您不将它 [bar.c] 添加到 fooTests,那么在编译测试时,链接器将找不到该函数。"这是我能够测试一些我被绊倒的 C 代码的关键,这让我想到了这个问题。
      猜你喜欢
      • 2010-11-06
      • 2015-06-29
      • 2011-06-13
      • 1970-01-01
      • 2017-12-23
      • 1970-01-01
      • 2016-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多