Swift2.0 になって、コードカバレッジが測定できるようになった。
C0 カバレッジしかとれないけど、それでも無いよりははるかにマシ。
コードカバレッジがないと、ユニットテストでどこまでカバーできているか分からないし、テストケースを書くモチベーションもなかなか上がらない。
以下は Xcode7.1 で確認した。
1. テスト対象
サンプルプロジェクトとして、SwiftCoverage
を作る。テンプレートはなんでもいいけど、とりあえず iOS - Single View Application ということにしておく。

これに User.swift
を追加して、これをテスト対象とする。
import Foundation
class User {
var lastName: String = ""
var firstName: String = ""
init() {
self.lastName = ""
self.firstName = ""
}
init (lastName: String, firstName: String) {
self.lastName = lastName
self.firstName = firstName
}
func getFullName() -> String {
return "\(firstName) \(lastName)"
}
}
2. ユニットテストを記述する
SwiftCoverageTests/SwiftCoverageTests.swift がすでに存在するはずで、これを以下のように変更する。
import XCTest
@testable import SwiftCoverage
class SwiftCoverageTests: XCTestCase {
func testGetFullName() {
let user = User()
user.lastName = "YAMADA"
user.firstName = "Taro"
XCTAssertEqual(user.getFullName(), "Taro YAMADA")
}
}
3. カバレッジの有効化
カバレッジを測定するためには、スキームを編集する必要がある。これは次のようにする。
Product > Scheme > Edit Scheme...
を開き、"Test" を選択する。
そして、Gather coverage data
を有効にする。

4. テストの実行と測定結果
Product > Test
もしくは Cmd-U からユニットテストを実行する。
(このサンプルではユニットテストが全て Pass するはず)
右メニューからリポートナビゲータを表示し、「Coverage」タブを選択すると、各ソースコード毎にカバレッジを確認することができる。
さらに User.swift
をダブルクリックすると該当コードに移動し、行ごとに実行したか or していないかを調べることができる。

ここでは convenience init が全くテストされていないことがわかる。
5. テストの修正
先ほどの結果から、convenience initのテストケースが不足していることがわかるので、そこで、以下のように testInit()
を追加する。
import XCTest
@testable import SwiftCoverage
class SwiftCoverageTests: XCTestCase {
func testInit() {
let user = User(lastName: "YAMADA", firstName: "Hanako")
XCTAssertEqual(user.getFullName(), "Hanako YAMADA")
}
func testGetFullName() {
let user = User()
user.lastName = "YAMADA"
user.firstName = "Taro"
XCTAssertEqual(user.getFullName(), "Taro YAMADA")
}
}
そして、もう一度ユニットテストを実行し、カバレッジを確認すると、今度は 100% になっていることがわかる。
