2018年5月20日日曜日

Swift でユニットテストを書こう

概要

今までずっと逃げていたのでとりあえずテストする方法を勉強しました
まずは超かんたんなクラスのユニットテストから書いてみます

環境

  • macOS 10.13.4
  • Xcode 9.3.1 (9E501)

事前準備

プロジェクトを作成しましょう
今回は test という名前のプロジェクトとして進めていきます
プロジェクトは Single View Application として作成しました
今回は単純なクラスのテストなので、SpriteKit でも同じようにできると思います

テスト対象のクラスを作成

こんな感じで Swift ファイルを追加しましょう
UIViewController を継承した UI 専用のクラスではなくモデルとして管理するクラスを作成しました

class Person {
    var name = ""
    var height: Double = 0
    var weight: Double = 0

    init(_ name: String, _ height: Double, _ weight: Double) {
        self.name = name
        self.height = height
        self.weight = weight
    }

    func hi() -> String {
        return "Hi. I'm \(self.name)."
    }

    func bmi() -> Double {
        // 小数点 2 桁目で切り上げ
        let val = self.weight / (self.height / 100 * self.height / 100) * 100
        return val.rounded() / 100
    }
}

このコードをテストしてみます

テストを記載する

テストを記載します
プロジェクトを作成した際の雛形をベースにしています
記載するファイルは testTests.swift になります
swift_unit_test3.png

setUp, tearDown は特に何もしていませんが残しています
追加したのは testHItestBMI になります
命名規則としてテストメソッドは testXXX と先頭に test を付与する必要があります

import XCTest
@testable import test

class testTests: XCTestCase {

    override func setUp() {
        super.setUp()
    }

    override func tearDown() {
        super.tearDown()
    }

    func testHi() {
        let p = Person("taro", 160, 55)
        let ret = p.hi()
        XCTAssertEqual(ret, "Hi. I'm \(p.name).")
    }

    func testBMI() {
        let p = Person("hanako", 140, 40)
        let ret = p.bmi()
        XCTAssertEqual(ret, 20.41)
    }
}

XCT ほげほげでいろいろなアサートが用意されています
公式に Boolean 用のアサート、nil チェックのアサート、比較用のアサートなどアサートごとに使うメソッドが紹介されているのでテストに合わせて必要なアサートを使い分けると良いと思います

テストを実行する

テストが書けたら実行しましょう
Product -> Test でテストを実行できます
swift_unit_test1.png

今回の方法だと UI のテストも実行されてしまうのでシミュレータも起動してしまいます
少しだけ時間がかかりますが待ちましょう

テストが終了すると左メニューの項目からテスト結果を確認することができます
swift_unit_test2.png

コンソールにテスト結果が表示されます
デフォルトだと各テストにかかった時間が表示されます
またログはファイルにも保存してくれるようです

Test Suite 'All tests' started at 2018-05-14 15:02:42.270
Test Suite 'testTests.xctest' started at 2018-05-14 15:02:42.272
Test Suite 'testTests' started at 2018-05-14 15:02:42.273
Test Case '-[testTests.testTests testBMI]' started.
Test Case '-[testTests.testTests testBMI]' passed (0.010 seconds).
Test Case '-[testTests.testTests testHi]' started.
Test Case '-[testTests.testTests testHi]' passed (0.011 seconds).
Test Suite 'testTests' passed at 2018-05-14 15:02:42.298.
     Executed 2 tests, with 0 failures (0 unexpected) in 0.021 (0.025) seconds
Test Suite 'testTests.xctest' passed at 2018-05-14 15:02:42.299.
     Executed 2 tests, with 0 failures (0 unexpected) in 0.021 (0.027) seconds
Test Suite 'All tests' passed at 2018-05-14 15:02:42.302.
     Executed 2 tests, with 0 failures (0 unexpected) in 0.021 (0.032) seconds


Test session log:
    /var/folders/r1/x8tl35cx1mqfhjc2j_3xrmh40000gn/T/com.apple.dt.XCTest/IDETestRunSession-31D0CEE0-D0A5-4341-BCA6-6BD00BCA3D43/testTests-3E0BE5CC-A327-4694-A38A-F00135FE1DEB/Session-testTests-2018-05-14_150213-m3n24r.log

こんな感じでユニットテストを書くことができます

最後に

Swift で Xcode を使ってユニットテストを作成してみました
さすがにユニットテストは他の言語などと同じように書けました
次回は UI のテストを行う方法を紹介したいと思います

参考サイト

0 件のコメント:

コメントを投稿