Xcode7 では Command Line Tool プロジェクトを除き、デフォルトで Unit test target が生成されます。 参照:コマンドラインツールプロジェクトでテストの準備をする。 テストを書くためには Unit test targetから Main target のコードが使用できる必要があります。
Swift で書かれたコードをテストするためには下記2つの作業を行います。
- プロジェクトファイル
.xcodeproj
の "defines module" をYES
に設定します。
- Xcode で対象のプロジェクトを開き、"Build Settings" の "Defines Modules" の 項目を "Yes" にします。
- 各テストファイルで
@testable import YourAppModuleName
を追記します。 追記することで public, internal のシンボルにアクセスできるようになります。private
シンボルはアクセスできないままです。
// MyAppTests.swift
import XCTest
@testable import MyModule
class MyClassTests: XCTestCase {
// ...
}
Swift のファイルを Test target に含める、という方法もありますが、不具合を引き起こす(subtle, hard-to-diagnose errors) ことがあるためお勧めしません。
- Bridging header を test target に追加します。
- Bridging header 内で テストしたいコードを import します。
// MyAppTests-BridgingHeader.h
#import "MyClass.h"
これで MyClass.h
のコードを Swift のテストコードから使用できるようになります。
- テストしたい Swift のクラスと関数に
@objc
属性を付加します。 - テストコードで Module の Swift header を import します。
@import XCTest;
#import "MyModule-Swift.h"
@interface MyClassTests: XCTestCase
// ...
@end
テストコード内でテスト対象を import します。
// MyAppTests.m
@import XCTest;
#import "MyClass.h"
@interface MyClassTests: XCTestCase
// ...
@end
- プロジェクトのペインからターゲットを追加(+ボタンを押下)
- "OS X Unit Testing Bundle" または "iOS Unit Testing Bundle" を選択
- Main target で "Edit the scheme" を選択
- "Test" を選択, "Info" タブで "+" をクリックして追加した testing bundle を選択