【问题标题】:How can I run XCTest for a swift application from the command line?如何从命令行为 swift 应用程序运行 XCTest?
【发布时间】:2014-08-06 13:24:07
【问题描述】:

如果可能,我想从命令行使用 XCTest 来测试一些 Swift 示例。

import XCTest

class LeapTest : XCTestCase {

    func testVanillaLeapYear() {
      let year = Year(calendarYear: 1996)
      XCTAssertTrue(year.isLeapYear);
    }
}

我很想从命令行运行它。

我已经将 Xcode 设置为使用 beta 中的开发者工具:

sudo xcode-select -s /Applications/Xcode6-Beta.app/Contents/Developer/

如果我天真地尝试运行它,它会像这样

$ xcrun swift LeapTest.swift
LeapTest.swift:1:8: error: cannot load underlying module for 'XCTest'
import XCTest
       ^

有什么方法可以直接从 CLI 运行它?还是我必须创建一个 Xcode 项目?

【问题讨论】:

  • 我在我的 Xcode 项目中遇到了同样的错误,所以我认为这不会解决它。
  • 测试文件必须只属于测试目标,不能属于主项目目标。
  • 你如何改变它以便发生这种情况?
  • 接受答案,它是正确的!

标签: swift xctest


【解决方案1】:

我认为问题在于您的 test.swift 文件位于主项目的目标成员资格下。确保您的 swift 测试文件仅属于 Test 目标。

【讨论】:

  • 所以它需要是一个 Xcode 项目,对吧?我试图像任何其他带有测试的 CLI 脚本一样运行它(例如 python、ruby 等)
  • 只是看看它是否对其他人有帮助:对我有用的是将测试文件设置为属于测试目标,并且您正在测试的类也应该设置为属于测试目标作为项目目标。
  • @JohnPaulAshenfelter 我的错误,您可以参考上面亚当的回答从 CLI 运行 LeapTest.swift。您必须将框架搜索路径添加到 xcrun swift:xcrun swift -F /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks LeapTest.swift
  • 虽然如果您遵循创建测试目标 (developer.apple.com/library/prerelease/ios/recipes/…) 的工作流程,XCode 会为您解决链接问题,但应该有一种方法可以手动解决链接问题,以便您可以进行单元测试随心所欲。
【解决方案2】:

我能够使用以下命令编译您的 XCTestCase:

swiftc \
-F/Applications/Xcode6-Beta5.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks \
-Xlinker -rpath -Xlinker /Applications/Xcode6-Beta5.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks \
-lswiftCore LeapTest.swift \
-o LeapTests

然后你可以用xctest执行测试:

xcrun xctest LeapTests

分解那些swiftc 命令行选项:

  1. -F... 将 XCTest.framework 添加到框架搜索路径中,使其能够从 Swift 导入
  2. -Xlinker -rpath ... 确保在加载时可以找到 XCTest 共享库
  3. 没有明确指定-lswiftCore,我发现xctest在尝试运行测试套件时会崩溃

希望有帮助!

【讨论】:

  • 非常有帮助,谢谢!不过,在这种情况下,如何组合两个或多个 swift 文件?或者,如果 LeapTest 导入另一个类,我如何告诉它该类在哪里?
  • @Metaphox 也许试试*.swift,或者只是在命令行列出所有文件名?
  • 是的,我试过了...但是,假设我有 foo.swift 和 bar.swift,我尝试从 bar 导入 foo,我会收到错误“bar.swift:3:8 : 错误: 没有这样的模块 'foo'"。
  • @Metaphox 在这种情况下它们实际上应该在同一个模块中,所以我猜没有必要import
  • @Metaphox 搞定了!这是一个示例项目,如果有帮助,请告诉我:github.com/sharplet/minimal-swift
猜你喜欢
  • 1970-01-01
  • 2018-06-24
  • 2013-11-28
  • 1970-01-01
  • 2016-05-12
  • 2020-06-13
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多