[SwiftPM] Swift Package のテスト

SwiftPackageManagerEyeCatch

Xcode では、ユニットテストのテンプレートも作ってくれます。
Swift Package として作ったテストの使い方を確認してみました。
確認環境
Xcode12.0 で確認しました。

通常プロジェクトと Swift Package の違い

Xcode で Swift Package を作っても、Xcode のプロジェクトファイル(*.xcodeproj) は作ってくれません。

Xcode で Swift Package を開くには、生成された Package.swift を使って開く必要があります。

テストコード

生成された Swift Package には、最初からテストのテンプレートも含まれています。

テストテンプレート

import XCTest
@testable import SwiftPackageForTest

final class SwiftPackageForTestTests: XCTestCase {
    func testExample() {
        // This is an example of a functional test case.
        // Use XCTAssert and related functions to verify your tests produce the correct
        // results.
        XCTAssertEqual(SwiftPackageForTest().text, "Hello, World!")
    }

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

Swift Package の仕組みを使ったテスト実行

コマンドラインからの実行

テストを実行するためには、コマンドラインで以下のようにします。

コード
% cd (Package.swiftのディレクトリ)
% swift test
user@mac SwiftPackageForTest % swift test
[6/6] Linking SwiftPackageForTestPackageTests
Test Suite 'All tests' started at 2020-09-18 13:21:35.562
Test Suite 'SwiftPackageForTestPackageTests.xctest' started at 2020-09-18 13:21:35.562
Test Suite 'SwiftPackageForTestTests' started at 2020-09-18 13:21:35.562
Test Case '-[SwiftPackageForTestTests.SwiftPackageForTestTests testExample]' started.
Test Case '-[SwiftPackageForTestTests.SwiftPackageForTestTests testExample]' passed (0.105 seconds).
Test Suite 'SwiftPackageForTestTests' passed at 2020-09-18 13:21:35.668.
	 Executed 1 test, with 0 failures (0 unexpected) in 0.105 (0.106) seconds
Test Suite 'SwiftPackageForTestPackageTests.xctest' passed at 2020-09-18 13:21:35.668.
	 Executed 1 test, with 0 failures (0 unexpected) in 0.105 (0.106) seconds
Test Suite 'All tests' passed at 2020-09-18 13:21:35.668.
	 Executed 1 test, with 0 failures (0 unexpected) in 0.105 (0.106) seconds
user@mac SwiftPackageForTest % 

なお、この方法では、テストするアーキテクチャを指定することができません。

つまり、Xcode を動かしている Mac というアーキテクチャ上でのテストしか行えません。例えば、iOS 向けのライブラリには使えないと言うことです。

Xcode の仕組みを使ったテスト実行

Xcode 上からの実行

⌘+U で実行されます。これは、通常プロジェクトのユニットテスト実行と同じキー割り当てです。

Debug Area に結果が表示されます。

このときには、Xcode で選択しているターゲットアーキテクチャ上でのテストが行われます。

コマンドラインからの実行

以下のように、ターゲットを指定して実行することもできました。

コード
% cd (Package.swiftのディレクトリ)
// % xcodebuild -scheme (scheme名) test -destination "(ターゲット名)"
% xcodebuild -scheme SwiftPackageForTest test -destination "name=iPhone 8"
Command line invocation:
    /Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -scheme SwiftPackageForTest test -destination "name=iPhone 8"

Resolve Package Graph

Resolved source packages:
  SwiftPackageForTest: /Users/tyagishi/dev/github/SwiftPackageForTest


note: Using new build system
(Snip)
Testing started
2020-09-18 13:36:45.678 xcodebuild[35162:1862779]  IDETestOperationsObserverDebug: Writing diagnostic log for test session to:
/Users/usr/Library/Developer/Xcode/DerivedData/SwiftPackageForTest-gqqrdehhmlfmnzhlajoktqmqqdyy/Logs/Test/Test-SwiftPackageForTest-2020.09.18_13-36-38-+0900.xcresult/Staging/1_Test/Diagnostics/SwiftPackageForTestTests-1B97EE33-657F-4D21-BC6C-723D467BD637/SwiftPackageForTestTests-8BC9CB2C-08C8-44E4-A20F-24EE963DBB73/Session-SwiftPackageForTestTests-2020-09-18_133645-vTfamV.log
2020-09-18 13:36:45.678 xcodebuild[35162:1862717] [MT] IDETestOperationsObserverDebug: (6EA1B20E-77CC-4241-8BB7-CBB95B064E8D) Beginning test session SwiftPackageForTestTests-6EA1B20E-77CC-4241-8BB7-CBB95B064E8D at 2020-09-18 13:36:45.679 with Xcode 12A7209 on target  {
		SimDevice: iPhone 8 (F52AB5B8-7F92-47BE-B52F-1BD7BA1C1771, iOS 14.0, Shutdown)
} (14.0 (18A372))
2020-09-18 13:37:03.560 xcodebuild[35162:1862717] [MT] IDETestOperationsObserverDebug: (6EA1B20E-77CC-4241-8BB7-CBB95B064E8D) Finished requesting crash reports. Continuing with testing.
Test Suite 'All tests' started at 2020-09-18 13:37:06.288
Test Suite 'SwiftPackageForTestTests.xctest' started at 2020-09-18 13:37:06.289
Test Suite 'SwiftPackageForTestTests' started at 2020-09-18 13:37:06.290
Test Case '-[SwiftPackageForTestTests.SwiftPackageForTestTests testExample]' started.
Test Case '-[SwiftPackageForTestTests.SwiftPackageForTestTests testExample]' passed (0.003 seconds).
Test Suite 'SwiftPackageForTestTests' passed at 2020-09-18 13:37:06.295.
	 Executed 1 test, with 0 failures (0 unexpected) in 0.003 (0.005) seconds
Test Suite 'SwiftPackageForTestTests.xctest' passed at 2020-09-18 13:37:06.296.
	 Executed 1 test, with 0 failures (0 unexpected) in 0.003 (0.006) seconds
Test Suite 'All tests' passed at 2020-09-18 13:37:06.296.
	 Executed 1 test, with 0 failures (0 unexpected) in 0.003 (0.008) seconds
2020-09-18 13:37:06.566 xcodebuild[35162:1862717] [MT] IDETestOperationsObserverDebug: 20.893 elapsed -- Testing started completed.
2020-09-18 13:37:06.566 xcodebuild[35162:1862717] [MT] IDETestOperationsObserverDebug: 0.000 sec, +0.000 sec -- start
2020-09-18 13:37:06.566 xcodebuild[35162:1862717] [MT] IDETestOperationsObserverDebug: 20.893 sec, +20.893 sec -- end

Test session results, code coverage, and logs:
	/Users/usr/Library/Developer/Xcode/DerivedData/SwiftPackageForTest-gqqrdehhmlfmnzhlajoktqmqqdyy/Logs/Test/Test-SwiftPackageForTest-2020.09.18_13-36-38-+0900.xcresult

** TEST SUCCEEDED **

この方法では、destination の箇所でターゲットのアーキテクチャを指定してテストすることができます。

まとめ:Swift Package のテスト実行方法

Swift Package のテスト実行方法を改めて説明してみました。

Swift Package のテスト方法
  • (コマンドライン上) % swift test でテスト実行 // ターゲットアーキテクチャ指定できない
  • (Xcode 上) ⌘+U でテスト実行
  • (コマンドライン上) % xcodebuild -scheme (scheme名) test -destination "(ターゲット名)"

Swift Package の仕組みだけではなく、Xcode が用意している仕組みでしかテストできないケースもあるので、必要に応じて使い分ける必要がありそうです。

説明は以上です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です