Swift Test传递参数

时间:2018-08-17 10:10:16

标签: swift

有人知道如何为快速测试提供命令行参数吗?

我尝试过: swift test "myDBName"

但是我遇到了意外的参数错误。

可能的参数列表为:

OVERVIEW: Build and run tests

USAGE: swift test [options]

OPTIONS:
  --build-path            Specify build/cache directory [default: ./.build]
  --chdir, -C             Change working directory before any other operation
  --color                 Specify color mode (auto|always|never) [default: auto]
  --configuration, -c     Build with configuration (debug|release) [default: debug]
  --enable-prefetching    Enable prefetching in resolver
  --list-tests, -l        Lists test methods in specifier format
  --parallel              Run the tests in parallel.
  --skip-build            Skip building the test target
  --specifier, -s         Run a specific test class or method, Format: <test-module>.<test-case> or <test-module>.<test-case>/<test>
  --verbose, -v           Increase verbosity of informational output
  -Xcc                    Pass flag through to all C compiler invocations
  -Xlinker                Pass flag through to all linker invocations
  -Xswiftc                Pass flag through to all Swift compiler invocations
  --help                  Display available options

还有其他方法可以传递args吗? (环境变量等?)

2 个答案:

答案 0 :(得分:6)

实际上,您可以使用环境来实现它。

具有以下内容的测试:

final class HelloTests: XCTestCase {
    func testExample() {
        XCTAssertEqual(String(cString: getenv("SOMETHING")), "else")
    }

    static var allTests = [
        ("testExample", testExample),
    ]
}

使用swift命令行将成功:

SOMETHING=else swift test

答案 1 :(得分:3)

(OP的问题中未明确提及,但是swift test指的是Swift Package Manager的测试工具;下面的答案也是如此)

Swift Package Manager测试工具不支持传递或参数

如果我们将测试工具{{1}的--help和运行工具swift test的运行进行比较,您可能会注意到前者的USAGE语法不允许将参数传递给测试工具包装的二进制文件,这是后者的功能:

swift run

如果我们访问源代码,其中$ swift test --help OVERVIEW: Build and run tests USAGE: swift test [options] ... $ swift run --help OVERVIEW: Build and run an executable product USAGE: swift run [options] [executable [arguments ...]] ... 代表SwiftRunTool binds the command line arguments,而ArgumentParser for SwiftTestTool does not则可以验证这一点。

如果您认为这可能是有用的功能,请查看Swift Package Manager at GitHub的支持页面,以获取有关如何提出新功能/错误修复的说明。

使用条件编译标志

为了完整性(除了利用环境),可以根据条件使用条件编译标志,并且可能就足够了。

在通过命令行启动测试时,这没有提供实际值,但是您可以使用Swift编译器ArgumentParser使用条件编译标志(true / false)给Swift编译器swiftc -D标志。

例如,以下测试将通过:

import XCTest

#if USE_LOCALHOST
let server_ip = "127.0.0.1"
#else
let server_ip = "1.2.3.4"
#endif

final class HelloTests: XCTestCase {
    func testExample() {
        XCTAssertEqual(server_ip, "127.0.0.1")
    }

    static var allTests = [
        ("testExample", testExample),
    ]
}

如果使用以下方法启动了测试套件:

$ swift test -Xswiftc -DUSE_LOCALHOST

如果使用以下命令启动,则测试将失败:

$ swift test