使用Swift测试可执行文件

时间:2017-03-13 15:40:13

标签: swift xcode

我通过swift package init --type executable使用Swift创建了一个可执行文件,现在想为它编写一些测试。对于库包来说,这似乎根本不是问题,在这种情况下,Swift还会在Tests目录中填充一个测试模块,该模块可以通过swift test很好地运行。对于可执行文件,只创建一个空的Tests目录。

尝试从Xcode内部或通过swift test运行我的可执行文件的测试我遇到了链接器问题,但似乎指出Swift无法将main.swift的内容链接到试验。我不知道我能在这做什么。我已尝试在Xcode中玩游戏来创建要链接的新框架目标,但据我所知,swift test无论如何都不会选择这些目标。我也没有设法让它通过Xcode工作。以下是swift test的输出。

Compile Swift Module 'swifttest' (1 sources)
Linking ./.build/debug/swifttest
Compile Swift Module 'swifttestTests' (1 sources)
Linking ./.build/debug/swifttestPackageTests.xctest/Contents/MacOS/swifttestPackageTests
Undefined symbols for architecture x86_64:
  "__TF9swifttest3fooFT_SS", referenced from:
      __TFFC14swifttestTests14SwifttestTests7testFooFT_T_u0_KzT_SS in swifttestTests.swift.o
ld: symbol(s) not found for architecture x86_64
<unknown>:0: error: link command failed with exit code 1 (use -v to see invocation)
<unknown>:0: error: build had 1 command failures
error: exit(1): /Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-build-tool -f /Users/kilian/Desktop/swifttest/.build/debug.yaml test

这些是我的文件内容供参考。这是一个最小的示例项目。

main.swift

public func foo() -> String {
    return "bar"
}

print(foo())

swifttestTests.swift

import Foundation
import XCTest
import swifttest

class SwifttestTests: XCTestCase {
    func testFoo() {
        XCTAssertEqual("bar", foo())
    }
}

目录布局

.
├── Package.swift
├── Sources
│   └── main.swift
└── Tests
    └── swifttestTests
        └── swifttestTests.swift

1 个答案:

答案 0 :(得分:3)

虽然不完全是无法测试可执行文件的解决方案,但我知道了一种解决方法。基本思想是将或多或少的所有内容移动到同一项目中的第二个模块中,并将可执行目标最小化为对入口函数的调用。

遵循给定示例的基本结构如下所示:

Package.swift

这使得有必要在import PackageDescription let package = Package( name: "swifttest", targets: [ Target(name: "swifttest", dependencies: ["SwiftTestLib"]), Target(name: "SwiftTestLib", dependencies: []), ], dependencies: [] ) 中指定目标。

{{1}}