52
50

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Swift のコードカバレッジ

Last updated at Posted at 2015-11-01

Swift2.0 になって、コードカバレッジが測定できるようになった。
C0 カバレッジしかとれないけど、それでも無いよりははるかにマシ。

コードカバレッジがないと、ユニットテストでどこまでカバーできているか分からないし、テストケースを書くモチベーションもなかなか上がらない。

以下は Xcode7.1 で確認した。

1. テスト対象

サンプルプロジェクトとして、SwiftCoverage を作る。テンプレートはなんでもいいけど、とりあえず iOS - Single View Application ということにしておく。

スクリーンショット 2015-10-28 0.31.20.png

これに User.swift を追加して、これをテスト対象とする。

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 がすでに存在するはずで、これを以下のように変更する。

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 を有効にする。

スクリーンショット 2015-11-01 1.06.07.png

4. テストの実行と測定結果

Product > Test もしくは Cmd-U からユニットテストを実行する。
(このサンプルではユニットテストが全て Pass するはず)

右メニューからリポートナビゲータを表示し、「Coverage」タブを選択すると、各ソースコード毎にカバレッジを確認することができる。
スクリーンショット 2015-11-02 0.51.32.png

さらに User.swift をダブルクリックすると該当コードに移動し、行ごとに実行したか or していないかを調べることができる。

スクリーンショット 2015-11-02 1.22.07.png

ここでは convenience init が全くテストされていないことがわかる。

5. テストの修正

先ほどの結果から、convenience initのテストケースが不足していることがわかるので、そこで、以下のように testInit() を追加する。

SwiftCoverageTests.swift
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% になっていることがわかる。

スクリーンショット 2015-11-02 1.08.33.png
52
50
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
52
50

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?