使用 Swift 测试可执行文件

Kil*_*ian 6 xcode swift

我通过 Swift 创建了一个可执行文件,swift package init --type executable现在想为它编写一些测试。对于库包来说,这似乎根本不是问题,在这种情况下,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
Run Code Online (Sandbox Code Playgroud)

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

main.swift

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

print(foo())
Run Code Online (Sandbox Code Playgroud)

swifttestTests.swift

import Foundation
import XCTest
import swifttest

class SwifttestTests: XCTestCase {
    func testFoo() {
        XCTAssertEqual("bar", foo())
    }
}
Run Code Online (Sandbox Code Playgroud)

目录布局

.
??? Package.swift
??? Sources
?   ??? main.swift
??? Tests
    ??? swifttestTests
        ??? swifttestTests.swift
Run Code Online (Sandbox Code Playgroud)

Kil*_*ian 6

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

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

.
??? Package.swift
??? Sources
? ??? swifttest
? ? ??? main.swift
? ??? SwiftTestLib
?     ??? foo.swift
??? Tests
    ??? SwiftTestLibTests
        ??? SwiftTestLibTests.swift
Run Code Online (Sandbox Code Playgroud)

然而,这使得有必要在Package.swift.

import PackageDescription

let package = Package(
  name: "swifttest",
  targets: [
    Target(name: "swifttest", dependencies: ["SwiftTestLib"]),
    Target(name: "SwiftTestLib", dependencies: []),
  ],
  dependencies: []
)
Run Code Online (Sandbox Code Playgroud)

  • 我面临着与您相同的问题,不明白如何添加新模块,我尝试添加到主包中的每个包或框架都被神奇地删除了。 (2认同)